Linux 上的环回接口捕获所有环回流量

Linux 上的环回接口捕获所有环回流量

在具有正常环回接口的Linux机器上:

$ ifconfig lo
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:36621784 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36621784 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:6752024976 (6.2 GiB)  TX bytes:6752024976 (6.2 GiB)

当我 ping 127.0.0.0/8 范围内的任何添加地址时,我收到了响应:

$ ping -c1 127.7.23.4
PING 127.7.23.4 (127.7.23.4) 56(84) bytes of data.
64 bytes from 127.7.23.4: icmp_seq=1 ttl=64 time=0.045 ms

--- 127.7.23.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms

此行为是 Linux 特有的,因为我在 Mac OS X Lion 机器上没有看到它。我没有为环回接口设置任何 IP 别名,而这正是我期望它工作的原因。

为什么会发生这种情况?这是预期的行为吗?

答案1

Windows 也有这种行为。我猜这是对rfc3330

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

看起来 Linux 将其解释为 127.0.0.0/8 范围内的任何地址(即使是未配置的地址)都应该环回,然后您就会收到来自 ping 的响应。

答案2

该行为记录在RFC 1700.127.7.23.4也是一个环回地址,也分配给本地机器。(它还会分配给什么?)

IP 地址 ::= { <网络号>, <主机号> }
...
{127, <任意>}
内部主机环回地址。不应出现在主机外部。

无需让此范围内的所有地址都起作用,但在处理不允许指定端口而只允许指定 IP 地址的协议时,这种方法特别方便。拥有多个本地 IP 地址允许您运行这些服务器的多个实例以供本地使用。

答案3

这确实是 Linux(也可能是其他操作系统)所特有的。

但当你读到RFC 1700lo网络掩码设置,环回网络应被视为 A 类。

供你参考:

  • BSD 机箱(如 Mac OS X)限制为 127.0.0.1/32(即仅为 127.0.0.1,按照RFC 3300-2002 年 9 月)。

  • Windows 框响应 127.0.0.0/8(即从 127.0.0.1 到 127.254.255.255)。

所以,这次看来 Windows 是正确的(直到 2002 年);)

相关内容