为什么 ifconfig 仅显示使用 systemd-networkd 配置的网络接口的第一个 IP?

为什么 ifconfig 仅显示使用 systemd-networkd 配置的网络接口的第一个 IP?

所以我不确定这里发生了什么,但我在 Ubuntu 17.04(最新版)上的多个不同服务器上重复了这个问题,但我找不到任何其他关于此问题的报告,所以我不得不想象我做错了什么。我只是不知道是什么。

简而言之,我可以配置一个接口,使其systemd.networkd具有多个 IP。它们将显示如下:

root@nuprobe:/etc/systemd/network# ip addr show dev mike-home
11: mike-home: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 4088 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d8:eb:97:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 10.12.1.2/24 brd 10.12.1.255 scope global mike-home
       valid_lft forever preferred_lft forever
    inet 10.12.1.3/24 brd 10.12.1.255 scope global secondary mike-home
       valid_lft forever preferred_lft forever

但是,如果我使用查询相同的内容ifconfig,而后续 IP 通常会获得名为mike-home:N(N 为数字)的伪网络设备,这是完整的输出:

root@nuprobe:/etc/systemd/network# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4559  bytes 659801 (659.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4559  bytes 659801 (659.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

mike-home: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 4088
        inet 10.12.1.2  netmask 255.255.255.0  broadcast 10.12.1.255
        ether d8:eb:97:b6:0b:64  txqueuelen 1000  (Ethernet)
        RX packets 54202  bytes 67720330 (67.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 36690  bytes 4503051 (4.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

你知道发生了什么事吗?

这是我的systemd.network文件:

[Match]
Name=mike-home

[Link]
MACAddress=d8:eb:97:b6:0b:64
MTUBytes=4088
ARP=true

[Network]
BindCarrier=mike-home
Description=Mike Home Network
DHCP=no
IPv4LLRoute=no
MulticastDNS=no
LinkLocalAddressing=no
Domains=vasto.la

[Address]
Address=10.12.1.2/24
Broadcast=10.12.1.255
PreferredLifetime=forever

[Address]
Address=10.12.1.3/24
Broadcast=10.12.1.255
PreferredLifetime=forever

[Route]
Gateway=10.12.1.1
Source=10.12.1.0/24
PreferredSource=10.12.1.2
Destination=10.12.5.0/24
Scope=link

[Route]
Gateway=10.12.1.1
Source=10.12.1.0/24
PreferredSource=10.12.1.2
Destination=10.12.10.0/24
Scope=link

[Route]
Gateway=10.12.1.1
Source=10.12.1.0/24
PreferredSource=10.12.1.2
Destination=10.12.20.0/24
Scope=link

# vim: set filetype=systemd:

欢迎提出任何猜测。

答案1

当前的 Linux 工具不再创建“别名”伪接口,因为它们没有必要这样做——从 Linux 内核开始2.4.x,现代基于 Netlink 的网络配置 API 允许他们使用添加/删除操作直接将地址列表分配给同一个 eth0 接口。

同时,ifconfig 使用更老的“SIOCGIFADDR”API 来检索 IP 地址,该 API 不支持每个接口管理多个地址(例如,它只有一个覆盖当前地址的“set”操作,但没有“add”或“remove”操作)。别名接口仅作为此限制的解决方法而存在。

如今,别名伪接口不再是“真实的”——它们是通过设置每个地址的“标签”参数从 eth0 地址列表中模拟出来的。例如,如果您需要通过“eth0:0”看到特定地址(无论是用于 ifconfig 还是其他一些古老的工具),您可以要求 systemd-networkd 将其设置为标签:

[Address]
Address=10.12.1.3/24
Label=mike-home:0
ip addr add 10.12.1.3/24 dev mike-home label mike-home:0

然而,这在实践中其实并不是必要的——你的所有附加地址都可以正常工作,即使没有分配“标签”也是如此;仅有的‘ifconfig’工具无法看到它们。

(Linux 的 ifconfig 不能使用 Netlink 执行所有操作,这没有什么根本原因 —— 据我所知,只是没有人将它移植到 Netlink,因此该工具仍然停留在过去。不要使用它,而是使用ip。)


所有这些都是 Linux 所特有的。例如,在各种 BSD 系统上,ifconfig 仍然是主要的网络配置工具,并与系统的其余部分一起保持更新。

相关内容