在 Linux 内核 4.19.94+ 上,我可以看到分配给接口 eth0 的 IPv4 私有地址和链路本地地址,如下所示。我的理解是,自动专用IP寻址(APIPA)IP地址(169.254.0.0/16)仅在DHCP服务器没有分配IP地址时分配。
根据比尔·曼宁的说法记录特殊用途 IPv4 地址块规范:
169.254.0.0/16 已被指定为在找不到 DHCP 服务器时用于终端节点自动配置的 IP 范围。因此,网络运营和管理员应该非常积极地确保路由通告和数据包转发都不会跨越任何媒体边界。对于互联网以及任何使用 IP 协议的专用网络来说都是如此。终端节点管理员应注意,某些供应商会自动配置此前缀并将其添加到节点转发表中。这将导致运行路由器发现或已弃用的路由协议(例如 RIP)的站点出现问题。
根据上述信息,请有人澄清以下问题:
当 DHCP 服务器成功分配 IPv4 地址时,是什么导致在 Linux 版本 4.19.94 上分配 169.254.0.0/16?
人们发现这会在发送广播消息时引起问题。
当为接口分配私有 IP 地址时,如何禁用链路本地分配?
此分配是否会导致重复的网络数据包或增加网络开销,尤其是在使用 SSDP 协议或其他服务协议时。
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1492 qdisc mq qlen 1000
link/ether 00:1c:2b:13:06:2f brd ff:ff:ff:ff:ff:ff
inet 169.254.196.187/16 brd 169.254.255.255 scope link eth0
valid_lft forever preferred_lft forever
inet 192.168.0.20/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::21c:2bff:fe13:62f/64 scope link
valid_lft forever preferred_lft forever
答案1
上述行为是由配置的网络部分中的分配“LinkLocalAddressing=yes”引起的systemd/network/10-eth0.network
。
这显然是 systemd 网络的一个错误;可以在此处查看此错误的详细信息 https://github.com/systemd/systemd/issues/13316;
由于当前的 systemd 错误,当未找到 DHCP 服务器时,将无法分配 IPV4LL(IPV4 链路本地地址)地址。
如果LinkLocalAddressing=fallback
设置,则 DHCP 客户端在分配 IPV4LL 地址后将停止侦听 DHCP 服务器。这意味着RFC 3927 (Ref https://tools.ietf.org/html/draft-ietf-dhc-dna-ipv4-01).
当 DHCP 服务器重新上线时,之前分配的 IPV4LL 地址将不会被删除,并且来自 DHCP 服务器的新地址将永远不会分配给客户端。