Warum zeigt ifconfig nur die erste IP-Adresse einer mit systemd-networkd konfigurierten Netzwerkschnittstelle an?

748
mikev

Ich bin mir nicht sicher, was hier vor sich geht, aber ich habe dieses Problem auf mehreren verschiedenen Servern auf Ubuntu 17.04 (auf dem neuesten Stand) kopiert. Ich kann jedoch keine anderen Berichte darüber finden, also muss ich mir vorstellen, dass ich es bin etwas falsch machen Ich habe einfach keine Ahnung was.

Kurz gesagt, ich kann eine Schnittstelle mit systemd.networkdmehreren IPs konfigurieren . Sie werden so auftauchen:

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 

Wenn ich jedoch dasselbe abfragen ifconfigmöchte, während die nachfolgenden IPs normalerweise Pesudo-Netzwerkgeräte erhalten würden mike-home:N(N ist eine Zahl), ist dies die Gesamtheit der Ausgabe:

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 

Irgendwelche Ideen, was los ist?

Hier ist meine systemd.networkDatei:

[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: 

Irgendwelche Vermutungen (mehr als willkommen).

2
Als Randbemerkung gilt Folgendes: 1) Broadcast kann immer aus der Netzmaske berechnet werden. Stellen Sie die Einstellung also nur ein, wenn Sie ein _really_ special network haben. 2) Quellbasiertes Routing (`Source =`) ist nur unter Linux für IPv6 implementiert. Wenn Sie es tatsächlich für IPv4 benötigen, müssen Sie "ip rule" verwenden. 3) Routen mit einem Gateway per Definition haben keinen Linkbereich ... grawity vor 6 Jahren 0
Guter Fang (e). Alle behoben (entfernte `Source =`, `Scope =` und `Broadcast =`), aber müssen `Source =` wieder hinzufügen, aber jetzt bekomme ich den Fehler `Route konnte nicht gesetzt werden. Das Netzwerk ist nicht erreichbar.` dreimal, wenn das Interface angezeigt wird. Irgendeine Idee, woran das liegen würde? Ich kann "10.12.1.1" anpingen und ethtool meldet einen guten Link, aber die Routen werden nicht hinzugefügt. mikev vor 6 Jahren 0

1 Antwort auf die Frage

0
grawity

In Linux, die "alias" Schnittstellen wie eth0:0sind optional. Sie werden nur für die Kompatibilität mit der alten, auf Ioctl basierenden API "SIOCGIFADDR" für IPv4 emuliert, die ansonsten nicht mehrere Adressen pro Schnittstellenname unterstützt. ifconfigDies wird bis heute verwendet.

In der Zwischenzeit arbeiten Tools, die die moderne Netlink-Schnittstelle verwenden, wie ipoder systemd-networkdeinfach mit einer Liste von Adressen, die sich alle auf derselben Hauptschnittstelle befinden. Dies entspricht auch dem Verhalten von IPv6 seit dem ersten Tag.

Wenn Sie IPv4 - Adressen über Netlink hinzufügen, können Sie ein Set - Adressen - Etikett, das die Emulation aktiviert und ermöglicht es, ifconfigdass die Adresse als „alias“ Schnittstelle zu sehen. In systemd-networkd wäre das Label=eth0:0unter [Address].

Meine Empfehlung ist, das zu vermeiden ifconfigund routeTools unter Linux, da sie sind im Wesentlichen nur von BSD Reste, die für neue Linux nicht aktualisiert worden sind, bieten für viele, viele Jahre.

Vielen Dank für die Erklärung! Das `Label` funktioniert aber nicht für mich. Bist du dir sicher? Am besten kann ich sagen, es ist, weil systemd den Doppelpunkt nicht akzeptiert. In jedem Fall sollte ich zu "ip" wechseln. Seltsam, dass dies nirgendwo erwähnt wurde und die Beschriftung nicht standardmäßig erfolgt. mikev vor 6 Jahren 0
Es funktioniert mit "ip addr add". Es ist möglich, dass networkd automatisch das Präfix `eth0:` hinzufügt. Versuchen Sie stattdessen `Label = 0`. (Ich vermute, es wird nicht standardmäßig ausgeführt, da die ioctl-API nur IPv4 ist und in vielerlei Hinsicht eingeschränkt ist; dies wäre unnötiger Aufwand.) grawity vor 6 Jahren 0