在具有环回网络接口的 FreeBSD 系统上......
% ifconfig lo0 洛0 链接环回 drv_running 运行多播 nd6 Performnud auto_linklocal no_radr 链接 rxcsum txcsum hwcsum rxcsum_ipv6 txcsum_ipv6 链路地址度量 0 mtu 16384 类型 24 链路状态 0 物理 0 波特率 0 inet4 地址 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet6 地址 ::1 范围 0 prefixlen 128 bdaddr ::1 范围 0 inet6 地址 fe80::1 范围 3 prefixlen 64 inet6 地址 ::2 范围 0 prefixlen 128 inet4 地址 127.53.0.1 prefixlen 8 bdaddr 127.53.0.1 inet4 地址 127.53.1.1 prefixlen 8 bdaddr 127.53.1.1 %
... ping IP 地址 127.0.0.2(未分配给该(或任何其他)网络接口)会导致失败:
% ping -c 1 127.0.0.2 PING 127.0.0.2 (127.0.0.2):56 个数据字节 ping: sendto: 网络无法访问 --- 127.0.0.2 ping 统计数据 --- 发送 1 个数据包,接收 0 个数据包,100.0% 数据包丢失 %
OpenBSD 也是如此:
% ping -c 1 127.0.0.2 PING 127.0.0.2 (127.0.0.2):56 个数据字节 ping: sendto: 网络无法访问 ping:写入 127.0.0.2 64 个字符,ret=-1 --- 127.0.0.2 ping 统计数据 --- 发送 1 个数据包,接收 0 个数据包,100.0% 数据包丢失 %
但在 Linux 上,同样没有配置 127.0.0.2……
% ifconfig 洛 罗 链接环回运行 链接地址 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 地址 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 地址 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 地址 ::2 范围 0 prefixlen 128 inet6 地址 fe80:: 范围 1 prefixlen 10 inet6 地址 ::1 范围 0 prefixlen 128 %
… ping 出人意料地成功:
% ping -c 1 127.0.0.2 PING 127.0.0.2 (127.0.0.2) 56(84) 字节数据。 来自 127.0.0.2 的 64 字节:icmp_seq=1 ttl=64 时间=0.044 ms --- 127.0.0.2 ping 统计数据 --- 发送 1 个数据包,接收 1 个数据包,丢包 0%,时间 0ms rtt 最小值/平均值/最大值/mdev = 0.044/0.044/0.044/0.000 毫秒 %
怎么会?
相关问题
- ”什么时候不需要为网络接口分配 IP 地址?“ - 非常迂回的问题,要求对“虚拟接口”进行解释,这个问题直接问
- ”如何才能成功向所有 127.0.0.0/8 发送 ping 操作?“ — 几个问题合而为一,而不是每个问题一个问题,并且事实上没有回答通过所谓的重复
- ”为什么 Linux 网络中通过环回接口出现这种行为“ - 关于为什么在 Linux 上
lo
界面似乎还控制分配给的 IP 地址的 ping 能力其他网络接口(同样不是 BSD 上的行为) - ”Linux 上到非环回地址的本地 LAN 流量会发生什么情况?“——一个关于非环回行为
其他参考资料
- 乔纳森·德博因·波拉德 (2019)。
ifconfig
。 小吃指南。软件。
答案1
ip-route
用于操作内核路由表中的条目。路线类型:
unicast
- 路由条目描述了到路由前缀所覆盖的目的地的真实路径。...
local
- 目的地被分配给该主机。数据包被环回并在当地交付。
$ ip -4 route show table all type local
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
local 172.16.8.139 dev wlp2s0 table local proto kernel scope host src 172.16.8.139
local 192.168.122.1 dev virbr0 table local proto kernel scope host src 192.168.122.1
$ ip -4 address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.16.8.139/24 brd 172.16.8.255 scope global dynamic noprefixroute wlp2s0
valid_lft 36391sec preferred_lft 36391sec
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
当接口添加地址时,会自动为该地址添加一条本地路由。此外,当将地址添加到环回接口 ( IFF_LOOPBACK
) 时,还会为该接口添加一条本地路由网络前缀地址的。在 Linux 5.0 中,你可以找到这个实现fib_add_ifaddr()。
相反,当将地址添加到非环回接口时,单播为网络前缀添加路由。
$ ip -4 route show table all type unicast
default via 172.16.8.1 dev wlp2s0 proto dhcp metric 600
172.16.8.0/24 dev wlp2s0 proto kernel scope link src 172.16.8.139 metric 600
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
本地路由被添加到名为“local”的特定表中。这样做最明显的意义是,快速ip -4 route
不会显示本地表。这是因为它相当于ip -4 route show table main
.
linux-ip.net 有一些更广泛的信息。它提到了本地表的另外两个用途。
上述内容可能适用于您遇到的任何 Linux 版本。我不确定它到底可以追溯到多久以前。然而这个ip route
命令已经很古老了;它至少可以追溯到 Linux 2.2 时代。