Far funzionare Squid e TPROXY con IPv6 su CentOS 7


18

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 è inet6e ip6tablesper 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

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-tproxyalla 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_addressdirettiva 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_filtermodifiche 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 -ae 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 3128che 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

Ho provato ad aggiornare a una versione successiva di Squid (3.5), per escludere eventuali bug / problemi di rilascio, ma il problema rimane.
James White,

1
Solo commentando per dire che ho funzionato circa un anno fa su una scatola CentOS 6. Tuttavia, improvvisamente ha smesso di funzionare un giorno (dopo un aggiornamento del kernel credo) e da allora non sono riuscito a farlo funzionare. Se abilito la configurazione IPv6 TPROXY, sostanzialmente interrompe tutto il traffico della porta 80 e nulla raggiunge i calamari. Per il momento mi sono arreso. Il kernel che sto attualmente eseguendo è 2.6.32 - noto che su wiki.squid-cache.org/Features/Tproxy4 , elencano una versione minima del kernel 2.6.37, quindi ne sono già a corto. Se mai lo avessi scoperto, aggiornerò qui con i miei risultati.
Parkamark,

Quindi ho finalmente funzionato. Il problema era che la porta "intercetta" di IPv4 era uguale alla porta "tproxy" di IPv6 in squid.conf - questo è dettagliato nella documentazione, ma pensavo di poter fare a meno di non farlo perché avevo queste porte in ascolto indirizzi / stack specifici insieme alla porta, quindi non esiste un motivo specifico per cui dovrebbero essere in conflitto, giusto? Bene, questa sembra essere una presunzione falsa. Continua a leggere ...
Parkamark

Avevo definito "http_port 192.168.0.1:3128 intercetta" e "http_port [fd00 :: 2]: 3128 tproxy" in squid.conf - non farlo! Deve essere semplicemente "http_port 3128 intercettazione" e "http_port 3129 tproxy". Non è possibile associare la porta tproxy IPv6 a un indirizzo IPv6 specifico e quindi attendere che tutto il firewall / routing magic funzioni. Puoi specificare solo le porte, il che significa che squid si legherà a tutti gli indirizzi / interfacce su queste porte. Aggiungerò le regole del firewall per bloccare queste porte aperte come richiesto.
Parkamark,

Risposte:


1

Mi rendo conto che questo è vecchio e non ho una risposta completa a me stesso, ma sto facendo qualcosa di molto simile a te e ho sintomi quasi identici.

Primo: test-ipv6.com sembra essersi aggiornato un po 'di recente per essere in grado di gestire un nuovo tipo di errore (è stato risolto all'inizio di quest'anno). Prova di nuovo.

Nel mio caso, mi ha inviato a un URL che descrive un problema che mi sembra avere: Path MTU Detection FAQ . Forniscono un URL che è possibile utilizzare con cURL per eseguire un test PMTUD e quindi è possibile controllare il traffico utilizzando tpcdumpo WireShark.

Quando il traffico viene effettuato tramite TPROXY su Squid, il rilevamento MTU Path IPv6 non funziona completamente sull'host. (Sto ancora lavorando sul perché non funziona sul mio host, quindi non ho una soluzione definitiva).

Una breve descrizione:

  • ICMP è estremamente importante in IPv6. Molte persone vogliono bloccare l'ICMP e finiscono per causare più danni che benefici.
  • Se un pacchetto è "troppo grande" per la tua connessione, il pacchetto viene eliminato e un messaggio ICMP tipo 2 ("Pacchetto troppo grande") dovrebbe essere inviato al server di origine, chiedendogli di ridurre la dimensione del pacchetto e inviarlo nuovamente.
  • Se il messaggio ICMP non arriva al server, il server continua a inviare nuovamente il pacchetto di grandi dimensioni, che viene immediatamente eliminato perché troppo grande.
  • Questo è stato descritto come un "buco nero" perché i pacchetti non raggiungono mai la loro destinazione.

Quindi potresti voler assicurarti che le tue regole del firewall siano impostate per accettare i messaggi ICMPv6 (vedi RFC4890 per un elenco di tipi ICMP "necessari").

Nel mio caso, sto permettendo i messaggi ICMP e ho ancora il problema. Non sono ancora pronto a gettare la spugna e ridurre semplicemente l'MTU della mia rete (che è l'opzione nucleare).

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.