ip 规则不作用于 fwmark

ip 规则不作用于 fwmark

我正在尝试使用 iptables 通过标记数据包并根据标记进行路由来负载平衡多条 DSL 线路上的 Web 流量。我正在使用 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

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

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 "

所以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

我已经设置了替代路由表。 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

(通过 eth4 的 112.112.0.0/16 和 10.77.0.0/16 是 LAN,通过 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

(暂时忽略 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 

但是,当我尝试连接到外部地址时,无论是从本地计算机 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无法正确读取标记或不使用指定的表。但为什么?

相关内容