我需要具有 10.10.10.214 IPv4 地址的设备来绕过路由器强制执行的透明代理。
我当前在路由器上的 mangle 表:
# iptables -t mangle -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DIVERT
-N PROXY
-A PREROUTING -p tcp -m socket -j DIVERT
-A PREROUTING -j PROXY
-A DIVERT -j MARK --set-xmark 0x1/0xffffffff
-A DIVERT -j ACCEPT
-A PROXY -s 10.10.10.214/32 -j RETURN
-A PROXY -d 0.0.0.0/8 -j RETURN
-A PROXY -d 10.0.0.0/8 -j RETURN
-A PROXY -d 127.0.0.0/8 -j RETURN
-A PROXY -d 169.254.0.0/16 -j RETURN
-A PROXY -d 172.16.0.0/12 -j RETURN
-A PROXY -d 192.168.0.0/16 -j RETURN
-A PROXY -d 224.0.0.0/4 -j RETURN
-A PROXY -d 240.0.0.0/4 -j RETURN
-A PROXY -p tcp -j TPROXY --on-port 12345 --on-ip 127.0.0.1 --tproxy-mark 0x1/0xffffffff
WAN 接口上启用了 MASQUERADE
我插入-A PROXY -s 10.10.10.214/32 -j RETURN
以绕过 10.10.10.214 的代理。LAN 和 WAN 上的 Wireshark 数据包捕获显示源 IP 已转换为 WAN IP,但它不会转换并将响应发送回设备。
我错过了什么?
答案1
我一直在思考这个问题并且已经知道问题出在哪里了。
数据包首先经过 mangle 表,然后进入 nat 表以将 nat 规则应用到数据包上(我为此使用 MASQUERADE)。
我们可以轻松区分来自 10.10.10.214 的流量并使其绕过透明代理:
iptables -t mangle -I PREROUTING -s 10.10.10.214/32 -j RETURN
但是,当流量从互联网返回时,目的地是路由器的 IPv4 地址,则无法区分它是否是发往我们设备的。这种区分是在 nat 表上进行的(在我的情况下使用 MASQUERADE 规则),但在 nat 表上处理数据包之前,它们将与 mangle 表上的 TPROXY 规则匹配,从而导致此问题。
因此,不需要区分 10.10.10.214 的流量,只需让 WAN 接口上的所有流量绕过 TPROXY 规则(除了已标记因此被排除的代理流量):
iptables -t mangle -I PREROUTING -i pppoe-wan -j RETURN
使用这两个命令,可以成功地将设备从透明代理中排除。