Network configuration (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи Network configuration. Дата последней синхронизации: 12 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

В статье описана настройка сетевого подключения на 3-м уровне модели OSI и выше. Отдельные способы передачи информации рассматриваются на подстраницах /Ethernet и /Wireless.

Проверка подключения

При проблемах с подключением к сети последовательно проверьте, что:

  1. Сетевой интерфейс обнаружен и включён. В противном случае, проверьте драйвер устройства – см. /Ethernet#Драйвер устройства и /Wireless#Драйвер устройства.
  2. Вы подключены к сети: воткнут сетевой кабель или есть подключение к беспроводной сети.
  3. Сетевому интерфейсу присвоен IP-адрес.
  4. Правильно настроена таблица маршрутизации.
  5. Возможно пропинговать локальный IP-адрес (например, шлюз по умолчанию).
  6. Возможно пропинговать публичный IP-адрес (например, 8.8.8.8 — DNS-сервер Google).
  7. Работает разрешение доменных имен (например, archlinux.org).

Ping

Для проверки соединения с хостом, используется утилита ping.

$ ping www.example.com
PING www.example.com (93.184.216.34): 56(84) data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=11.632 ms
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=11.726 ms
64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=10.683 ms
...

Утилита выводит информацию о каждом полученном ответе. Подробнее см. ping(8). Учтите, что удалённый хост может быть настроен игнорировать ICMP-запросы [1].

Если вы не получаете ответов, это может быть связано со шлюзом по умолчанию или интернет-провайдером. Воспользуйтесь утилитой traceroute для диагностики маршрута к хосту.

Примечание: Если вы получили сообщение об ошибке ping: icmp open socket: Operation not permitted при запуске ping, то попробуйте переустановить пакет iputils.

Управление сетевым подключением

Для настройки сетевого подключения сделайте следующее:

  1. Убедитесь, что сетевой интерфейс обнаружен и включён.
  2. Подключитесь к сети. Вставьте Ethernet-кабель или подключитесь к беспроводной сети.
  3. Настройте сетевое подключение:
Примечание: В установочном образе в качестве DHCP-клиента используются systemd-resolved и systemd-networkd для всех типов сетевых интерфейсов — Ethernet, WLAN и WWAN.

net-tools

Утилиты net-tools считаются устаревшими; рекомендуется использовать пакет iproute2 [2].

Устаревшая команда Замена
arp ip neigh
ifconfig ip address, ip link
netstat ss
route ip route

Подробнее см. это сообщение.

iproute2

iproute2 (зависимость мета-пакета base) предоставляет утилиту командной строки ip(8) для управления сетевыми интерфейсами, IP-адресами и таблицей маршрутизации. Учтите, что сделанные с помощью ip настройки исчезнут после перезагрузки. Для задания постоянных настроек используйте сетевой менеджер или автоматизируйте ip-команды с помощью сценариев или юнитов systemd. Также обратите внимание, что многие команды ip имеют сокращённую форму, но в этой статье для ясности они указываются полностью.

Сетевые интерфейсы

udev назначает имена сетевых интерфейсов в соответствии со схемой именования, в которой тип устройства обозначается двухбуквенным префиксом: en (проводной/Ethernet), wl (беспроводной/WLAN) или ww (WWAN). Подробнее см. systemd.net-naming-scheme(7).

Совет: Смена имени интерфейса описана в разделах #Смена имени интерфейса и #Традиционные названия интерфейсов.

Обнаружение сетевых интерфейсов

Имена как проводных, так и беспроводных интерфейсов можно узнать командами ls /sys/class/net и ip link. Имейте в виду, что префиксом lo обозначается петлевое устройство, которое не используется для сетевых соединений.

Имена беспроводных устройств можно узнать командой iw dev. См. также /Wireless#Определение имени интерфейса.

Если сетевой интерфейс не обнаружен, убедитесь, что его драйвер был загружен (cм. /Ethernet#Драйвер устройства и /Wireless#Драйвер устройства).

Включение и отключение сетевых интерфейсов

Включение и выключение интерфейса производится командой ip link set интерфейс up|down (подробнее см. ip-link(8)).

Для проверки текущего состояния интерфейса (например, enp2s0) выполните:

$ ip link show dev enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
...

На состояние интерфейса указывает UP в <BROADCAST,MULTICAST,UP,LOWER_UP>, а не state UP.

Примечание: Если выключить интерфейс, через который проходит маршрут по умолчанию, то маршрут будет удалён. Последующее включение интерфейса не восстановит автоматически исходный маршрут. Восстановление маршрута описано в разделе #Таблицы маршрутизации.

Статический или динамический адрес?

Если дома вы используете беспроводную точку доступа или маршрутизатор, то скорее всего у вас динамический IP-адрес. Точка доступа или маршрутизатор выдают вашему компьютеру адрес, который тот использует в работе. "Динамичность" адреса подразумевает, что машина может иметь разные адреса при каждом запуске. В рабочем окружении у вас может быть как динамический, так и статический адрес. Дома также можно настроить статическую адресацию, в результате чего компьютер получит постоянный адрес. При динамической адресации для назначения адресов сетевым интерфейсам необходим DHCP, который также возьмёт на себя маршрутизацию и разрешение доменных имён (преобразование имён вида google.com в числовые интернет-адреса).

Статический IP-адрес

Настройка статического IP-адреса производится либо посредством сетевого менеджера, либо с помощью демона dhcpcd.

Чтобы настроить статический IP-адрес вручную, добавьте IP-адрес по рекомендациям в разделе #IP-адреса, настройте таблицу маршрутизации и DNS-сервер.

IP-адреса

Для управления IP-адресами используется команда ip-address(8).

Показать существующие IP-адреса:

$ ip address show

Добавить IP-адрес к сетевому интерфейсу:

# ip address add адрес/длина_префикса broadcast + dev интерфейс
Обратите внимание:
Примечание: Убедитесь, что добавленные вручную IP-адреса не конфликтуют с адресами, выданными DHCP.

Удалить IP-адрес устройства:

# ip address del адрес/длина_префикса broadcast + dev интерфейс

Удалить все адреса определённого интерфейса:

# ip address flush dev интерфейс
Совет: IP-адрес можно вычислить с помощью ipcalc (ipcalc).

Таблицы маршрутизации

Таблица маршрутизации необходима для определения возможности связи с удалённым хостом и шлюза, через какой это следует делать. Если подходящего маршрута нет, то используется шлюз по умолчанию.

Настройка таблицы маршрутизации производится командой ip-route(8).

В примерах ниже значение ПРЕФИКС либо указывается в CIDR-нотации, либо принимает значение default для шлюза по умолчанию.

Показать маршруты IPv4:

$ ip route show

Показать маршруты IPv6:

$ ip -6 route show

Добавить маршрут:

# ip route add ПРЕФИКС via адрес dev интерфейс

Удалить маршрут:

# ip route del ПРЕФИКС via адрес dev интерфейс

DHCP

Сервер DHCP предоставляет клиенту динамический IP-адрес, маску подсети, IP-адрес шлюза по умолчанию и опционально — сервер имён DNS.

Для использования DHCP нужен DHCP-сервер в вашей сети и DHCP-клиент на локальной машине:

Клиент Пакет Archiso Примечания Юниты systemd
dhcpcd dhcpcd Да DHCP, DHCPv6, ZeroConf, статический IP dhcpcd.service, dhcpcd@интерфейс.service
ISC dhclient dhclient Да DHCP, DHCPv6, BOOTP, статический IP dhclient@интерфейс.service
Примечание:
  • Запускать несколько DHCP-клиентов одновременно не рекомендуется.
  • Вместо отдельного DHCP-клиента можно воспользоваться одним из сетевых менеджеров — некоторые из них имеют встроенный DHCP-клиент.
  • Кроме того, iwd имеет встроенный DHCP-клиент, который может использоваться в некоторых конфигурациях: iwd#Включение встроенной настройки сети.
Совет:
  • Проверить, запущен ли DHCP-сервер, можно с помощью dhcping.
  • Пока вы ожидаете выделения IP-адреса DHCP-сервером, можно запустить что-то вроде watch -n 1 ping -c 1 archlinux.org.

Сервер

Сервер Пакет IPv4 IPv6 GUI Интерфейсы Хранение данных Примечания
dhcpd dhcp Да Да Glass-ISC-DHCP ? Файл
dnsmasq dnsmasq Да Да Нет ? Файл Также DNS, PXE и TFTP
Kea kea Да Да Kea-Anterius (Experimental) REST, RADIUS и NETCONF Файл, MySQL, PostgreSQL и Cassandra Также DNS

Сетевые менеджеры

Сетевой менеджер позволяет создавать т.н. "сетевые профили" с настройками подключений, что облегчает переключение между сетями.

Примечание: Выбор приложений довольно широк, но нужно помнить, что все варианты взаимоисключают друг друга. Запускать два сетевых демона одновременно запрещено.
Сетевой менеджер Графический интерфейс Archiso [3] Утилиты командной строки Поддержка PPP
(например, 3G-модем)
DHCP-клиент Юниты systemd
ConnMan 8 неофиц. Нет connmanctl(1) Да (с ofonoAUR) встроенный connman.service
netctl 2 неофиц. Нет netctl(1), wifi-menu Да dhcpcd или dhclient netctl-ifplugd@интерфейс.service, netctl-auto@интерфейс.service
NetworkManager Да Нет nmcli(1), nmtui(1) Да встроенный, dhcpcd или dhclient NetworkManager.service
systemd-networkd Нет Да (base) networkctl(1) Нет [4] встроенный systemd-networkd.service, systemd-resolved.service
Wicd Да Нет wicd-cli(8), wicd-curses(8) Нет dhcpcd или dhclient wicd.service

Имя хоста

Имя хоста — уникальное имя-идентификатор машины в сети. Имя хоста хранится в файле /etc/hostname (см. hostname(5) и hostname(7)). В файле также может храниться доменное имя системы, если таковое имеется. Чтобы задать имя хоста, добавьте в файл /etc/hostname одну строку:

/etc/hostname
имя-хоста
Совет: Рекомендации по выбору имени хоста приведены в RFC 1178.

В качестве альтернативы имя хоста можно задать утилитой hostnamectl(1):

# hostnamectl set-hostname имя-хоста

Утилита hostname(1) из пакета inetutils позволяет задать имя хоста временно, до первой перезагрузки:

# hostname имя-хоста

См. machine-info(5) о том, как настроить "красивое" имя машины и другие метаданные.

Локальное разрешение имён

Модуль nss-myhostname входящей в состав systemd службы Name Service Switch (NSS) позволяет выполнять разрешение имени локально без обращения к файлу /etc/hosts. Этот модуль включён по умолчанию. Однако следует иметь в виду, что некоторые программы всё же полагаются на файл /etc/hosts. [5], [6]

Добавьте следующие строки в /etc/hosts:

127.0.0.1        localhost
::1              localhost
127.0.1.1        имя-хоста.localdomain        имя-хоста
Примечание: Порядок имён/псевдонимов после IP-адреса имеет значение. Сразу после IP-адреса следует "каноническое" имя хоста, к которому при неоходимости может присоединиться название родительского домена, отделенное от имени точкой (как, например, .localdomain выше). Все последующие значения на той же строке считаются псевдонимами. Подробнее см. hosts(5).

В результате система будет использовать оба варианта — и NSS, и файл /etc/hosts:

$ getent hosts
127.0.0.1       localhost
127.0.0.1       localhost
127.0.1.1       имя-хоста.localdomain имя-хоста

Если хост использует статический IP-адрес, то его следует указать вместо 127.0.1.1.

Разрешение имён в локальной сети

Чтобы машина была доступна по локальной сети по имени хоста, следует выбрать один из вариантов:

  • отредактировать файл /etc/hosts на каждом устройстве вашей локальной сети, см. hosts(5);
  • выбрать DNS-сервер для разрешения вашего имени хоста и настроить все машины в локальной сети использовать его (например, посредством #DHCP);
  • использовать Zeroconf-сервис, автоматически создающий IP-сети без необходимости выполнения ручных настроек. Можно выбрать одну из двух реализаций:
    • NetBIOS. Разработан компанией Microsoft, входит в состав Samba. Всё, что необходимо — запустить nmb.service. Машины с операционными системами Windows, macOS или Linux и работающим nmb смогут найти ваш компьютер в сети;
    • mDNS. Возможны два варианта использования: Avahi и systemd-resolved. Компьютеры с macOS или Linux, на которых запущен Avahi или systemd-resolved, смогут обнаружить ваш хост. Windows не имеет встроенного mDNS клиента или демона. Старый Win32 API не поддерживает mDNS, что может помешать старым приложениям Windows получить доступ к вашей системе.

Советы и рекомендации

Смена имени интерфейса

Вы можете изменить имя устройства, установив его вручную при помощи правила udev. Например:

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="net1"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="net0"

Эти правила будут применяться автоматически при загрузке.

Кое-что на заметку:

  • Узнать MAC-адрес интерфейса можно командой cat /sys/class/net/имя_устройства/address
  • Убедитесь, что в правиле udev шестнадцатеричные значения указаны строго в нижнем регистре.

Если сетевой интерфейс имеет динамический MAC-адрес, вместо последнего можно использовать DEVPATH:

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", DEVPATH=="/devices/platform/wemac.*", NAME="int"
SUBSYSTEM=="net", DEVPATH=="/devices/pci*/*1c.0/*/net/*", NAME="en"

DEVPATH подключённых устройств можно узнать по символическим ссылкам в каталоге /sys/class/net/:

file /sys/class/net/*
/sys/class/net/enp0s20f0u4u1: symbolic link to ../../devices/pci0000:00/0000:00:14.0/usb2/2-4/2-4.1/2-4.1:1.0/net/enp0s20f0u4u1
/sys/class/net/enp0s31f6:     symbolic link to ../../devices/pci0000:00/0000:00:1f.6/net/enp0s31f6
/sys/class/net/lo:            symbolic link to ../../devices/virtual/net/lo
/sys/class/net/wlp4s0:        symbolic link to ../../devices/pci0000:00/0000:00:1c.6/0000:04:00.0/net/wlp4s0

Паттерн пути устройства (DEVPATH) должен подходить для обоих названий устройств, и нового, и старого, поскольку одно и то же правило udev может срабатывать несколько раз в процессе загрузки. Например, во втором правиле в примере выше шаблон "/devices/pci*/*1c.0/*/net/enp*" будет ошибочным, поскольку после изменения имени на en он перестанет совпадать, и если после этого сработает системное правило по умолчанию, то имя изменится обратно на что-то вида enp1s0.

Если вы используете USB-интерфейс (например, подключаясь через Android-смартфон) с динамическим MAC-адресом и хотите иметь возможность использовать разные USB-порты, можно создать правило на основе данных о производителе и ID устройства:

/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="12ab", ATTRS{idProduct}=="3cd4", NAME="net2"

Проверить созданное правило из пространства пользователя можно командой udevadm --debug test /sys/class/net/*. Не забудьте предварительно отключить интерфейс, который собираетесь переименовать (например, выполнив ip link set enp1s0 down).

Примечание: При выборе статических имен вы должны избегать использования формата "ethX" и "wlanX", поскольку это может привести к состоянию гонки между ядром и udev во время загрузки системы. Вместо этого лучше взять имена интерфейсов, которые не используются по умолчанию в ядре, например: net0, net1, wifi0, wifi1. Подробнее см. документацию systemd.

Традиционные названия интерфейсов

Если вы предпочитаете традиционные названия интерфейсов вроде eth0, отключите назначение предсказуемых имён интерфейсов, создав маску для правила udev.

# ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

Другой способ — добавить net.ifnames=0 в параметры ядра.

Установка MTU и длины очереди

Вы можете изменить MTU и длину очереди для устройства, определив их вручную в правиле udev. Например:

/etc/udev/rules.d/10-network.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wl*", ATTR{mtu}="1500", ATTR{tx_queue_len}="2000"

mtu: Значение выше 1500 (т.н. jumbo-кадры) могут значительно повысить скорость передачи информации. Имейте в виду, что указанное значение MTU должны поддерживать все сетевые интерфейсы, в том числе коммутаторы в локальной сети, иначе передача jumbo-кадров завершится неудачно. Для PPPoE величина MTU не должна превышать 1492. Также значение MTU можно задать посредством systemd.netdev(5).

tx_queue_len: Малые значения — для медленных устройств с высокой задержкой (ADSL, ISDN). Большие значения рекомендованы для высокоскоростных соединений с серверами, где предполагается передача значительных объёмов данных.

Объединение сетевых интерфейсов (bonding) или LAG

Бондинг — объединение нескольких сетевых интерфейсов в одно логическое устройство. См. статьи netctl, systemd-networkd и Wireless bonding.

Псевдонимы для IP-адресов

Псевдонимы (aliases) необходимы для назначения нескольких IP-адресов одному сетевому интерфейсу. Благодаря этому один узел сети может иметь несколько подключений, каждое из которых будет использоваться для конкретной цели. Типичное применение этой возможности — виртуальный хостинг Web- и FTP-серверов или реорганизация серверов без необходимости обновления каких-либо других машин (особенно полезно для серверов имен).

Пример

Чтобы вручную назначить псевдоним для определенного сетевого интерфейса (например, enp2s0) используйте утилиту ip из пакета iproute2:

# ip addr add 192.168.2.101/24 dev enp2s0 label enp2s0:1

Для удаления псевдонима выполните:

# ip addr del 192.168.2.101/24 dev enp2s0:1

По умолчанию для исходящих из определённой подсети пакетов используется основной псевдоним устройства. Если же отправитель находится в подсети вторичного псевдонима, то IP-адрес отправителя в заголовке пакета будет соответствующим. В случае наличия более чем одного сетевого интерфейса маршруты по умолчанию можно узнать командой ip route.

Promiscuous mode

Promiscuous mode ("неразборчивый" режим) предполагает, что (беспроводной) сетевой интерфейс перенаправляет весь входящий трафик ядру операционной системы для дальнейшей обработки. Это противоположность "нормальному режиму", при котором интерфейс отбрасывает пакеты, которые не ожидались быть полученными. Чаще всего эта возможность используется для решения сетевых проблем и анализа пакетов.

/etc/systemd/system/promiscuous@.service
[Unit]
Description=Set %i interface in promiscuous mode
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/ip link set dev %i promisc on
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Чтобы включить "неразборчивый" режим для интерфейса eth0, выполните:

# systemctl enable promiscuous@eth0.service

Получение информации о сокетах

Входящая в состав пакета iproute2 утилита ss используется для вывода информации о сокетах. Обладает схожим функционалом со считающейся устаревшей утилитой netcat.

Примеры использования:

Показать все TCP-сокеты с названиями сервисов:

$ ss -at

Показать все TCP-сокеты с номерами портов:

$ ss -atn

Показать все UDP-сокеты:

$ ss -au

За подробной информацией обращайтесь к справочной странице ss(8).

Решение проблем

Проблема масштабирования TCP window

Заголовк TCP-пакета содержит поле "Window", которое определяет, какое количество данных может быть прислано в ответ другим хостом. Ширина поля составляет 16 бит, следовательно, размер окна не может превышать 64 Kбайт. С учётом кэширования пакетов, связанного с необходимостью восстановить их исходный порядок, значение окна легко может быть превышено.

В 1992 году ввиду того, что объём памяти, доступной компьютерам, всё увеличивался, был разработан RFC 1323, призванный решить проблему с помощью масштабирования окна (Window Scaling). Содержащееся в заголовке пакета значение "Window" корректировалось коэффициентом масштабирования (Scale Factor), который определялся один раз в начале подключения. Этот 8-битный коэффициент позволяет увеличить исходное окно размером 64 Кбайт в 32 раза.

Некоторые сломанные маршрутизаторы и межсетевые экраны переопределяют это значение на 0, что вызывает недопонимание между хостами. В ядре Linux версии 2.6.17 была введена в действие новая методика вычисления коэффициента масштабирования, в результате чего проблема с неправильно настроенными маршрутизаторами и экранами стала проявляться очень ярко.

В итоге соединение в лучшем случае очень медленное или часто прерывается.

Диагностика

Прежде всего, необходимо пояснить: это довольно странная проблема. В некоторых случаях вы вообще не сможете использовать соединения TCP (HTTP, FTP и т.д.), в других — сможете обращаться к некоторым узлам (лишь нескольким).

Если у вас появилась такая проблема, вывод dmesg будет нормальным, логи - чистыми, а ip addr сообщит о нормальном состоянии... Все будет выглядеть нормально.

Если вы не можете просматривать никакие веб-сайты, но можете отправлять запросы ping на некоторые узлы, высока вероятность, что у вас именно эта проблема: ping использует ICMP, поэтому проблемы TCP на него не влияют.

С помощью Wireshark можно будет увидеть, что UDP- и ICMP-соединения работают, а TCP-соединение с внешними узлами установить не удаётся.

Способы решения проблемы

Плохой

Плохой способ заключается в изменении значения tcp_rmem, на основе которого вычисляется коэффициент масштабирования. Скорее всего, это решит проблему, кроме случая связи с особо удалёнными хостами.

# echo "4096 87380 174760" > /proc/sys/net/ipv4/tcp_rmem
Хороший

Просто отключите масштабирование. Эта функция — довольно приятное дополнение к стандартному TCP, и без неё может быть некомфортно, особенно если вы не имеете возможности перенастроить неправильно работающий маршрутизатор. Есть несколько способов отключения масштабирования, и, кажется, наиболее надёжный из них (работает с большинством ядер) — добавить следующую строку в файл /etc/sysctl.d/99-disable_window_scaling.conf (см. также sysctl):

net.ipv4.tcp_window_scaling = 0
Лучший

Проблема вызвана неправильно работающим маршрутизатором/межсетевыми экранами, поэтому просто замените его. Некоторые пользователи отмечали, что таким маршрутизатором был их собственный маршрутизатор DSL.

Дополнительная информация

Этот раздел основывается на статье LWN TCP window scaling and broken routers и архивной статье Kernel Trap Window Scaling on the Internet.

На странице LKML есть также несколько ссылок по теме.

Нет подключения к локальной сети через мост

Первый компьютер подключён к двум локальным сетям. Второй — к одной локальной сети и первому компьютеру. Выполните следующие команды, чтобы дать второму компьютеру доступ к сети за мостовым интерфейсом (на первой машине):

# sysctl net.bridge.bridge-nf-filter-pppoe-tagged=0
# sysctl net.bridge.bridge-nf-filter-vlan-tagged=0
# sysctl net.bridge.bridge-nf-call-ip6tables=0
# sysctl net.bridge.bridge-nf-call-iptables=0
# sysctl net.bridge.bridge-nf-call-arptables=0

Смотрите также