我重新编辑了原始问题,因为我已经更改了原始答案的设置,该答案是基于 NAT 的设置。NAT 不再使用,并且已被 TPROXY 取代以实现 IPv6 兼容性。
我在小型网络中运行 squid。我为不同的场景设置了几个 squid 监听端口。
squid.conf 摘录
- http_端口 3128- 这将通过域策略推送到 Windows 客户端,并通过 WPAD 设置 HTTP 代理。
- http_port 3129 tproxy- 这适用于拦截端口 80 上的流量的客户端。
对于 TPROXY 设置,我在 DD-WRT 路由器上使用以下 iptables/ip6tables 规则来iproute2
标记和重定向到代理的流量。问题是在这个设置中,所有流量都被标记,包括通过 3128 端口设置流向 Squid 代理的 IPv4 和 IPv6 流量。
我需要一种方法来排除这种流量,因为它会增加开销并破坏直接应用代理的 LAN 客户端上的连接(特别是 IPv6)。
我知道我可以PREROUTING
用ACCEPT
规则将特定客户端添加到表中,但对 IPv4 和 IPv6 都这样做会变得难以快速管理。我需要找到一种通用方法来排除所有通过路由器级别 3128 端口上的 Squid 代理的 LAN 客户端,但我不知道最好的方法。
当前 DD-WRT Squid 策略路由:
# Squid transparent proxy
PROXY_IPV4=192.168.x.x
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
答案1
ACCEPT
为来自 squid 服务器的 80 端口流量添加一条 iptables 规则。添加该规则后,您就可以拥有DNAT
规则了。
一旦规则匹配,链条就不会再被遵循,因此来自 squid 的流量ACCEPT
将会短路。DNAT
编辑:DNAT
规则已经排除了,$PROXY_IP
因此不需要添加额外的规则。我个人更喜欢为ACCEPT
来自代理的流量添加一条明确的规则,这样任何进一步的规则都不会影响该流量。
对于那些遵守代理规则并在端口 3128 上明确使用代理的客户端,流量不会通过路由器,因为客户端可以直接访问代理;至少我希望代理和客户端在同一个子网中?如果由于某种原因,代理和客户端位于不同的子网但位于同一个物理 LAN 网络上,那么当从客户端发往代理的流量到达路由器时,路由器应该向客户端发送 ICMP 重定向。