我有一个关于同一 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有关系吗?