为什么我无法在 FreeBSD 下 ping 回环设备上的地址?

为什么我无法在 FreeBSD 下 ping 回环设备上的地址?

维基百科

环回设备上最常用的 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

这是正确的行为吗?

答案1

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 进行环回
此地址块内的任何地址都不应出现在任何
地方的任何网络上 [RFC1700,第 5 页]。

(重点是我的)
Linux 和 Windows 在这里很“有帮助”,但是从我的座位上回答发送到一个地址的请求未分配给该主机不是正确的行为...

答案2

我在 FreeBSD 8.1 上看到了您描述的相同行为。与 FreeBSD 共享某些 DNA 的 Mac OS X 似乎也只映射 127.0.0.1。

Windows 7 和 Linux(带有 2.6.26 内核的 D​​ebian)似乎都映射了完整的地址范围,正如您在 Wikipedia 引文中描述的那样(以及 RFC 中规定的那样)。

引用 RFC 3330:

127.0.0.0/8 - 此地址块指定为 Internet 主机环回地址。由更高级别协议发送到此地址块内任意地址的数据报应在主机内环回。这通常仅使用 127.0.0.1/32 进行环回,但此地址块内的任何地址都不应出现在任何网络上 [RFC1700,第 5 页]。

根据您对“应该”一词的严格程度,有些人可能会认为 FreeBSD/MacOS 的行为是错误的。但考虑到 127.0.0.1 被广泛用作环回地址,我怀疑这不会有什么影响。

答案3

它与趋势背道而驰。手边没有 FreeBSD 盒子,无法确认是 FreeBSD 还是您的配置。

RFC 说 127.0.0.1/24 - 所以它应该响应。

答案4

到现在为止,这个问题已经得到了完整的回答,所以我只想补充一些内容。

请注意,相当长的一段时间内,默认的 ipfw 配置会丢弃此类数据包:

./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. 当然可以建立没有INETIPv4 支持的服务器,你甚至不会有127.0.0.1=)

相关内容