同じ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に関連していますか?