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