Network configuration (Русский)
В этой статье описана настройка подключения к сети на 3-м уровне сетевой модели OSI и выше. Отдельные виды передачи информации рассматриваются на подстраницах /Ethernet (Русский) и /Wireless (Русский).
Проверка подключения
При появлении проблем с подключением последовательно выполните описанные ниже шаги и убедитесь, что:
- Сетевой интерфейс обнаружен и включён. В противном случае, проверьте драйвер устройства – см. /Ethernet (Русский)#Драйвер устройства или /Wireless (Русский)#Драйвер устройства.
- Вы подключены к сети: воткнут сетевой кабель или есть подключение к беспроводной сети.
- Сетевому интерфейсу присвоен IP-адрес.
- Таблица маршрутизации настроена правильно.
- Возможно выполнить ping локального IP-адреса (например, шлюза по умолчанию).
- Возможно выполнить ping публичного IP-адреса (например,
8.8.8.8
— DNS-сервер Google и удобный адрес для проверки подключения). - Работает распознавание доменных имен (например,
archlinux.org
).
Ping
Чтобы установить, есть ли связь с удалённым хостом, используется утилита ping. Утилита посылает хосту ICMP-пакеты и записывает полученные ответы:
$ 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.Управление сетевым подключением
Чтобы настроить сетевое подключение, последовательно выполните следующие действия:
- Убедитесь, что сетевой интерфейс обнаружен и включен;
- Подключитесь к сети. Вставьте Ethernet-кабель или подключитесь к беспроводной сети.
- Настройте сетевое подключение:
- статический IP-адрес;
- динамический IP-адрес: используйте DHCP
net-tools
Набор утилит net-tools считается устаревшим, рекомендуется использовать вместо него пакет iproute2. [2]
Устаревшая команда | Замена |
---|---|
arp | ip neigh |
ifconfig | ip address, ip link |
netstat | ss |
route | ip route |
Более подробную информацию о замене устаревших команд можно найти в этом сообщении.
iproute2
iproute2 — зависимость мета-пакета base, включающий интерфейс командной строки для управления сетевыми интерфейсами, IP-адресами и таблицей маршрутизации. Не забудьте, что настройки, сделанные посредством ip
, не сохранятся после перезагрузки. Для применения постоянных настроек можно использовать сетевой менеджер или автоматизировать ip-команды посредством скриптов или файлов юнитов systemd. Также обратите внимание, что ip
команды часто имеют сокращённую форму, но в этой статье для большей ясности они указаны полностью.
Сетевые интерфейсы
По умолчанию, udev дает имена сетевым интерфейсам в соответствии со схемой именования, в которой тип устройства обозначается двухбуквенным префиксом: en
(проводной/Ethernet), wl
(беспроводной/WLAN) или ww
(WWAN).
Обнаружение сетевых интерфейсов
Имена как проводных, так и беспроводных интерфейсов можно найти посредством команд ls /sys/class/net
и ip link
. Имейте в виду, что префиксом lo
обозначается петлевое устройство, которое не используется для создания сетевого подключения.
Имена беспроводных устройств также можно получить посредством iw dev
. См. также /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-адрес
Настройка статического IP-адреса производится либо посредством сетевого менеджера, либо с помощью демона dhcpcd.
Чтобы настроить статический IP-адрес вручную, добавьте IP-адрес как описано в разделе #IP-адреса, настройте таблицу маршрутизации и DNS-сервер.
IP-адреса
Для управления IP-адресами используется команда ip-address(8).
Показать существующие IP-адреса:
$ ip address show
Добавить IP-адрес к сетевому интерфейсу:
# ip address add адрес/длина_префикса broadcast + dev интерфейс
- Обратите внимание:
- адрес указан в CIDR-нотации вместе с маской подсети;
- спецсимвол
+
говорит утилитеip
вычислить широковещательный адрес на основе IP-адреса и маски подсети.
- Примечание: Убедитесь, что добавленные вручную IP-адреса не конфликтуют с адресами, добавленными DHCP.
Удалить IP-адрес устройства:
# ip address del адрес/длина_префикса broadcast + dev интерфейс
Удалить все адреса определенного интерфейса (можно добавить критерий, на соответствие которому будет проверяться каждый адрес перед удалением):
# ip address flush dev интерфейс
Таблицы маршрутизации
С помощью таблицы маршрутизации определяется возможность достижения удалённого хоста, напрямую или посредством какого-либо шлюза (маршрутизатора). Если подходящего маршрута нет, то используется адрес шлюза по умолчанию.
Настройка таблицы маршрутизации производится посредством команды 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
имя-хоста
В качестве альтернативы для задания имени компьютера можно воспользоваться утилитой 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 имя-хоста
.localdomain
выше). Все последующие значения на той же строке считаются псевдонимами. Подробности можно найти на странице документации hosts(5).В результате система будет использовать оба варианта — и NSS, и файл /etc/hosts
:
$ getent hosts
127.0.0.1 localhost 127.0.0.1 localhost 127.0.1.1 имя-хоста.localdomain имя-хоста
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 получить доступ к вашей системе.
- NetBIOS. Разработан компанией Microsoft, входит в состав Samba. Всё, что необходимо — запустить
Советы и рекомендации
Смена имени интерфейса
Вы можете изменить имя устройства, установив его вручную при помощи правила 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 может срабатывать в процессе загрузки более одного раза. Например, для второго правила в примере выше назначается название устройства en
, и если указать путь "/devices/pci*/*1c.0/*/net/enp*"
, то паттерн не подойдет. Если после этого системное правило по умолчанию сработает во второй раз, то название изменится обратно на, к примеру, 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
).
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
: Для PPPoE величина MTU не должна превышать 1492. Также значение MTU можно задать посредством systemd.netdev(5).tx_queue_len
: Малые значения — для медленных устройств с высокой задержкой (ADSL, ISDN). Большие значения рекомендованы для высокоскоростных подключений к серверам, где требуется передача значительных объёмов данных.
Объединение сетевых интерфейсов (bonding) или LAG
Бондинг — объединение нескольких сетевых интерфейсов в одно логическое устройство. Подробнее см. статьи netctl, systemd-networkd и Wireless bonding.
Создание псевдонимов IP-адресов
Псевдонимы (aliases) необходимы для назначения нескольких IP-адресов одному сетевому интерфейсу. Благодаря этому один узел сети может иметь несколько подключений, каждое из которых используется в своих целях. Типичное использование этой возможности — виртуальный хостинг Web- и FTP-серверов или реорганизация серверов без необходимости обновления каких-либо других машин (это особенно полезно для серверов имен (nameservers)).
Пример
Чтобы вручную назначить псевдоним для определенного сетевого интерфейса (например, enp2s0
) используйте входящую в состав пакета iproute2 утилиту ip:
# 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
.
"Неразборчивый" режим
Включение "неразборчивого" режима заставит (беспроводную) сетевую плату перенаправлять весь трафик, который она получает, в операционную систему для дальнейшей обработки. Это противоположность "нормальному режиму", при котором сетевая плата будет терять пакеты, не предназначенные для приема. Чаще всего эта возможность используется для продвинутого решения сетевых проблем и анализа пакетов.
/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 бит информации, следовательно, размер window должен быть не более 64Kб. Пакеты TCP на некоторое время кэшируются (они должны быть перераспределены), а, поскольку память ограничена, один узел может легко перевалить за это значение.
В далеком 1992 году становилось доступно все больше и больше памяти, и для улучшения ситуации был написан RFC 1323: Window Scaling. Значение "window", содержащееся во всех пакетах, будет изменено при помощи коэффициента масштабирования (Scale Factor), определяемого один раз в самом начале подключения. Этот 8-битный коэффициент масштабирования позволяет Window быть в 32 раза больше, чем изначальные 64Kб.
Похоже, некоторые нестандартные маршрутизаторы и межсетевые экраны в интернете переписывают этот коэффициент в значение 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
Хороший
Просто отключите масштабирование Window. Поскольку оно - лишь приятная функция 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