数据包意外路由到本地 lo 接口

数据包意外路由到本地 lo 接口

我有一个关于同一 Linux 主机内不同网络设备之间路由的问题:

我创建了一个 Geneve 网络设备(此示例与 Geneve 隧道无关;只是我碰巧创建了 Geneve 类型的网络链接)并使用以下命令为该设备分配了 IP 地址:

ip link add dev geneve0 type geneve dstport 6081 external
ip link set dev geneve0 up
ip addr add dev geneve0 10.0.0.1/30

当我检查路由表时,以下是输出:

[root@9097d4d76e67 /]# ip route show table main
default via 172.19.0.1 dev eth0 
10.0.0.0/30 dev geneve0 proto kernel scope link src 10.0.0.1 
172.19.0.0/16 dev eth0 proto kernel scope link src 172.19.0.3

然而,当测试出来

[root@9097d4d76e67 /]# ip route get 10.0.0.1   
local 10.0.0.1 dev lo src 10.0.0.1 uid 0 
    cache <local> 

看起来带有 baddr 的数据包10.0.0.1应该路由到该lo接口?这是为什么?

我做了一些研究,它似乎与本地路由表有关

[root@9097d4d76e67 /]# ip route show table local
local 10.0.0.1 dev geneve0 proto kernel scope host src 10.0.0.1 
broadcast 10.0.0.3 dev geneve0 proto kernel scope link src 10.0.0.1 
...

所以我猜内核决定使用本地路由表来路由数据包,并且我知道本地路由表具有更高的优先级。我的问题是:我应该做什么来强制将数据包路由到geneve0设备?

我尝试从本地路由表中删除该规则(我不确定是否应该这样做):

[root@9097d4d76e67 /]# ip route del table local 10.0.0.1 dev geneve0
[root@9097d4d76e67 /]# ip route get 10.0.0.1                        
10.0.0.1 dev geneve0 src 10.0.0.1 uid 0 
    cache 

现在ip route似乎返回了正确的设备但是,当我用实际流量进行测试时,当数据包到达 eth0 时,然后在 PREROUTING 阶段 DNAT 到 10.0.0.1 ip ip 表规则,并且 DNATed 的数据包不会路由到 Geneve0 设备正如我所料,有人知道为什么吗?和ARP有关系吗?

相关内容