Ubuntu 18.04と2つのネットワークインターフェイス(eth0とwlan0)が接続されています。したがって、実際には2つのLAN(たとえば、LAN1とLAN2)があります。単にpingコマンド(たとえば、pingの後にいくつかのIPv4 / IPv6アドレス)を実行すると、内部的にどのように機能しますか?次の質問があります。この問題を解決するのに役立ちます。
- pingはこのアドレスへのルートをどのように見つけますか?
- pingは宛先アドレスに到達するためにどのインターフェイスを使用しますか? (LAN1、LAN2、またはその両方)
- どちらのインターフェイスが特定の順序で順番に試行されますか?
- アドレスがローカルネットワークの1つのホストから来る場合、内部的にどのように機能しますか? (LAN 1 または LAN 2)
- 宛先アドレスがローカルネットワーク(LAN1またはLAN2)に属していない場合の動作方法。 pingコマンドはゲートウェイにどのように到達しますか?ゲートウェイはどのように選択しますか?事前定義された順序はありますか?
答え1
オペレーティングシステムは、パケットがどこに行くべきかを知らせるルーティングテーブルを維持する。このテーブルは、パケットがどのアドレスから来たかを記録するためにも使用されます。
その後、ソースアドレスが以前に指定されていないsource.sin_addr.s_addr=htol(INADDR_ANY);
ことを示すようにプログラムできます。bind()
(デフォルトでは指定されていないがbind()
ソースポートのみをバインドする場合は、この行は便利です。)
この-B
オプションを使用すると、ping
ソケットバインディングが有効になり、2番目とそれ以降のソースアドレスを変更できます。-I
ソースアドレスを設定するインターフェイスをバインドできます。
これは最初の3つのことにある程度答えます。
LAN1(10.0.1.5と仮定)からLAN2(10.0.2.5)へのping関連
10.0.1.5は、ルートテーブルを使用して10.0.1.1(ゲートウェイ)を介して10.0.2.0/24に接続できることを示します。そのイーサネットアドレスに「10.0.1.5から10.0.2.5へ」pingを送信します。その後、ゲートウェイはそれを確認し、LAN2を介して10.0.2.5に直接接続できることを確認し、パケットを転送します。 10.0.2.5から10.0.1.5までの答えは同じパターンに従います。
4番目のポイントはもっと難しいです。パブリックアドレスを使用すると、すべてのゲートウェイがルートを交換し、誰が誰がどこにいるのか(どのゲートウェイを介して)知ることができるため、完全に機能します。時々、ルーティングテーブルは簡単です。 LAN1はインターフェイスeth0を介して直接アクセスでき、他のすべてはLAN1のルータXを介してアクセスできます。ただし、さまざまな目的でローカルアドレスを使用しています。 10.0.0.5アドレスはインターネットからアクセスできません。その後、10.0.0.5でIPパケットを送信すると、ルータはfromアドレスをインターネットルータに知られているパブリックアドレスに変更し、スイッチを記憶します。パブリックアドレスに応答が戻ると、スイッチを記憶しているルータは物理アドレス(10.0.0.5)を回復し、10.0.0.5で応答を受け取ることができます。