少なくとも 2 つのバージョンの Linux (Ubuntu 9 と Debian 7) では、lo にループバック アドレス (標準の 127.0.0.1) が 1 つしか設定されていないにもかかわらず、任意の 127.xxx アドレスへのパケットが問題なく受け入れられることに気づきました。他の Unix バリアントでは未設定のアドレスへのパケットがドロップされるため、これは非常に意外なことでした。
- なぜ/どのようにしてこれが起こるのでしょうか? これは他のアドレス範囲では発生しませんよね?
- もっと賢明な(そして安全な!)ことを実行し、設定されているアドレスに実際に注意を払うにはどうすればよいですか?
編集: RFC 5735を読みましたが、これはかなりいい加減な解釈です。「127.0.0.0/8 ブロック全体のアドレスは、ネットワーク上のどこにも正当に表示されません」に「このマシンはこれらすべての IP のパケットを受け入れる必要があります」結局のところ、これらのアドレスの 1 つが設定されているという理由だけで、ホストが 172.16.0.0/12 のすべてに対するパケットを受け入れることはありません。
私の意図は、アドレスの仕様について質問することではなく、パケットを受け入れるためのロジックの Linux 実装について質問することでした。ここでの「なぜ」と「どのように」は、実際の Linux カーネルの何が通常の「このパケットは自分宛か」というロジックをバイパスさせるのかを意味します。
答え1
ループバックは特別です。これは 127.0.0.0/8 空間全体であり、マシンから外に出ることはありません。これは、構成されたアドレスのみをリッスンすることに対する唯一の例外であり、ループバック上にある場合は特別です。
これらのアドレスは物理ネットワーク上に存在できないため、セキュリティに影響があるとは考えられません。
答え2
通常のルートロジックではありませんバイパスされ、この構成より安全あなたが提案するものよりも。
まず、ルーティング テーブルを見て何が起こっているのか確認してみましょう。
# ip address show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# ip route show table 0
...
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
インターフェースがプレフィックスで設定されていることがわかります/8
。これにより、Linuxは自動的に127.0.0.0/8
インターフェイスに向かうルートを生成しますlo
。これにより、このブロックのすべてのパケットがネットワーク上のどこにも現れず、ホスト内でループバックするという要件が強制されます。
このルートがなければ、127.0.0.0/8
ネットワークのパケットはないホスト内でループバックされ、ネットワーク インターフェイスからルーティングされる可能性があります。これにより、セキュリティが損なわれ、RFC に準拠しなくなります。
「ループバック」とは、まさにその意味であることを覚えておいてください。通常のインターフェイスでは、そこに送信されたパケットは外部に送られますが、ループバック インターフェイスでは、そこに送信されたパケットは外部に送られ、すぐに返されます。これがループバックの意味であり、このトラフィックが表示される理由です。
答え3
これはLinux固有のものではなく(Windowsでも全く同じように動作します)、むしろ仕様に従っています(Ericが指摘したように):RFC 5735 - 特殊用途 IPv4 アドレス
127.0.0.0/8 - This block is assigned for use as the Internet host
loopback address. A datagram sent by a higher-level protocol to an
address anywhere within this block loops back inside the host. This
is ordinarily implemented using only 127.0.0.1/32 for loopback. As
described in [RFC1122], Section 3.2.1.3, addresses within the entire
127.0.0.0/8 block do not legitimately appear on any network anywhere.