Linux で、ループバック インターフェイスを経由せずにローカル宛先にパケットを送信する方法

Linux で、ループバック インターフェイスを経由せずにローカル宛先にパケットを送信する方法

同じスイッチに接続され、同じサブネットにある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 エントリは構成されていません。

関連情報