Networking

為什麼我在 FreeBSD 下無法 ping 回環設備上的地址?

  • July 28, 2011

來自維基百科

環回設備上最常用的 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

這是正確的行為嗎?

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 - 此塊被分配用作 Internet 主機

環回地址。由更高級別協議發送到

該塊內任何地址的數據報應在主機內部循環。

這通常僅使用 127.0.0.1/32 for loopback 來實現

但此塊內的任何地址都不應該出現在任何

地方的任何網路上 [ RFC1700,第 5 頁]。

(強調我的)

Linux和Windows在這裡“有幫助”,但是從我的椅子上回答發送到未分配給該主機的地址的請求是不正確的行為……

引用自:https://serverfault.com/questions/293874