Squid 3.3 Proxy IPv4 e IPv6 trasparente con TPROXY


1

Sto tentando di cambiare la mia configurazione di Squid trasparente dall'uso di NAT generico limitato solo a IPv4 e passando a TPROXY, per il supporto di IPv6. Ho difficoltà a far funzionare i client trasparenti con la nuova configurazione, tuttavia tutte le richieste vengono soddisfatte con i calamari che generano il seguente errore su tutte le richieste:

"L'URL richiesto non può essere recuperato"

Sembrerebbe che ci sia un problema di routing da qualche parte, ma non sono sicuro di cosa sia sbagliato.

Sto usando iptablese ip6tablessul mio router DD-WRT e Squid Proxy insieme iproute2a fare le parti di routing su entrambi i lati.

Per impostazione predefinita, sembra che il ip6table_manglemodulo non sia caricato di default su DD-WRT, ma sia stato compilato nella build in esecuzione sul mio router:

find /lib/modules -name "*.ko" | grep -i mangle
/lib/modules/3.10.89/ip6table_mangle.ko

Caricato il modulo e aggiunto allo script di avvio per gli stivali futuri:

insmod ip6table_mangle

Informazioni di routing DD-WRT:

# Squid transparent proxy
PROXY_IPV4="192.168.x.x"
PROXY_IPV6="xxxx:xxxx:xxxx:xxxx::x"
CLIENTIFACE=br0
FWMARK=3

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV4 -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV6 -j ACCEPT

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
iptables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
ip6tables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT

iptables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT

ip rule add fwmark $FWMARK table 2
ip -6 rule add fwmark $FWMARK table 2
ip route add default via $PROXY_IPV4 table 2
ip -6 route add default via $PROXY_IPV6 table 2

# End Squid intercept proxy config

Instradamento del proxy Squid (sul server stesso):

iptables -F -t mangle
iptables -X -t mangle
ip6tables -F -t mangle
ip6tables -X -t mangle
iptables -t mangle -N DIVERT
ip6tables -t mangle -N DIVERT

iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip -f inet rule add fwmark 1 lookup 100
ip -f inet route add local default dev eno1 table 100

ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100

calamari conf:

http_port 3129 tproxy

configurazione sysctl:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0

eno1è l'interfaccia Ethernet principale che ho anche provato a utilizzare losenza successo.

Il traffico viene passato alla casella Squid, quindi sembra che il router stia facendo il suo lavoro. È quando il traffico finisce nella casella Squid dove sembra che stia andando storto. Tutte le richieste vengono registrate ma restituiscono 500 errori.

Per quanto ne so, la mia configurazione supporta TPROXY:

  • CentOS 7
  • Calamari 3.3.8 (EPEL)
  • iptables / ip6tables 1.4.21
  • Kernel Linux 3.10
  • libcap 2.22

Ho usato queste fonti come guida, ma non riesco a ottenere una configurazione funzionante.

Qualche consiglio su quale potrebbe essere il problema o eseguire il debug ulteriormente?

Risposte:


1

Si scopre che tutto è stato impostato correttamente. Qual era il vero problema era la mia direttiva cache_peer per Privoxy. L'errore generato è in realtà Squid che dice che non può trasferire il traffico a Privoxy. Questo perché l'installazione di tproxy la confonde.

Per evitarlo devi aggiungere no-tproxyalla riga cache_peer

cache_peer hostname parent 8118 7 no-tproxy ...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.