我有 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
Run Code Online (Sandbox Code Playgroud)
问题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
Run Code Online (Sandbox Code Playgroud)
问题 B:如何覆盖这条奇怪的“本地”路线?
背景:数据包被 IPVS 内核子系统拦截。在它到达那里之前,我需要正确的源地址,否则 IPVS 不知道如何处理它。使用 iptables 进行 SNAT 不起作用,因为这发生在 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
Run Code Online (Sandbox Code Playgroud)
源地址在其中指定。
Linux 支持多个路由表,路由涉及到查询路由策略数据库(RPDB)的使用来决定何时查询和查询哪个表。如果表不包含答案,或者路由类型为throw,则查询下一个 RPDB 规则。
$ ip ru
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Run Code Online (Sandbox Code Playgroud)
您可以尝试删除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 对话的相关程序的作者,则只需致电。
| 归档时间: |
|
| 查看次数: |
2047 次 |
| 最近记录: |