我有 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
谢谢!
本地表(表 255)在 main 之前被查询,并包含所有本地路由(因此得名)。它由内核维护(因此
proto kernel
)。在您的机器上,它可能看起来像这样。其中指定了源地址。
Linux 支持多个路由表,并且路由涉及咨询路由策略数据库 (RPDB) 的使用,以决定何时以及咨询哪个表。如果表不包含答案,或者路由类型为
throw
,则查询下一个 RPDB 规则。您可以尝试删除
local
表查找规则,然后将其放置 (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 对话的相关程序的作者,请致电。