我正在尝试使用 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 或不使用指定的表。但为什么?