同じスイッチに接続され、同じサブネットにある2つのイーサネットインターフェースを備えたLinuxサーバーがあります。トポロジは次のようになります。
+--------------------+
| |
| +----------+ +----------+
| | enp1s0f0 |<======>| |
| +----------+ | ethernet |
| Server | | |
| +----------+ | switch |
| | enp1s0f1 |<======>| |
| +----------+ +----------+
| |
+--------------------+
これら 2 つのインターフェースの IP アドレスはそれぞれ172.16.0.100
とです172.16.1.100
。
$ ip addr
...
4: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f0
valid_lft forever preferred_lft forever
5: enp1s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.100/16 brd 172.16.255.255 scope global noprefixroute enp1s0f1
valid_lft forever preferred_lft forever
...
enp1s0f0
ここで、外部スイッチを介してからにパケットを送信しますenp1s0f1
(テスト目的で、スイッチから見ると、2 台の個別のコンピューターが相互に通信しています)。そのため、ソケットのローカル アドレスを 172.16.0.100 にバインドし、172.16.1.100 に接続します (たとえば、telnet -b 172.16.0.100 172.16.1.100 22
コマンドを使用します)。ただし、これらのパケットが 2 つのイーサネット インターフェイスとスイッチではなく、インターフェイスを通過することしかわかりませんlo
(キャプチャされたパケットを検査することによって)。
最初の質問はLinux にこれらのパケットをローカル宛先で外部インターフェース経由で送信させるにはどうすればよいですか?
アドレスとルーティングテーブルは正しく設定されていると思います。ルーティングテーブルには次のエントリが含まれています
$ ip route
...
172.16.0.0/16 dev enp1s0f0 proto kernel scope link src 172.16.0.100 metric 100
172.16.0.0/16 dev enp1s0f1 proto kernel scope link src 172.16.1.100 metric 101
ARPテーブルも正しく設定されているようです
$ arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.1.100 ether 10:00:00:00:01:00 CM enp1s0f0
172.16.0.100 ether 10:00:00:00:00:00 CM enp1s0f1
しかし、Linuxはこれらのパケットをlo
インターフェース経由でルーティングします
$ ip route get from 172.16.0.100 172.16.1.100
local 172.16.1.100 from 172.16.0.100 dev lo uid 1000
cache <local>
$ ip route get from 172.16.1.100 172.16.0.100
local 172.16.0.100 from 172.16.1.100 dev lo uid 1000
cache <local>
ping
また、これらのインターフェースから を試してみましたping -I enp1s0f0 172.16.1.100
。キャプチャされたパケットは、送信されたICMPパケットがスイッチ経由で宛先に期待どおりに到着できることを示していますが、インターフェースに応答パケットは表示されませんenp1s0f1
。この問題の解決策を検索したところ、これ答えは、これは逆パスフィルタリングrp_filter
そこで、デフォルトとインターフェースの値を0と2に設定して無効にしようとしましたrp_filter
が、問題は解決しませんでした。私の追加の質問は私の設定は正しいですか? また、このような状況で Linux が ICMP ping パケットに応答するにはどうすればよいでしょうか?
私の OS は Ubuntu 20.04 で、ICMP 応答は他のインターフェースでは正常に機能し、iptable エントリは構成されていません。