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

Mat*_*ett 4 networking linux loopback

在具有正常环回接口的 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)
Run Code Online (Sandbox Code Playgroud)

当我 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
Run Code Online (Sandbox Code Playgroud)

这种行为是 Linux 特有的,因为我在 Mac OS X Lion 机器上看不到它。我没有为环回接口设置任何 IP 别名,这正是我希望完成这项工作时要做的。

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

use*_*517 6

Windows 也有这种行为。我猜这是对rfc 3330 的不同解释

127.0.0.0/8 - 该块被分配用作 Internet 主机环回地址。由更高级别协议发送到该块内任何地址的数据报应该在主机内部循环。这通常仅使用 127.0.0.1/32 实现环回,但此块内的地址不应出现在任何网络的任何位置 [RFC1700,第 5 页]。

看起来 Linux 将此解释为意味着 127.0.0.0/8 范围内的任何(甚至是未配置的地址)都应该被环回,然后您会收到来自 ping 的响应。

  • RFC 3330 已被 [RFC 5735](http://tools.ietf.org/html/rfc5735) 废弃,它将这种行为的必要性从“应该”改为“做”。这意味着 Linux 和 Windows 实现是正确的,而其他所有人都是错误的。或者他们定义了标准。谁知道? (2认同)

Dav*_*rtz 5

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

IP-address ::= { <Network-number>, <Host-number> }
...
{127, <any>}
内部主机环回地址。永远不应该出现在主机之外。

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