ユーザー空間でdstアドレスが127.0.0.0/8のUDPパケットを受信する方法

ユーザー空間でdstアドレスが127.0.0.0/8のUDPパケットを受信する方法

Linuxでは127.0.0.0/8 dstアドレスを使用しますが、外部インターフェイスから来るユーザースペースでUDPパケットを受信できるかどうかを知りたいです。

ncでテストすると、ncがすべてのアドレスにバインドされているがパケットを受信できないことがわかります。

存在するデバイス1ローカルルーティングテーブルを操作してこのパケットを必要なインターフェイスにルーティングし、テストパケットを送信します。
デバイス1:

frr:~# ip route show table local 
...  
127.1.1.1 nhid 17  encap mpls  16 via 10.10.10.5 dev eth5
...
frr:~# echo "foo" | nc -w1 -u -v -s 3.3.3.3 127.1.1.1 3503

デバイス2:

frr:~# nc -l -u -p 3503

次のパケットは、デバイス 2 インターフェイスの Wireshark で生成され、キャプチャされます。 ここに画像の説明を入力してください。

私はその基礎を知っています。RFC 1812これは絶対にしてはいけません。一方、これは有効なユースケースです。RFC4379。ここでのトリックは、私が送信するパケットが実際にIPルーティングではなくMPLSスイッチングされ、最後のホップでPHP(2番目のホップポップアップ)が原因でMPLSラベルが失われ、127.0.0.0 /を使用することです。目標は8つの住所です。 dst は、ラベルスタックが使い果たされた場合、または有効なネクストホップがない場合にルータが IP アドレスに基づいて転送せず、代わりにパケットを処理することを保証することです。これをMPLS OAMまたはLSP Pingと呼びます。

ベストアンサー1

基本的にLinuxカーネルは、これらの送信元または宛先を含むパケットに対してパスチェックを実行するときにRFC 1812を適用します。以下はいくつかの例です。 IPv4:1 2 サム 4 5、ARP:6。すべて似ているようです。

  if (ipv4_is_loopback(saddr) && !IN_DEV_ROUTE_LOCALNET(in_dev))
      return -EINVAL;

アドレスの送信元または宛先が127.0.0.0/8内にあり、これがホスト内で発生しない場合、つまりループバックインターフェイスを介してパケットが破棄されます...専用でない限りシステム制御スイッチroute_localnet(上記のマクロで確認済み)が有効になり、この場合、アドレスは通常のルーティング可能アドレスとして扱われます。

route_localnet- ブール値

ルーティング時にループバックアドレスを火星のソースまたは宛先として扱わないでください。これにより、127/8 をローカルルーティング目的で使用できます。

デフォルトはFALSE

したがって、インターフェイスがルーティングスタックによって破棄されずにこれらのトラフィックを受け入れたりエクスポートしたりするには、そのインターフェイスでトランジションを有効にする必要があります。インターフェースの場合は、eth5以下を使用して実行できます。

sysctl -w net.ipv4.conf.eth5.route_localnet=1

カプセル化がどのように実行されるか、および全体の設定によっては、異なるインターフェイスが含まれる場合があります。疑わしい場合は、all最初に使用するのではなく、そのインターフェイスを使用してください。eth5


以下は、ネットワーク内のこれらのパケットについてSUによって回答された質問です。

127.0.0.1/8のアドレス宛のパケットをUbuntuのネットワークに送信します。

ヒント:無効化も可能rp_filter操作が開始されるまで、どこからでも(allおよび含む)デバッグするとき。defaultこれは一部につながるものですRTNETLINK answers: Invalid argumentみんな双方向ルーティングが正しく設定されました。


このRFC 4379のユースケースに加えて、より一般的なシナリオは、サービスをループバックアドレスにのみバインドするアプリケーションを安価に克服するために、ターゲットNATを達成して一般アドレスをループバックアドレスに変更することです。単純化された例:

iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080

ルーティングスタック自体がパケットを表示するため、スイッチングが有効になっている場合にのみ機能します。ループバック中ではありません内部的にはループバックアドレス(受信先、応答元)があります。そのようなパケットは実際には回線には現れませんが(NATが発生した場合)、ルーティングスタックはそれを知らないため、チェックを無視する必要があります。

おすすめ記事