加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 02:51:39 所属栏目:Linux 来源:网络整理
导读:我将10.1.1.1和10.2.2.2绑定到eth0. # ip address show dev eth02: 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 glob
我将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交谈.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读