パケットが予期せずローカル 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に関連していますか?

関連情報