防止策略路由标记非拦截Squidstream量

我已经重新编辑了原始问题,因为我已经改变了原来的答案,这是基于NAT的设置。 NAT不再被使用,并已被replace为TPROXY以兼容IPv6。

我在一个小networking中运行鱿鱼。 我已经为不同的场景设置了几个鱿鱼侦听端口。

squid.conf的摘录

  • http_port 3128 – 这将通过域策略推送到Windows客户端,通过WPAD设置HTTP代理。
  • http_port 3129 tproxy – 这是针对端口80上的stream量被拦截的客户端。

对于TPROXY设置,我使用iproute2在我的DD-WRT路由器上使用以下iptables / ip6tables规则来标记stream量并将其redirect到代理。 问题是在这个设置中,所有stream量都被标记,包括通过3128端口设置进入Squid代理的IPv4和IPv6stream量。

我需要一种排除这种stream量的方法,因为它是在直接应用代理的LAN客户端上添加开销和断开连接(特别是IPv6)。

我知道我可以使用ACCEPT规则将特定的客户端添加到PREROUTING表中,但是对于IPv4和IPv6这样做将很难快速pipe理。 我需要find一个通用的方法来排除路由器端口3128上通过Squid代理的所有局域网客户端,但是我不知道最好的办法。

当前的DD-WRT Squid策略路由:

 # Squid transparent proxy PROXY_IPV4=192.168.xx PROXY_IPV6=2001:470:xxxx:xx::x CLIENTIFACE=br0 FWMARK=3 iptables -t mangle -A PREROUTING -i $CLIENTIFACE -s $PROXY_IPV4 -p tcp --dport 80 -j ACCEPT ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -s $PROXY_IPV6 -p tcp --dport 80 -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 

添加一个iptables规则来从squid服务器端口80 ACCEPTstream量。 在该规则之后,您可以拥有DNAT规则。

只要一条规则匹配,就不再遵循链接,所以ACCEPT将短路来自鱿鱼stream量的DNAT

编辑: DNAT规则已经排除了$PROXY_IP所以添加额外的规则不应该是必要的。 我个人更喜欢添加一个明确的规则来ACCEPT来自代理的stream量,这样任何进一步的规则都不会影响这个stream量。

对于那些服从代理规则的客户端,在端口3128上显式使用代理服务器,由于客户端可以直接访问代理服务器,因此该stream量不会通过路由器。 至less我希望代理和客户端在同一个子网? 如果由于某种原因,代理和客户端在不同的子网上,但在同一个物理LANnetworking上,那么路由器应该向客户端发送ICMPredirect到客户端去往客户端的代理到达路由器。