为什么不能在FreeBSD下ping回送设备上的地址?


10

维基百科

对于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:


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-该块被分配用作Internet主机
回送地址。由更高层协议发送到
该块内任何地方的地址的数据报应在主机内部循环。
通常,仅使用127.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-该块被分配用作Internet主机回送地址。由更高层协议发送到该块内任何地方的地址的数据报应在主机内部循环。通常,仅使用127.0.0.1/32进行环回即可实现此功能,但是此块内的任何地址都不应出现在任何网络上的任何地方[RFC1700,第5页]。

根据您对“应该”一词的解释的严格程度,某些人可能会认为FreeBSD / MacOS行为是错误的。但是,鉴于普遍使用127.0.0.1作为回送地址,我怀疑这可能很重要。


3
+1默认情况下,仅127.0.0.1被分配给lo0。虽然您当然可以添加其余部分;我无法想象在许多情况下这很重要。
克里斯·S

它还取决于您如何解释“在主机内部循环”。这是否固有地意味着数据报将在有意义的地方传递?或者只是遵循RFC,数据报将不会传递到网络上的另一台主机。(我同意FreeBSD和Darwin,后者)
Chris S

这也取决于您如何看待未明确分配给您的地址上的答复请求的“正确性”-我一直认为,如果未分配该地址,您将不会像发送您的邮件那样发送答复,除了广播请求外。
voretaq7 2011年

也为引用我做过的同一RFC +1 :)
voretaq7 2011年

2
@ voretaq7我首先引用了它。:)
eaj

0

它逆势而上。没有方便的FreeBSD框来确认它是FreeBSD还是您的配置。

RFC表示127.0.0.1/24-因此它应该响应。


1
实际上,RFC表示127.0.0.0/8,但未指定要使用该范围内的哪个特定地址:按照惯例,该范围内的第一个可用地址(127.0.0.1)被分配为localhost,但是您可以使用127.32如果需要,请在自己的OS实施中添加.194.75。(但是,这样做可能会让生气的系统管理员将您处以私刑……)
voretaq7 2011年

0

到现在为止,有关问题的答案已经三遍了,所以我只想加些毛钱。

请注意,一段时间以来,默认的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=)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.