我正在尝试设置一个透明代理,用于处理由辅助程序它包装一个进程并用防火墙标记标记其流量。
此设置的作用是强制所有标记的数据包通过透明代理。
这是我的设置:
ip link add dum0 type dummy
ip link set dum0 up
ip -4 addr add 10.11.0.1/32 dev dum0
ip -4 route add blackhole default table 11 metric 9999
ip -4 route add default dev dum0 table 11 metric 95
ip -4 rule add fwmark 11 table 11
ip -4 rule add from 10.11.0.1 table 11
ip -4 rule add fwmark 10 table 10
ip -4 route add local 0.0.0.0/0 dev lo table 10
ip -6 rule add fwmark 11 table 11
ip -6 route add blackhole default table 11
iptables -t nat -A OUTPUT -p tcp -m comment -m mark --mark 11 -s 10.11.0.1 -j REDIRECT --to-ports 10000
iptables -t nat -A OUTPUT -p udp -m comment -m mark --mark 11 --dport 53 -j REDIRECT --to-ports 10002
iptables -t mangle -A PREROUTING -p udp -s 10.11.0.1 -m mark --mark 11 -j TPROXY --tproxy-mark 10 --on-port 10001
TCP 数据包将被发送到 127.0.0.1:10000 的重定向代理,DNS 查询将被发送到 DNS 端口 127.0.0.1:10000;UDP 数据包应发送到 127.0.0.1:10001 的 TPROXY 代理。
TCP 和 DNS 发送和接收正常,但尝试通过 TPROXY 发送时 UDP 数据包卡住。TPROXY 表与主防火墙标记表分开,因为如果它包含在主防火墙标记 (11) 中,它会丢弃数据包。
这个设置中我遗漏了什么?这个配置有问题吗?
答案1
我发现了问题所在。
当 iptables 中的 TPROXY 流量来自与“-m mark”匹配的标记数据包时,这些数据包需要使用另一个路由表的防火墙标记重新标记,该路由表具有指向环回设备(127.0.0.1)的本地路由。
重新标记数据包非常简单:
iptables -t mangle -A OUTPUT -p udp -m mark --mark 11 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -p udp -m mark --mark 10 -s 10.33.0.1 -j TPROXY --tproxy-mark 10 --on-port 10001
标记为11的数据包将被重新标记为10,并将由指向具有本地环回路由的表的TPROXY iptables规则进行匹配和处理,并相应地将它们发送到127.0.0.1。