同じホストから別のインターフェースにpingを実行する

同じホストから別のインターフェースにpingを実行する

2 つのイーサネット インターフェイスを備えたコンピューター (Linux を実行) があります。別の PC を使用せずにそれらをテストしたいと考えています。

セットアップ:

  (192.168.1.5) eth1-------.
Linux PC/device            | loopback cable
  (192.168.1.6) eth2-------'

走る

ping -I eth1 192.168.1.6

しかし返事は来ません。

何が問題なのかわかりません。Linux はなぜこのアクションを禁止するのでしょうか? この問題を解決するにはどうすればいいでしょうか?

答え1

なぜ?

完全に説明することはできません。


この問題をどうすれば解決できますか?

いつものLinuxはローカルに割り当てられたIPアドレスに内部的に到達するそして、それはうまく機能します。問題は、あなたのケースのように、パケットを外部(たとえばケーブル経由)に移動させて戻す必要がある場合に発生するようです。

ネットワーク名前空間を使用することで動作させることができます。私のもう一つの答えあなたのニーズに合わせて。

ノート:

  • Debian 10 でテストしました。
  • コマンドがある場所では、ip …おそらく が必要になりますsudo ip …。読みやすくするために、 を省略していますsudo。昇格したシェルで作業するか、(一時的に) 定義してalias ip='sudo ip'、簡単にコピー アンド ペーストできるようにします。
  • 自動化が干渉しない、つまり、関連するインターフェースを独自の方法で構成しようとするデーモンは存在しないと想定します。
  • デフォルト以外のネットワーク名前空間でコマンドを実行するには、 を使用しますip netns exec …。この方法でシェルを実行することは可能です。その場合、シェルから実行するすべての操作でネットワーク名前空間が使用されます。この回答では、デフォルト以外のネットワーク名前空間で何かを実行する必要があるたびに を使用しますip netns exec …

次のように進めます:

  1. 便利な変数を定義します。ここではns1名前空間の任意の名前を指定します。eth1およびeth2は使用するデバイスです。

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. 新しいネットワーク名前空間を作成します。

    ip netns add "$netns"
    
  3. デフォルトの名前空間でデバイスを停止します。

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. デバイスの 1 つを新しい名前空間に追加します (デフォルトの名前空間からは消えます)。ここでは、$dev2新しい名前空間に移動することを選択します。

    ip link set dev "$dev2" netns "$netns"
    
  5. IP アドレスを割り当てます。

                           ip address add 192.168.1.5/24 dev "$dev1"
    ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
    
  6. 2 つのデバイスが適切な場所にあり、正しい IP アドレスが設定されていることを確認します。

                           ip address show
    ip netns exec "$netns" ip address show
    # examine output
    
  7. まだ行っていない場合は、ケーブルを使用して 2 つのインターフェースを物理的に接続します。

  8. インターフェイスを起動します。名前空間には独自のループバック デバイスが含まれていますlo。一般的なプログラムはこれに依存する可能性があるため、念のためこれを起動します。

                           ip link set dev "$dev1" up
    ip netns exec "$netns" ip link set dev "$dev2" up
    ip netns exec "$netns" ip link set dev      lo up
    
  9. ルートをチェックします。私のDebian 10では、正常なルートが自動的に表示されます。このコマンド

    ip route show
    

    版画(その他のラインを含む)

    192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
    

    そしてこのコマンド

    ip netns exec "$netns" ip route show
    

    プリント

    192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
    
  10. いずれにせよ、ping を実行します。

                           ping 192.168.1.6
    ip netns exec "$netns" ping 192.168.1.5
    

    使用できます-Iが、必須ではありません。アドレスは、192.168.1.6デフォルトのネットワーク名前空間のどのインターフェースにも割り当てられておらず、192.168.1.5デフォルト以外の名前空間にも割り当てられていません。

これがそれです。動作するはずです。私のテストでは、これらはping実際にケーブルを使用していることがわかりました。その理由は次のとおりです。

  • ケーブルを外すと、ping は流れなくなります。比較すると、「内部」ping (有線インターフェイスから自身の IP アドレスへ) はケーブルがなくても流れます。
  • iptraf-ngping されたインターフェースを監視すると、ICMP エコー要求と ICMP エコー応答が表示されます。比較すると、このツールは有線インターフェースの「内部」 ping を表示しません。

基本的なクリーンアップ: ネットワーク名前空間を削除します。

ip netns del "$netns"

これにより、2 番目のデバイスがデフォルトのネットワーク名前空間に戻ります。

使用したコマンドはいずれも永続的な変更を実装するものではないため、問題が発生した場合は再起動するだけです。

関連情報