我将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进行SNAT操作不起作用,因为在POSTROUTING阶段会发生这种情况,而IPVS会跳过它.另请参阅我在Linux IPVS in DR mode: VIP unreachable for director的相关问题
谢谢!
解决方法
在main之前查询本地表(表255),并包含所有本地路由(因此名称).它由内核维护(因此是proto内核).在你的机器上,它可能看起来像这样.
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)来决定何时以及要咨询哪个表.如果表不包含答案,或者路由是throw类型,则查阅下一个RPDB规则.
$ip ru 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
您可以尝试删除本地表查找的规则,稍后放置它(ip rule del pref 0; ip rule add from all lookup local pref 1),这是不推荐的.然后,您可以在规则前面查阅自定义路由表(选择255以上的任何数量),其中只有10.1.1.1的唯一路由,源地址设置为10.2.2.2.更好的方法是只调用bind(),如果你是有问题的程序的作者,那将会与10.1.1.1交谈.