从维基百科:
对于IPv4,回送设备上最常用的IP地址是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
这是正确的行为吗?
从维基百科:
对于IPv4,回送设备上最常用的IP地址是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
这是正确的行为吗?
Answers:
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在这里“很有帮助”,但是从我的主席那里答复了发送到未分配给该主机的地址的请求是不正确的行为...
我看到了与您在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-该块被分配用作Internet主机回送地址。由更高层协议发送到该块内任何地方的地址的数据报应在主机内部循环。通常,仅使用127.0.0.1/32进行环回即可实现此功能,但是此块内的任何地址都不应出现在任何网络上的任何地方[RFC1700,第5页]。
根据您对“应该”一词的解释的严格程度,某些人可能会认为FreeBSD / MacOS行为是错误的。但是,鉴于普遍使用127.0.0.1作为回送地址,我怀疑这可能很重要。
它逆势而上。没有方便的FreeBSD框来确认它是FreeBSD还是您的配置。
RFC表示127.0.0.1/24-因此它应该响应。
localhost
,但是您可以使用127.32如果需要,请在自己的OS实施中添加.194.75。(但是,这样做可能会让生气的系统管理员将您处以私刑……)
到现在为止,有关问题的答案已经三遍了,所以我只想加些毛钱。
请注意,一段时间以来,默认的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
=)