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 iptables
e ip6tables
sul mio router DD-WRT e Squid Proxy insieme iproute2
a fare le parti di routing su entrambi i lati.
Per impostazione predefinita, sembra che il ip6table_mangle
modulo 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 lo
senza 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.
- http://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute
- http://wiki.squid-cache.org/Features/Tproxy4#Feature:_TPROXY_version_4.1.2B-_Support
Qualche consiglio su quale potrebbe essere il problema o eseguire il debug ulteriormente?