Ho problemi a far funzionare TPROXY con Squid e IPv6 su un server CentOS 7. In precedenza utilizzavo una configurazione di intercettazione generica con NAT, ma era limitata solo a IPv4. Sto espandendo l'installazione per includere IPv6 con TPROXY.
Ho usato l'articolo wiki ufficiale di Squid sull'argomento per configurare tutto:
http://wiki.squid-cache.org/Features/Tproxy4
Finora la configurazione TPROXY sembra funzionare per IPv4 senza problemi. Con IPv6, tuttavia, le connessioni stanno scadendo e non funzionano correttamente. Analizzerò l'installazione per una migliore comprensione.
Nota: tutte le regole di firewall e routing sono esattamente le stesse per IPv4, l'unica differenza è inet6
e ip6tables
per la configurazione delle regole basate su IPv6 negli esempi seguenti.
- Sistema operativo e kernel: CentOS 7 (3.10.0-229.14.1.el7.x86_64)
- Tutti i pacchetti sono aggiornati secondo lo yum
- Versione Squid: 3.3.8 (anche provato 3.5.9)
- Firewall: iptables / ip6tables 1.4.21
- libcap-2.22-8.el7.x86_64
La connettività IPv6 è attualmente attraverso un tunnel 6in4 tramite Hurricane Electric, configurata sul router DD-WRT e quindi il prefisso assegnato delegato ai client tramite radvd
. La casella Squid ha diversi indirizzi IPv6 statici configurati.
La casella Squid si trova all'interno della LAN principale che sta servendo. I client che ricevono traffico sulla porta 80 intercettata (principalmente client wireless) vengono trasferiti nella casella Squid tramite il mio router DD-WRT con le seguenti regole firewall e di routing, adattate dall'articolo wiki Policy Routing e wiki DD-WRT
- http://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute
http://www.dd-wrt.com/wiki/index.php/Squid_Transparent_Proxy
ip6tables -t mangle -A PREROUTING -i "$CLIENTIFACE" -s "$PROXY_IPV6" -p tcp --dport 80 -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 ip6tables -t filter -A FORWARD -i "$CLIENTIFACE" -o "$CLIENTIFACE" -p tcp --dport 80 -j ACCEPT ip -f inet6 rule add fwmark $FWMARK table 2 ip -f inet6 route add default via "$PROXY_IPV6" dev "$CLIENTIFACE" table 2
Questo sembra funzionare correttamente in termini di passaggio del traffico alla casella Squid. Un'ulteriore regola che ho dovuto aggiungere sul router DD-WRT in aggiunta a quanto sopra era una regola di eccezione per gli indirizzi IPv4 e IPv6 in uscita configurati sulla casella Squid, altrimenti ho un problema di loop folle e il traffico viene interrotto per tutti i client, tra cui la LAN principale che utilizza Squid 3128
.
ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT
Nella casella Squid sto quindi usando le seguenti regole di routing e la catena DIVERT per gestire il traffico di conseguenza. Avevo bisogno di aggiungere ulteriori regole per prevenire eventuali errori con la catena già esistente durante i test. Il mio firewall è CSF
, ho aggiunto quanto segue acsfpre.sh
ip -f inet6 route flush table 100
ip -f inet6 rule del fwmark 1 lookup 100
ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129
squid.conf
è configurato per due porte:
http_proxy 3128
http_proxy 3129 tproxy
Inoltre sto usando anche Privoxy e ho dovuto aggiungere no-tproxy
alla mia linea cache_peer, altrimenti non è stato possibile inoltrare tutto il traffico per entrambi i protocolli.
cache_peer localhost parent 8118 7 no-tproxy no-query no-digest
Non sto usando alcuna tcp_outgoing_address
direttiva a causa di Privoxy, invece controllo gli indirizzi in uscita tramite CentOS e l'ordine di bind.
valori sysctl:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0
Non sono sicuro se le rp_filter
modifiche sono necessarie poiché l'installazione funziona su IPv4 con o senza di esse e produce lo stesso risultato per IPv6.
SELINUX
SELINUX è abilitato sulla casella Squid, ma i criteri sono stati configurati per consentire l'installazione TPROXY, quindi non viene bloccato (il funzionamento di IPv4 lo mostra comunque). Ho verificato grep squid /var/log/audit/audit.log | audit2allow -a
e ricevuto<no matches>
#============= squid_t ==============
#!!!! This avc is allowed in the current policy
allow squid_t self:capability net_admin;
#!!!! This avc is allowed in the current policy
allow squid_t self:capability2 block_suspend;
#!!!! This avc is allowed in the current policy
allow squid_t unreserved_port_t:tcp_socket name_connect;
Ho anche impostato i seguenti booleani:
setsebool squid_connect_any 1
setsebool squid_use_tproxy 1
Connettività IPv6 interrotta
In definitiva, la connettività IPv6 è completamente interrotta per i client TPROXY (i client LAN sulla porta 3128
che utilizzano un file WPAD / PAC hanno IPv6 perfettamente funzionante). Mentre sembra che il traffico venga indirizzato in qualche modo alla casella Squid, nessuna richiesta su IPv6 tramite TPROXY appare nel access.log
. Tutto IPv6 richiede sia letterale IPv6 che DNS, timeout. Posso accedere ai client IPv6 interni, ma anche questo traffico non viene registrato.
Ho fatto alcuni test usando test-ipv6.com e ho scoperto che ha rilevato il mio indirizzo IPv6 Squid in uscita, ma i test IPv6 hanno mostrato come cattivo / lento o timeout. Ho temporaneamente abilitato l'intestazione via e ho scoperto che l'intestazione HTTP Squid era visibile, quindi il traffico arriva almeno alla casella Squid ma non viene instradato correttamente una volta che è lì.
Ho provato a farlo funzionare per un po 'di tempo e non riesco a trovare il problema, ho persino chiesto sulla mailing list di Squid, ma non sono stato in grado di diagnosticare il problema reale o risolverlo. Sulla base dei miei test, sono abbastanza sicuro che sia una delle seguenti aree e il riquadro Squid il problema:
- Routing
- nocciolo
- Firewall
Tutte le idee e i passaggi aggiuntivi che posso prendere per far funzionare TPROXY e IPv6 sarebbero molto apprezzati!
Informazioni aggiuntive
regole ip6tables:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DIVERT tcp ::/0 ::/0 socket
TPROXY tcp ::/0 ::/0 tcp dpt:80 TPROXY redirect :::3129 mark 0x1/0x1
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain DIVERT (1 references)
target prot opt source destination
MARK all ::/0 ::/0 MARK set 0x1
ACCEPT all ::/0 ::/0
Tabella di routing IPv6 (prefisso oscurato)
unreachable ::/96 dev lo metric 1024 error -101
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -101
2001:470:xxxx:xxx::5 dev eno1 metric 0
cache mtu 1480
2001:470:xxxx:xxx:b451:9577:fb7d:6f2d dev eno1 metric 0
cache
2001:470:xxxx:xxx::/64 dev eno1 proto kernel metric 256
unreachable 2002:a00::/24 dev lo metric 1024 error -101
unreachable 2002:7f00::/24 dev lo metric 1024 error -101
unreachable 2002:a9fe::/32 dev lo metric 1024 error -101
unreachable 2002:ac10::/28 dev lo metric 1024 error -101
unreachable 2002:c0a8::/32 dev lo metric 1024 error -101
unreachable 2002:e000::/19 dev lo metric 1024 error -101
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -101
fe80::/64 dev eno1 proto kernel metric 256
default via 2001:470:xxxx:xxxx::1 dev eno1 metric 1