Почему ifconfig показывает только первый IP-адрес сетевого интерфейса, настроенного с помощью systemd-networkd?

655
mikev

Так что я не уверен, что здесь происходит, но я продублировал эту проблему на нескольких разных серверах в 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: 

Любые догадки (более чем) приветствуются.

2
Примечание: 1) Широковещательную рассылку всегда можно рассчитать по маске сети, поэтому не беспокойтесь о ее настройке, если у вас нет _really_ специальной сети. 2) Маршрутизация на основе источника (`Source =`) реализована только в Linux для IPv6. Если вам это действительно нужно для IPv4, вам придется использовать `ip rule`. 3) Маршруты со шлюзом по определению не ограничены связью ... grawity 6 лет назад 0
Хороший улов. Исправлены все из них (удалены `Source =`, `Scope =` и `Broadcast =`), но, возможно, придется добавить обратно `Source =`, но теперь я получаю сообщение об ошибке `Не удалось установить маршрут. Сеть недоступна. Три раза, когда появляется интерфейс. Есть идеи, с чем это будет связано? Я могу пропинговать `10.12.1.1`, и ethtool сообщает о хорошей ссылке, но маршруты не добавляются. mikev 6 лет назад 0

1 ответ на вопрос

0
grawity

В Linux подобные «псевдонимы» интерфейсы не eth0:0являются обязательными. Они эмулируются только для совместимости со старым API SIOCGIFADDR на основе ioctl для IPv4, который в противном случае не поддерживает несколько адресов на имя интерфейса - это то, что ifconfigиспользуется по сей день.

Между тем, инструменты, использующие современный интерфейс Netlink, такие как ipили, systemd-networkdпросто работают со списком адресов, все они в одном основном интерфейсе. Это также соответствует поведению IPv6 с самого первого дня.

Когда вы добавляете адреса IPv4 через Netlink, вы можете установить метку адреса, которая активирует эмуляцию и позволяет ifconfigвидеть этот адрес как интерфейс «псевдонима». В systemd-networkd это было бы Label=eth0:0под [Address].

Я рекомендую избегать использования инструментов ifconfigи routeLinux в Linux, поскольку они, по сути, являются просто остатками BSD, которые не обновлялись для новых функций Linux уже много-много лет.

спасибо огромное за объяснение! «Метка» не работает для меня, хотя. Ты уверен, что должен? Лучшее, что я могу сказать, потому что systemd не принимает двоеточие в нем. В любом случае, думаю, мне следует перейти к `ip`. Просто странно, что это нигде не упоминалось, и маркировка по умолчанию не выполняется. mikev 6 лет назад 0
Работает с `ip addr add`. Возможно, networkd автоматически добавляет префикс `eth0:`, поэтому попробуйте просто `Label = 0`. (Я предполагаю, что это не сделано по умолчанию, потому что API ioctl только для IPv4 и ограничен во многих других отношениях; это будет напрасной тратой усилий.) grawity 6 лет назад 0