В этой статье (перевод документации [1]) опиcываются основные элементы сетевой подсистемы, такие как IP-адреса, устройства Ethernet, разрешение имен и так далее.
[Интерфейсы Ethernet]
Интерфейсы Ethernet идентифицируются в системе с помощью предсказуемых, уникальных имен. Эти имена могут быть eno1, enp0s25, или даже такие, как docker0 (виртуальный интерфейс) или enx00e04c55004e (интерфейс переходничка USB-Ethernet). Однако в некоторых случаях интерфейсы могут все еще использовать kernel-стиль имен наподобие eth#.
Как определить интерфейсы Ethernet. Чтобы быстро идентифицировать все доступные интерфейсы, их имена и IP-адреса, можно воспользоваться командой ip a, как показано ниже.
$ ip a
1: lo: < LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: enp2s0: < NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether c0:18:03:69:01:36 brd ff:ff:ff:ff:ff:ff
3: wlp0s20f3: < BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether f0:57:a6:d0:c6:a9 brd ff:ff:ff:ff:ff:ff
5: docker0: < NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:33:01:30:21 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
6: enx98e7431e0463: < BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 98:e7:43:1e:04:63 brd ff:ff:ff:ff:ff:ff
inet 10.1.145.31/21 brd 10.1.151.255 scope global dynamic noprefixroute enx98e7431e0463
valid_lft 64532sec preferred_lft 64532sec
7: enx00e04c55004e: < NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:e0:4c:55:00:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.7/24 scope global enx00e04c55004e
valid_lft forever preferred_lft forever
lshw. Другое приложение, которое также может помочь определить все сетевые интерфейсы, доступные в системе, это команда lshw. Эта команда предоставляет подробную информацию о возможностях аппаратуры определенных адаптеров. В примере ниже lshw показывает свойства физических интерфейсов системы, с информацией о шине, драйвере и поддерживаемых возможностях.
Для запуска lshw требуются права администратора (sudo). Обратите внимание, что в выводе команды lshw отсутствует информация об интерфейсе docker0 (программная эмуляция операционной системы) и lo (loopback-интерфейс), которые присутствовали в выводе команды ip a. Это потому, что интерфейсы docker0 и lo виртуальные, а команда lshw показывает параметры физических сетевых интерфейсов.
Логические имена интерфейсов Ethernet. Логические имена интерфейсов можно также конфигурировать через конфигурацию Netplan. Если вы хотите управлять тем, какой интерфейс получит определенное логическое имя, то можете сделать это с помощью ключей конфигурации match и set-name. Ключ match используется для нахождения адаптера по некоторому критерию наподобие MAC-адреса, драйвера и т. п. Ключ set-name может использоваться для изменения логического имени сетевого устройства.
ethtool. Утилита ethtool это программа, которая показывает и может изменять настройки сетевой карты, такие как автоматическое согласование разводки сигналов (auto-negotiation) [5], скорость порта, режим дуплекса, пробуждение от сетевой активности (Wake-on-LAN). Ниже показан пример, как просмотреть поддерживаемые возможности и сконфигурированные настройки Ethernet-интерфейса enx98e7431e0463.
$ sudo ethtool enx98e7431e0463
[sudo] password for username:
Settings for enx98e7431e0463:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: No
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Port: MII
PHYAD: 32
Transceiver: internal
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00007fff (32767)
drv probe link timer ifdown ifup rx_err tx_err tx_queued
intr tx_done rx_status pktdata hw wol
Link detected: yes
Конфигурация сети на Ubuntu обрабатывается через Netplan [2], который предоставляет высокоуровневый, не зависящий от дистрибутива способ определить, как должна быть настроена сеть в вашей системе. Это осуществляется через конфигурационный файл YAML [3].
Netplan по сути это средство визуализации абстракции конфигурации, которое охватывает все аспекты конфигурации сети. Мы обратимся к соответствующим настройкам Netplan, где это уместно, но мы рекомендуем изучить документацию Netplan в целом.
[IP-адресация]
Здесь мы рассмотрим, как конфигурировать IP-адрес адаптера и шлюз по умолчанию (default gateway). Эти параметры необходимы для осуществления сетевого взаимодействия по локальной сети и через Internet.
Временное назначение IP-адреса. Это обычно полезно для некоторых административных задач наподобие обновление прошивки роутера по протоколу TFTP и т. п. Для временной конфигурации сети Ubuntu вы можете использовать команду ip, которая также присутствует на большинстве других операционных системах семейства GNU/Linux. Команда ip позволит вам сконфигурировать адаптер таким образом, что они немедленно вступят в силу. Однако они не будут постоянными, и потеряются после перезагрузки системы.
Ниже показан пример конфигурирования адреса IP адаптера enx00e04c55004e. Здесь указан IP-адрес 192.168.1.7 с маской подсети 255.255.255.0:
$ sudo ip addr add 192.168.1.7/24 dev enx00e04c55004e
Команда ip может использоваться для активации (up) и деактивации (down) сетевого интерфейса:
$ ip link set dev enx00e04c55004e up
$ ip link set dev enx00e04c55004e down
Чтобы проверить конфигурацию IP-адреса адаптера, можно использовать следующую команду:
$ ip address show dev enx00e04c55004e
7: enx00e04c55004e: < NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel
state DOWN group default qlen 1000
link/ether 00:e0:4c:55:00:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.7/24 scope global enx00e04c55004e
valid_lft forever preferred_lft forever
Default gateway. Чтобы сконфигурировать шлюз по умолчанию, используйте команду:
$ sudo ip route add default via 10.102.66.1
Проверка настройки шлюза по умолчанию:
$ ip route show
default via 10.102.66.1 dev eth0 proto dhcp src 10.102.66.200 metric 100
10.102.66.0/24 dev eth0 proto kernel scope link src 10.102.66.200
10.102.66.1 dev eth0 proto dhcp scope link src 10.102.66.200 metric 100
Настройка DNS. Если вам требуется настройка DNS для временной конфигурации сети, то вы можете добавить IP-адреса сервера DNS в файл /etc/resolv.conf. Обычно прямое редактирование файла /etc/resolv.conf не рекомендуется, однако это временная и не постоянная конфигурация разрешения сетевых имен.
Пример ниже показывает, как ввести два DNS-сервера в файл /etc/resolv.conf. Адреса 8.8.8.8 соответствуют 8.8.4.4 серверам DNS от Google, и эти адреса могут быть изменены при необходимости в соответствии с конфигурацией вашей локальной сети. Более длинное описание правильной (постоянной) настройки клиента DNS будет показано в следующей секции.
nameserver 8.8.8.8
nameserver 8.8.4.4
Если вам больше не нужна эта конфигурация, и вы хотите удалить всю IP-конфигурацию с интерфейса, то можете использовать команду ip с опцией flush:
$ ip addr flush enx00e04c55004e
Обратите внимание, что flush конфигурации IP не очищает содержимое файла /etc/resolv.conf. Вы должны удалить или модифицировать эти записи вручную (либо выполнить перезагрузку системы), что также должно привести к тому, что /etc/resolv.conf, который является символьной ссылкой на /run/systemd/resolve/stub-resolv.conf, будет перезаписан.
Динамическая настройка IP-адреса (клиент DHCP). Чтобы настроить систему на использование протокола DHCP для динамической конфигурации IP сетевого адаптера, создайте конфигурацию Netplan в файле /etc/netplan/99_config.yaml. Следующий пример подразумевает, что вы сконфигурировали ваш первый Ethernet-интерфейс под именем enp3s0.
Эта конфигурация может быть затем применена следующей командой netplan:
$ sudo netplan apply
Статическое назначение IP-адреса. Чтобы сконфигурировать вашу систему на использование статического адреса, создайте конфигурацию Netplan в файле /etc/netplan/99_config.yaml. Пример ниже подразумевает, что вы сконфигурировали ваш первый интерфейс Ethernet под именем eth0. Поменяйте в этом примере значения параметров адреса (addresses), маршруты (routes), сервера DNS (nameservers), чтобы они удовлетворяли требованиям вашей сети.
Конфигурация может быть затем применена командой netplan:
$ sudo netplan apply
Замечание: netplan в операционной системе Ubuntu Bionic 18.04 LTS не понимает синтаксис "to: default" для указания маршрута по умолчанию, и в этом случае должен использоваться ключ более старого синтаксиса gateway4: 10.10.10.1 вместо всего блока routes.
loopback. Виртуальный сетевой интерфейс замыкания на себя (loopback interface) носит в системе имя lo, и у него назначен IP-адрес по умолчанию 127.0.0.1. Это можно посмотреть командой ip:
$ ip address show lo
1: lo: < LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
[Разрешение сетевых имен]
Преобразование символьных сетевых имен в IP-адреса (и обратно) упрощает взаимодействие человека с сетевыми ресурсами. В следующей секции будет рассмотрена правильная конфигурация подсистемы разрешения сетевых имен с использованием DNS и статических записей hostname.
Конфигурация клиента DNS. Традиционно файл /etc/resolv.conf был файлом статической конфигурации, который редко нуждается в изменении, или он изменялся автоматически клиентом DHCP при физическом подключении интерфейса. Сервис systemd-resolved обрабатывает конфигурацию nameserver, и взаимодействовать с ним нужно через команду systemd-resolve. Netplan конфигурирует systemd-resolved для генерации списка серверов (nameservers) и доменов для помещения их в /etc/resolv.conf, который может быть символьной ссылкой:
Чтобы сконфигурировать разрешение сетевых имен, в конфигурационный файл netplan добавьте IP-адреса подходящих серверов DNS. Вы можете также добавить дополнительный DNS-суффикс списков поиска, соответствующих вашим сетевым доменным именам. Результат файла может выглядеть следующим образом:
Опция search также может использоваться с несколькими доменными именами, чтобы DNS-запросы добавлялись в порядке их ввода. Например, в вашей сети может быть несколько субдоменов для поиска; корневой родительский домен example.com, и два субдомена sales.example.com и dev.example.com. Если у вас есть несколько доменов, которые вы хотите искать, то конфигурация может выглядеть следующим образом:
Если вы попытаетесь для этой конфигурации выполнить ping на хост с именем server1, то система будет автоматически посылать DNS-запросы в виде разрешения полных имен (Fully Qualified Domain Name, FQDN) в следующем порядке:
Если ни одно совпадение имени не найдено, то сервер DNS выдаст результат notfound, и DNS-запрос на имя server1 потерпит неудачу.
Статические имена хостов (hostnames). Статические имена хостов определяются таблицей вида IP-имя в файле /etc/hosts. По умолчанию записи в файле hosts имеют приоритет над подсистемой DNS. Это означает, что если ваша система пытается разрешить имя хоста, и соответствующая этому имени запись присутствует в /etc/hosts, то не будет предпринята попытка выдать запрос DNS. В некоторых конфигурациях, особенно если не требуется доступ в Internet, серверы, которые обмениваются с ограниченным набором сетевых ресурсов, могут быть удобно настроены на использование статических имен хостов вместо использования DNS для разрешения имен.
Ниже показан пример файла hosts, где несколько локальных серверов идентифицируются по простым именам хостов, алиасов и их полных имен FQDN:
Обратите внимание, что в этом примере каждый из серверов server1, server2, server3, server4 имеет присвоенный алиас вместе с полным именем FQDN. Хост server1 отображается на имя vpn, server2 на mail, server3 на www, и server4 на file.
Конфигурация Name Service Switch (NSS). Порядок, в котором ваша система выбирает метод разрешения имен хостов в IP-адреса, управляется конфигурацией Name Service Switch (NSS). Эта конфигурация находится в файле /etc/nsswitch.conf. Как упоминалось в предыдущей секции, обычно статические имена хостов определяются файлом /etc/hosts, который имеет приоритет над разрешением имен DNS. Ниже показан пример строки файла /etc/nsswitch.conf, отвечающий за этот порядок разрешения имен (hostname lookups).
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
• files сначала делается попытка разрешить статические имена, определенные в /etc/hosts. • mdns4_minimal попытки разрешить имя с помощью Multicast DNS. • [NOTFOUND=return] означает, что любой ответ notfound предыдущего процесса mdns4_minimal должен считаться авторитарным, и система не должна продолжать пытаться искать ответ на запрос разрешения имени. • dns представляет традиционный однонаправленный запрос разрешения доменного имени (legacy unicast DNS query). • mdns4 представляет многонаправленный запрос разрешения имени (multicast DNS query).
Чтобы изменить порядок этих методов разрешения имени, вы можете просто поменять строку hosts: на выбранную настройку. Например, если вы предпочитаете использовать legacy unicast DNS вместо multicast DNS, то можно поменять строку hosts: файла /etc/nsswitch.conf, как показано ниже:
hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4
[Мостовое подключение нескольких интерфейсов]
Bridging (мостовое подключение) это более продвинутая конфигурация, которая может оказаться полезной в некоторых сценариях. Например, можно объединить в мост несколько сетевых интерфейсов, когда используется файервол для фильтрации трафика между двумя сегментами сети. Другой пример - использование моста на системе с одним интерфейсом, чтобы позволить виртуальным машинам получить доступ во внешнюю сеть. Следующий пример показывает реализацию последнего сценария. Здесь сконфигурирован мост путем редактирования конфигурации netplan в папке /etc/netplan/ вводом подходящих значений для вашего физического интерфейса и сети:
Чтобы применить конфигурации и активировать мост, выполните команду:
$ sudo netplan apply
Новый интерфейс моста поднимется и запустится. Утилита brctl предоставляет полезную информацию о состоянии моста, управляет какие интерфейсы входят в мост. Для дополнительной информации см. документацию man brctl.
[networkd-dispatcher для скриптов]
Пользователи, знакомые с утилитой ifupdown, могут использовать hook-скрипты (например pre-up, post-up) в своих файлах интерфейсов. Конфигурация Netplan в настоящее время не поддерживает hook-скрипты в своих определениях.
Вместо этого, чтобы достичь такой функциональности с помощью networkd renderer, можно применить networkd-dispatcher. Этот пакет предоставляет необходимые средства перехвата состояний сети (hook points), чтобы система реагировала на различные сетевые события.
Замечание: если вы используете Desktop (не Ubuntu Server), то сеть управляется Network Manager - в этом случае вместо этого вам нужно использовать скрипты NM Dispatcher [6].
Netplan FAQ [7] содержит таблицу, сравнивающие тайминги событий ifupdown/systemd-networkd/network-manager. Также здесь вы найдете пример переделки старого ifupdown hook в конфигурацию networkd-dispatcher.
Важно иметь в виду, что эти обработчики (hooks) запускаются асинхронно, т. е. они не будут блокировать переход в другое состояние.
За дополнительной информацией обращайтесь к документации man networkd-dispatcher, а также man netplan и man systemd-resolved.