我有一个路由器。它有几个接口。其中之一是 VPN,称为 vpn0,一个是到物理接口的默认路由,称为 out0,还有一个输入接口 in0。
来自 in0 且目标端口为 993 的数据包永远不会放置在 out0 上。我通过这样标记数据包来做到这一点:
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j MASK --set-mark 100
iptables -t mangle -A PREROUTING -i in0 -p tcp --dport 993 -j CONNMARK --save-mark
要禁用 out0 上的转发,我执行以下操作:
iptables -A FORWARD -i in0 ! -o vpn0 --match-mark 100 -j DROP -m conntrack --ctstate NEW
我遇到的问题是来自主机的输出数据包。要破坏 vpn0 的数据包,我有以下规则:
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump MARK --set-mark 100
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump CONNMARK --save-mark
iptables -t mangle -A OUTPUT --protocol tcp --dport 993 --jump RETURN
效果相当好。仅当 vpn0 不工作时才会发生。我尝试添加规则:
iptables -A OUTPUT --protocol tcp --dport 993 -o out0 --match mark --mark 100 --jump DROP -m conntrack --ctstate NEW
但这会丢弃会流出 VPN 的数据包。我通过将 DROP 更改为 LOG 来检查这一点,并且输出接口是 out0,而不是 vpn0。
是什么赋予了?