iptables
我使用标记和规则在 SSH 隧道 (-w) 上路由 HTTPS 连接iproute2
,至少可以说,我需要这样做的原因是人为的,所以大多数替代解决方案可能根本不适合我。
tun0 设备存在并且正在按我的意愿工作,并且当我在 OUTPUT 链中应用 MARK 时路由正在工作,但由于某种原因,如果在 FORWARD 链中应用 MARK,则路由规则似乎不起作用。
操作系统是 CentOS 6.7,内核为 2.6.32,iptables 为 1.4.7。标记iptables
和记录:
# iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix "marked: "
规则iproute2
设置:
# cat 201 tunneled >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table tunneled
# ip route add default via 192.168.100.1 dev tun1 table tunneled
日志中的一小部分显示结果:
Feb 17 19:11:35 nhopm kernel: marked: IN= OUT=eth0 SRC=192.168.82.2 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=16734 DF PROTO=TCP SPT=34619 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x1
Feb 17 19:12:00 nhopm kernel: marked: IN= OUT=tun1 SRC=192.168.81.8 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=62747 DF PROTO=TCP SPT=55349 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x1
主机有 2 个 NIC,eth0
即 192.168.81.8,其中 192.168.81.1 是默认网关,eth1
192.168.82.8 充当 192.168.82.0/24 的默认网关 - 此设置没有问题,它按预期工作。隧道 tun0 的远端有 192.168.100.1。
我试图将其范围缩小到最简单的情况,以说明问题,但不会提供过多的细节,但会提供尽可能多的细节,以试图找到问题所在,请在评论中询问任何可能有帮助的内容。希望我只是误解了它的工作原理的一小部分。
解决方法
我尝试执行上述操作是基于以下iptables
流程图:
来自 iptables.info
这掩盖了一个事实,即同一组路由决策不适用于来自 OUTPUT 链的数据包,就像来自 FORWARD 链的数据包一样。
为了完成这项工作,我需要将 FORWARD 链中完成的标记替换为 PREROUTING 链中的类似条目。
iptables -t mangle -A PREROUTING -p tcp --dport 443 ! -d 192.168.0.0/16 -j MARK --set-mark 1
无论如何,这实际上更适合我的需求。
我还没有将此作为答案,因为我还没有找到这方面的文档 - 如果我找到了,我将提供答案,除非有人比我更早。