我在使用Squid和IPv6在CentOS 7服务器上运行TPROXY时遇到了麻烦。 我之前使用通用拦截设置与NAT,但它仅限于IPv4。 我现在正在扩大设置,以包括与TPROXY的IPv6。
我一直在使用关于这个主题的官方Squid wiki文章来configuration一切:
http://wiki.squid-cache.org/Features/Tproxy4
到目前为止,TPROXYconfiguration似乎在为IPv4工作,没有问题。 对于IPv6,连接超时,无法正常工作。 我会分解设置以便更好地理解。
注意所有的防火墙和路由规则对于IPv4来说都是完全相同的,唯一的区别是在下面的例子中configurationIPv6规则的inet6
和ip6tables
。
IPv6连接目前通过Hurricane Electric的6in4隧道,在DD-WRT路由器上configuration,然后通过radvd
委托给客户端。 Squid框有几个静态的IPv6地址configuration。
Squid盒位于主服务器内。 被拦截的端口80(主要是无线客户端)上的stream量的客户端正通过DD-WRT路由器被推送到Squid盒子,并具有以下防火墙和路由规则,根据策略路由维基文章和DD-WRT维基
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
在将stream量传递到Squid盒子方面,这似乎工作正常。 除了上述之外,我必须在DD-WRT路由器上添加一个附加规则,这是对Squid框中configuration的输出IPv4和IPv6地址的例外规则,否则我会遇到疯狂的循环问题,并且所有客户端的stream量都会中断3128
上使用squid的主要局域网。
ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT
在Squid框我然后使用以下路由规则和DIVERT链来处理相应的stream量。 我需要添加额外的规则,以防止在testing过程中已经存在的链的任何错误。 我的防火墙是CSF
,我已经将以下内容添加到csfpre.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
configuration为两个端口:
http_proxy 3128 http_proxy 3129 tproxy
此外,我也使用Privoxy,必须添加no-tproxy
到我的cache_peer行,否则所有stream量都无法转发两个协议。
cache_peer localhost parent 8118 7 no-tproxy no-query no-digest
由于Privoxy,我没有使用任何tcp_outgoing_address
指令,而是通过CentOS和绑定顺序来控制出站地址。
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
我不确定是否需要进行rp_filter
修改,因为安装程序在使用或不使用IPv4的情况下工作,并为IPv6生成相同的结果。
在Squid盒子上启用了SELINUX,但是策略已经被configuration为允许TPROXY设置,所以它没有被阻塞(IPv4工作显示了这一点)。 我已经用grep squid /var/log/audit/audit.log | audit2allow -a
进行了检查 grep squid /var/log/audit/audit.log | audit2allow -a
并获得<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;
我还设置了以下布尔值:
setsebool squid_connect_any 1 setsebool squid_use_tproxy 1
最终,对于TPROXY客户端(使用WPAD / PAC文件的端口3128
上的LAN客户端已经完全工作的IPv6),IPv6连接完全中断。 虽然看起来stream量正在以某种方式被路由到Squid盒,但没有通过TPROXY的IPv6请求出现在access.log
。 所有IPv6请求都是文字IPv6和DNS,超时。 我可以访问内部的IPv6客户端,但是同样这个stream量也没有被logging。
我使用test-ipv6.com进行了一些testing,发现它检测到我的传出Squid IPv6地址,但是IPv6testing显示为慢/慢或超时。 我暂时启用了通过头,发现Squid的HTTP头是可见的,所以stream量至less到达Squid框,但没有正确路由一旦它的存在。
我一直试图让这个工作一段时间,找不到问题是什么,我甚至问过在Squid邮件列表,但一直无法诊断实际问题或解决它。 根据我的testing,我很确定它的以下领域之一,Squid框问题:
任何想法和额外的步骤,我可以采取TPROXY和IPv6工作将不胜感激!
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
IPv6路由表(前缀隐藏)
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
我意识到这已经很老了,我自己也没有一个完整的答案,但是我正在做一些与你非常相似的事情,并且有几乎相同的症状。
首先:test-ipv6.com最近似乎已经更新了一些,可以处理新的错误types(今年早些时候它已经被打破了)。 再试一次。
就我而言,它发送给我一个描述我似乎有问题的URL: Path MTU Detection FAQ 。 他们提供了一个URL,你可以使用cURL做一个PMTUDtesting,然后你可以使用tpcdump
或wireshark检查你的stream量。
当stream量通过Squid被TPROXY时,IPv6pathMTU检测并不完全在您的主机上运行。 (我仍然在为什么它不在我的主机上工作,所以我没有确定的解决scheme)。
简要说明:
因此,您可能需要确保您的防火墙规则设置为接受ICMPv6消息(有关“所需的”ICMPtypes列表,请参阅RFC4890)。
在我的情况下,我允许ICMP消息,仍然有问题。 我还没有做好准备,只是减less我的networking的MTU(这是核select)。