FreeBSDでループバックデバイスのアドレスにpingできないのはなぜですか?


10

ウィキペディアから:

ループバックデバイスで最も一般的に使用されるIPアドレスは、IPv4の場合127.0.0.1ですが、127.0.0.0から127.255.255.255の範囲のアドレスはすべてマッピングされます。

これは、少なくともFreeBSDでは正しくありません。

$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address

これは正しい動作ですか?

回答:


9

FreeBSD(OS Xも、NetBSDとOpenBSDも信じています)は、他のインターフェイスのアドレスの場合と同様に、ループバックインターフェイスの設定されたアドレスに送信された要求に応答します-回答が必要な場合は、最初にアドレスを割り当てる必要があります:

mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
ping: sendto: Can't assign requested address
^C

[mgraziano@monitor ~]$ sudo ifconfig lo0 alias 127.1.1.1 netmask 0xFFFFFFFF

[mgraziano@monitor ~]$ ifconfig lo0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet 127.1.1.1 netmask 0xffffffff 
    nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

[mgraziano@monitor ~]$ ping 127.1.1.1
PING 127.1.1.1 (127.1.1.1): 56 data bytes
64 bytes from 127.1.1.1: icmp_seq=0 ttl=64 time=0.020 ms
^C

この実装の背後にあるロジックについては、RFC 3330を参照してください。

127.0.0.0/8-このブロックは、インターネットホストの
ループバックアドレスとして使用するために割り当てられます。上位レベルのプロトコルによって
このブロック内の任意のアドレスに送信されたデータグラムは、ホスト内でループバックする必要があります。
これは通常、loopback127.0.0.1/32のみを使用して実装され
ますが、このブロック内のアドレスは
どこのネットワークにも表示されません[ RFC1700、ページ5]。

(強調は私のもの)
LinuxとWindowsはここで「役に立ちました」が、私の議長から、このホストに割り当てられていないアドレスに送信されたリクエストに応答すると、正しく動作しません...


7

FreeBSD 8.1で説明したのと同じ動作が見られます。FreeBSDと一部のDNAを共有するMac OS Xも、127.0.0.1のみをマップしているようです。

Windows 7とLinux(カーネル2.6.26のdebian)はどちらも、Wikipediaの引用にあるように(RFCで規定されているように)完全なアドレス範囲をマップしているように見えます。

RFC 3330から引用するには:

127.0.0.0/8-このブロックは、インターネットホストのループバックアドレスとして使用するために割り当てられます。上位レベルのプロトコルによってこのブロック内の任意のアドレスに送信されたデータグラムは、ホスト内でループバックする必要があります。これは通常、ループバックに127.0.0.1/32のみを使用して実装されますが、このブロック内のアドレスはネットワーク上のどこにも表示されません[RFC1700、5ページ]。

「すべき」という言葉をどれだけ厳密に解釈するかによって、FreeBSD / MacOSの動作が間違っていると主張する人もいます。しかし、ループバックアドレスとして127.0.0.1が至る所で使用されていることを考えると、それが問題になる可能性は低いと思います。


3
+1デフォルトでは、127.0.0.1のみがlo0に割り当てられます。残りは確かに追加できますが、それが重要である多くの状況を想像することはできません。
クリスS

また、「ホスト内部のループバック」をどのように解釈するかも異なります。これは本質的に、データグラムが意味のある場所に配信されることを意味しますか。または単にRFCに続くもので、データグラムはネットワーク上の別のホストに配信されません。(私はFreeBSDとダーウィン、後者に同意します)
Chris S

また、明示的に割り当てられていないアドレスに対するリクエストへの応答の「正確さ」をどのように見るかにも依存します。アドレスが割り当てられていない場合、自分のアドレスであるかのように応答を送信するビジネスはないと私は常に感じていました。ブロードキャストリクエストの例外を除きます。
voretaq7

また、私がしたのと同じRFCを引用するための+1 :)
voretaq7 '25

2
@ voretaq7完全に最初に引用しました。:)
eaj

0

その裏付けとなるトレンド。FreeBSDかあなたの設定かどうかを確認するのに便利なFreeBSD箱はありません。

RFCには127.0.0.1/24と記載されているため、応答する必要があります。


1
実際には、RFCは127.0.0.0/8を示していますが、その範囲内で使用する特定のアドレスを指定していません。慣例としてlocalhost、その範囲内の最初の使用可能なアドレス(127.0.0.1)はとして割り当てられていますが、127.32を使用できます。必要に応じて、独自のOS実装で.194.75。(しかし、そうすることで怒っているシステム管理者にリンチされるかもしれません…)
voretaq7

0

質問は今では3回程度で完全に回答されているので、数セントだけ追加したかったのです。

かなり長い間、デフォルトのipfw configがこの種のパケットをドロップすることに注意してください:

./rc.firewall:  ${fwcmd} add 100 allow ip from any to any via lo0
./rc.firewall:  ${fwcmd} add 300 deny ip from 127.0.0.0/8 to any

ファイアウォールを有効にする代わりに

ping: sendto: Can't assign requested address

あなたは得るかもしれません

[savetherbtz@PH34R ~]$ ping 127.0.0.2
PING 127.0.0.2 (127.0.0.2): 56 data bytes
ping: sendto: Permission denied

PS。原因としては、INET(IPv4サポート)なしでサーバーを構築でき、127.0.0.1=)もない

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.