ループバックインターフェイスの仕組み

ループバックインターフェイスの仕組み

いくつかの奇妙なことがあります。

私の仮想マシン:
centos7

相互作用:

enp0s3: 192.168.10.110/24
lo:0 10.0.3.110/24 (ip alias)

路線:

default via 10.0.3.2 dev lo
192.168.10.0/24 dev enp0s3

enp0s3 is plugged in 10.0.3.0/24

ip_forwardを有効にしました(net.ipv4.ip_forward = 1)。


私の質問:

ping 10.0.3.2効果的ですが、なぜ?

tcpdumpパケットを取得できませんが、enp0s3パケットを取得できますlo

デフォルトのパスはですlo。なぜping 10.0.3.2動作しますか?なぜパケットを受信できないのですかenp0s3

ベストアンサー1

ループバックインターフェイスは仮想インターフェイスです。ループバックインターフェイスの唯一の目的は、送信されたパケットを返すことです。つまり、ループバックインターフェイスに送信されるすべてのコンテンツがそのインターフェイスで受信されます。ループバックインターフェイスにデフォルトパスを設定することはあまり意味がありません。なぜなら、パケットを送信できる唯一の場所は、インターフェイス出力から入力ループまでの仮想ラインであるからです。ループバックインターフェイスのこの動作を変更できるものは何もありません。これがループバックインターフェイスの目的です。

10.0.3.2に対してpingを実行すると、一部の外部デバイスではなくループバックインターフェイス自体から応答が発生します。たとえば、ループバックインターフェイスにアドレスを追加する場合

sudo ip addr add 10.0.3.1/24 dev lo

10.0.3.0/24パスが追加されました。あなたはこれを見ることができます

ip route show table local

それはまるで

local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1

表示されます。このルーティングテーブルエントリは、との間のすべてのアドレスに送信されたパケットがインターフェイスを介して送信され、そのインターフェイス10.0.3.1からすぐに返されることを示します。10.0.3.254lo

編集:以下のコメントの説明です。

10.0.3.2をpingすると、次のことが起こります。カーネルは、宛先アドレスが10.0.3.2の配信用IPパケットを受け取ります。転送される他のパケットと同様に、カーネルはルーティングテーブルを参照します。この場合、一致するものはです。これは、パケットが送信元local 10.0.3.0/24 dev lo proto kernel scope host src 10.0.3.1アドレス 10.0.3.1 のインターフェイスを介して送信される必要があることを示します。lo

loパケットがインターフェイスに送信されたので、ループバックインターフェイスは通常実行するアクションを実行します。つまり、パケットを送信キューから取り出し、受信キューに入れます。カーネルの観点から見ると、ソケットでリッスンするサーバープロセスに使用できる受信パケットがあります。 (pingの場合、カーネルは内部的にそれを処理します。)これで、宛先アドレスが10.0.3.2の「リモート」ICMPパケットを受信します。これは間違いなくローカルアドレスの1つではありませんが、リングバックに渡されます。それでもインターフェイスに。

次に、カーネルはpingへの応答を送信します。つまり、逆方向アドレスを持つICMP応答パケットです。送信元アドレスは10.0.3.2、宛先アドレスは10.0.3.1です。これは、ループバックインタフェースを介してpingプログラムに戻され、10.0.3.2で応答を受信したことを示します。

おすすめ記事