ip 规则不作用于 fwmark

Nud*_*der 5 routing iptables

我正在尝试使用 iptables 通过标记数据包和基于标记的路由来平衡多条 DSL 线路上的网络流量。我正在使用 CentOS 6.6、内核 2.6.32-504.16.2.el6.x86_64、Iptables v1.4.7。

现在我已经完成了以下工作,作为概念证明:

iptables -t mangle -A PREROUTING -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -j MARK --set-mark 2
Run Code Online (Sandbox Code Playgroud)

加上一些远程连接的日志记录和故障保护:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j ACCEPT
iptables -t mangle -A OUTPUT -j LOG --log-prefix "output "
iptables -t mangle -A PREROUTING -j LOG --log-prefix "prerouting "
Run Code Online (Sandbox Code Playgroud)

所以iptables -t mangle -L -v给我

Chain PREROUTING (policy ACCEPT 177 packets, 93050 bytes)
 pkts bytes target     prot opt in     out     source               destination
  164 13112 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
 7687 4287K MARK       all  --  any    any     anywhere             anywhere            MARK set 0x2
 7687 4287K LOG        all  --  any    any     anywhere             anywhere            LOG level warning prefix `prerouting '

Chain INPUT (policy ACCEPT 184 packets, 91203 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 25 packets, 3100 bytes)
 pkts bytes target     prot opt in     out     source               destination
  304 38367 MARK       all  --  any    any     anywhere             anywhere            MARK set 0x2
  304 38367 LOG        all  --  any    any     anywhere             anywhere            LOG level warning prefix `output '

Chain POSTROUTING (policy ACCEPT 25 packets, 3100 bytes)
 pkts bytes target     prot opt in     out     source               destination
Run Code Online (Sandbox Code Playgroud)

我已经设置了替代路由表。 ip route show table DSL2给我

10.77.0.0/16 via 112.112.224.1 dev eth4
112.112.0.0/16 via 112.112.224.1 dev eth4
default via 10.177.55.33 dev eth2
Run Code Online (Sandbox Code Playgroud)

(通过 eth4 的 112.112.0.0/16 和 10.77.0.0/16 是局域网,通过 eth2 的 10.177.55.33 是 DSL 路由器之一。)

当标记设置为 2 时,我添加了一个使用表 DSL2 的策略。ip rule显示:

0:      from all lookup local
32764:  from all fwmark 0x2 lookup DSL2
32765:  from all fwmark 0x1 lookup DSL1
32766:  from all lookup main
32767:  from all lookup default
Run Code Online (Sandbox Code Playgroud)

(暂时忽略 DSL1。到目前为止,它会发挥作用。)

日志显示正在应用标记:(行尾)

Jun  1 17:05:03 squidXXX kernel: output IN= OUT=eth4 SRC=112.112.xxx.xxx DST=10.77.xxx.xxx LEN=312 TOS=0x08 PREC=0x00 TTL=64 ID=60789 DF PROTO=TCP SPT=22 DPT=49328 WINDOW=543 RES=0x00 ACK PSH URGP=0 MARK=0x2 
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试连接到外部地址时,无论是从本地机器 ping 还是从另一台机器连接到代理时,我都会收到网络无法访问的回复。注意:我在那台机器上也运行了一个鱿鱼代理,它按预期工作。当我在主路由表中添加 10.177.55.33 作为默认路由时,我可以很好地访问外部网络。

现在我读到有人遇到同样的问题并解决它是用目标网络 0.0.0.0/1 替换默认路由。这不仅是错误的(无法访问 128.0.0.0 以上的任何地址),而且在我的情况下也不起作用。无论如何,我从中得到的是我的路由表可能有问题,因此它采用主路由表,但我没有看到任何错误。或者有已知的错误?

遵循这条线索,我尝试添加ip rule add from all lookup DSL2 prio 1002按预期路由数据包的路径,所以可能不是这样。

所以在我看来好像ip rule无法正确读取 MARK 或不使用指定的表。但为什么?