iproute rt_table 和 mark 在 Linux 上不起作用

iproute rt_table 和 mark 在 Linux 上不起作用

我有这个配置,它来自官方和非官方指南和这里的问答以及大量失败的测试。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 回复已经顺利通过。

相关内容