所以我不确定这里发生了什么,但我在 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 仍然是主要的网络配置工具,并与系统的其余部分一起保持更新。