Linux:强制数据包的源地址到本地绑定的IP

我有10.1.1.1和10.2.2.2绑定到eth0。

# ip address show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 04:01:05:ff:42:01 brd ff:ff:ff:ff:ff:ff inet 10.2.2.2/24 brd 10.2.2.255 scope global eth0 inet 10.1.1.1/32 scope global eth0 inet6 fe80::601:5ff:feff:4201/64 scope link valid_lft forever preferred_lft forever # ip route get 10.1.1.1 local 10.1.1.1 dev lo src 10.1.1.1 

问题A:为什么当IP绑定到eth0时使用“dev lo”?

我想强制本地连接到10.1.1.1有一个源地址10.2.2.2。 所以我尝试:

 # ip route add 10.1.1.1/32 dev eth0 src 10.2.2.2 # ip route show default via 10.2.2.1 dev eth0 10.1.1.1 dev eth0 scope link src 10.2.2.2 10.2.2.0/24 dev eth0 proto kernel scope link src 10.2.2.2 # ip route get 10.1.1.1 local 10.1.1.1 dev lo src 10.1.1.1 

问题B:我如何覆盖这个奇怪的“本地”路线?

背景:数据包被IPVS内核子系统拦截。 在它到达那里之前,我需要正确的源地址,否则IPVS不知道如何处理它。 使用iptables进行SNATTING不起作用,就像在POSTROUTING阶段发生的那样,IPVS跳过了这一步。 在DR模式下,在Linux IPVS上也可以看到我的相关问题:导向器无法访问VIP

谢谢!

本地表(表255)在main之前被查阅,并包含所有本地路由(因此名称)。 它由内核维护(因此是proto kernel )。 在你的机器上,它可能看起来像这样。

 local 10.1.1.1 dev eth0 proto kernel scope host src 10.1.1.1 broadcast 10.2.2.0 dev eth0 proto kernel scope link src 10.2.2.2 local 10.2.2.2 dev eth0 proto kernel scope host src 10.2.2.2 broadcast 10.2.2.255 dev eth0 proto kernel scope link src 10.2.2.2 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 broadcast 127.255.255.255 dev lo proto kernel scope host src 127.0.0.1 

其中指定了源地址。

Linux支持多个路由表,并且路由涉及到咨询使用路由策略数据库(RPDB)来决定什么时候查询哪个表。 如果一个表不包含答案,或者一个路由types为throw ,则查询下一个RPDB规则。

 $ ip ru 0: from all lookup local 32766: from all lookup main 32767: from all lookup default 

您可以尝试删除local表查找的规则,稍后放置( ip rule del pref 0; ip rule add from all lookup local pref 1 ),这是不推荐的。 然后,你会预先定义一个规则来查询一个自定义路由表(select你想要的255以上的任何数字),其中10.1.1.1的唯一路由将源地址设置为10.2.2.2。 更好的方法是,如果你是正在讨论的程序的作者,那么只需调用bind()