我有这个配置,它来自官方和非官方指南和这里的问答以及大量失败的测试。CentOS 7 和 Ubuntu 服务器 15(LAMP 且仅 eth0)。
/etc/iproute2/rt_tables
1 tunnel0
我准备路线和标记
ip route add 0.0.0.0/0 dev tun0 table 1
ip rule add from all fwmark 1 table 1
ip route flush cache
(也尝试使用表 ID,通过“10.123.123.x”使用 tun0 地址和 tun0 网关进行声明......)
IP表
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save
我看到的是 eth0 ISP 公共 IP,而不是 tun0,我可以看到它强制使用“路由添加”静态路由。我遗漏了什么?谢谢。
答案1
我解决并记录在这里: http://aftermanict.blogspot.it/2015/11/bash-iptables-iproute2-and-multiple.html
这将使内核永久路由数据包,启用多条路由,甚至对于机器上未证明的网络也启用路由:
nano /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
net.ipv4.ip_forward = 1
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 >| $f ; done
这将初始化 iptables 以及特别是 mangle 和 nat,它们是标记流量所必需的:
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
添加替代路线编辑:
nano /etc/iproute2/rt_tables
添加(名称为你的参考):
1 tunnel0
2 tunnel1
添加路由和规则,我们使用表 ID 而不是更直接的名称。正如您所注意到的,网关是无关紧要的,尤其是对于可以具有动态网关的隧道:
ip route add 0.0.0.0/0 dev tun0 table 1
ip route add 0.0.0.0/0 dev tun1 table 2
添加规则标记流量并绑定到相应的表:
ip rule add from all fwmark 1 table 1
ip rule add from all fwmark 2 table 2
ip route flush cache
检查你是否喜欢:
ip route show table 1
ip route show table 2
ip rule show
如果你错过了什么,你可以通过以下方式删除:
ip rule del table 1
ip route flush table 1
现在缺少的部分:这不起作用:
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1
这会:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables-save
您是否需要在设备/隧道中选择流量并同时推送?没问题,我也解决了这个问题:
iptables -A OUTPUT -t mangle -p tcp --dport 10001 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p tcp --dport 10002 -j MARK --set-mark 2
iptables -t nat -A OUTPUT -p tcp --dport 10001 -j DNAT --to :80
iptables -t nat -A OUTPUT -p tcp --dport 10002 -j DNAT --to :80
强制使用 NAT 进行回复
iptables -t nat -A POSTROUTING -o $DEV1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $DEV2 -j MASQUERADE
iptables-save
答案2
我尝试了上述解决方案,但对我不起作用。出于某种原因,流量总是遵循主路由表中的默认路由。
iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 428 packets, 35952 bytes)
pkts bytes target prot opt in out source destination
428 35952 MARK !tcp -- eth0 * 0.0.0.0/0 !172.20.50.0/24 MARK set 0x11
正如你所见,数据包数量在增加,因此预路由规则正在被应用
ip rule ls
0: from all lookup local
100: from all fwmark 0x11 lookup table1
32766: from all lookup main
32767: from all lookup default
这是我的餐桌规则
ip route show table table1
default via 172.20.50.2 dev eth0
此时,eth0 上没有发出任何 ping 回复。但是,当执行此命令到主路由表时
ip route add default via 172.20.50.2 dev eth0
现在 ping 回复已经顺利通过。