Содержание
Доброго времени, уважаемые читатели. Публикую вторую часть статьи о сетевой подсистеме Linux. В текущей части основной упор сделан на реализацию сети в Linux (как настроить сеть в Linux, как продиагностировать сеть в Linux и поддерживать в рабочем состоянии сетевую подсистему в Linux).
Настройка TCP/IP в Linux для работы в сети Ethernet
Для работы с сетевыми протоколами TCP/IP в Linux достаточно наличие только петлевого интерфейса, но если необходимо объединить хосты между собой, естественно, необходимо наличие сетевого интерфейса, каналов передачи данных (например витая пара), возможно, какого-либо сетевого оборудования. Так же, необходимо наличие установленных утилит для настройки сети (/sbin/ifconfig, /sbin/route и др.), обычно поставляемые в пакете net-tools. Так же необходимо наличие конфигурационных файлов для сети (например /etc/hosts) и поддержку сети ядром Linux.
Параметры сети
Начнем понимание сетевых механизмов Linux с ручного конфигурирования сети, то есть со случая, когда IP адрес сетевого интерфейса статичен. Итак, при настройке сети, необходимо учесть и настроить следующие параметры:
IP-адрес — как уже говорилось в первой части статьи — это уникальный адрес машины, в формате четырех десятичных чисел, разделенных точками. Обычно, при работе в локальной сети, выбирается из частных диапазонов, например: 192.168.0.1
Маска подсети — так же, 4 десятичных числа, определяющие, какая часть адреса относиться к адресу сети/подсети, а какая к адресу хоста. Маска подсети является числом, которое складывается (в двоичной форме) при помощи логического И, с IP-адресом и в результате чего выясняется, к какой подсети принадлежит адрес. Например адрес 192.168.0.2 с маской 255.255.255.0 принадлежит подсети 192.168.0.
Адрес подсети — определяется маской подсети. При этом, для петлевых интерфейсов не существует подсетей.
Широковещательный адрес — адрес, используемый для отправки широковещательных пакетов, которые получат все хосты подсети. Обычно, он равен адресу подсети со значением хоста 255, то есть для подсети 192.168.0 широковещательным будет 192.168.0.255, аналогично, для подсети 192.168 широковещательным будет 192.168.255.255. Для петлевых интерфейсов не существует широковещательного адреса.
IP адрес шлюза — это адрес машины, являющейся шлюзом по-умолчанию для связи с внешним миром. Шлюзов может быть несколько, если компьютер подключен к нескольким сетям одновременно. Адрес шлюза не используется в изолированных сетях (не подключенных к глобальной сети), потому что данным сетям некуда отправлять пакеты вне сети, то же самое относиться и к петлевым интерфейсам.
IP-адрес сервера имен (DNS — сервера) — адрес сервера преобразующего имена хостов в IP адреса. Обычно, предоставляется провайдером.
Файлы настроек сети в Linux (конфигурационные файлы)
Для понимания работы сети в Linux, я бы обязательно посоветовал ознакомиться со статьей «Этапы загрузки Linux». В целом, вся работа Linux основана на процессе init, который рождается при загрузке ОС и плодит своих потомков, которые в свою очередь и выполняют всю необходимую работу, будь то запуск bash или демона. Да, и вся загрузка Linux основана на скриптах bash, в которых прописана вся последовательность запуска мелких утилит с различными параметрами, которые последовательно запускаются/останавливаются при запуске/остановке системы. Аналогично запускается и сетевая подсистема Linux.
Каждый дистрибутив Linux имеет слегка отличающийся от других механизм инициализации сети, но общая картина, думаю, после прочтения будет ясна. Если просмотреть стартовые скрипты сетевой подсистемы какого-либо дистрибутива Linux, то, как настроить конфигурацию сети с помощью конфигурационных файлов, станет более-менее понятно, например у Debian/Ubuntu (за основу возьмем эту ветвь дистрибутивов) за инициализацию сети отвечает скрипт /etc/init.d/networking
, просмотрев содержимое которого:
net-server:~#cat /etc/init.d/networking #!/bin/sh -e ### BEGIN INIT INFO # Provides: networking # Required-Start: mountkernfs $local_fs # Required-Stop: $local_fs # Should-Start: ifupdown # Should-Stop: ifupdown # Default-Start: S # Default-Stop: 0 6 # Short-Description: Raise network interfaces. ### END INIT INFO PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" [ -x /sbin/ifup ] || exit 0 . /lib/lsb/init-functions process_options() { [ -e /etc/network/options ] || return 0 log_warning_msg "/etc/network/options still exists and it will be IGNORED! Read README.Debian of netbase." } check_network_file_systems() { [ -e /proc/mounts ] || return 0 if [ -e /etc/iscsi/iscsi.initramfs ]; then log_warning_msg "not deconfiguring network interfaces: iSCSI root is mounted." exit 0 fi exec 9<&0 < /proc/mounts while read DEV MTPT FSTYPE REST; do case $DEV in /dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*) log_warning_msg "not deconfiguring network interfaces: network devices still mounted." exit 0 ;; esac case $FSTYPE in nfs|nfs4|smbfs|ncp|ncpfs|cifs|coda|ocfs2|gfs|pvfs|pvfs2|fuse.httpfs|fuse.curlftpfs) log_warning_msg "not deconfiguring network interfaces: network file systems still mounted." exit 0 ;; esac done exec 0<&9 9<&- } check_network_swap() { [ -e /proc/swaps ] || return 0 exec 9<&0 < /proc/swaps while read DEV MTPT FSTYPE REST; do case $DEV in /dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*) log_warning_msg "not deconfiguring network interfaces: network swap still mounted." exit 0 ;; esac done exec 0<&9 9<&- } case "$1" in start) process_options log_action_begin_msg "Configuring network interfaces" if ifup -a; then log_action_end_msg $? else log_action_end_msg $? fi ;; stop) check_network_file_systems check_network_swap log_action_begin_msg "Deconfiguring network interfaces" if ifdown -a --exclude=lo; then log_action_end_msg $? else log_action_end_msg $? fi ;; force-reload|restart) process_options log_warning_msg "Running $0 $1 is deprecated because it may not enable again some interfaces" log_action_begin_msg "Reconfiguring network interfaces" ifdown -a --exclude=lo || true if ifup -a --exclude=lo; then log_action_end_msg $? else log_action_end_msg $? fi ;; *) echo "Usage: /etc/init.d/networking {start|stop}" exit 1 ;; esac exit 0
можно найти несколько функций, проверяющих наличие подключенных сетевых файловых систем (check_network_file_systems(), check_network_swap()), а так же проверку существования какого-то пока непонятного конфига /etc/network/options (функция process_options()), а в самом низу, конструкцией case «$1» in проверяется первый параметр переданный скрипту и в соответствии с введенным параметром (start/stop/force-reload|restart или любое дугое) производит определенные действия. Из этих самых «определенных действий», на примере аргумента start видно, что сначала запускается функция process_options, далее отправляется в лог фраза Configuring network interfaces, и запускается команда ifup -a. Если посмотреть man ifup, то видно что данная команда читает конфиг из файла /etc/network/interfaces и согласно ключу -a запускает все интерфейсы имеющие параметр auto.
The ifup and ifdown commands may be used to configure (or, respectively, deconfigure) network interfaces based on interface definitions in the file /etc/network/interfaces. -a, --all If given to ifup, affect all interfaces marked auto. Interfaces are brought up in the order in which they are defined in /etc/network/interfaces. If given to ifdown, affect all defined interfaces. Interfaces are brought down in the order in which they are currently listed in the state file. Only interfaces defined in /etc/network/interfaces will be brought down.
Соответственно, прочитав man interfaces (rus) или man interfaces (eng), становиться ясно, как же в Debian/Ubuntu настроить какой-либо сетевой интерфейс с помощью конфига /etc/network/interfaces. Ниже, пример данного конфигурационного файла для 3х интерфейсов: петлевой (lo), со статичным IP (eth2) и IP получаемым по dhcp (eth0):
ip-server:~# cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp allow-hotplug eth2 iface eth2 inet static address 192.168.1.1 netmask 255.255.255.0 gateway 192.168.1.254 broadcast 192.168.1.255
В данном конфиге строки allow-hotplug и auto — это синонимы и интерфейсы будут подняты по команде ifup -a. Вот, собственно, и вся цепь работы сетевой подсистемы. Аналогично, в других дистрибутивах: в RedHat и SUSE сеть запускается скриптом /etc/init.d/network. Рассматрев его, аналогично можно найти, где лежит конфигурация сети.
/etc/hosts
Данный файл хранит перечень IP адресов и соответствующих им (адресам) имен хостов.Формат файла ничем не отличается от мастдайного:
ip-server:~# cat /etc/hosts # ip host.in.domain host 127.0.0.1 localhost 127.0.1.1 ip-server.domain.local ip-server 192.168.1.1 ip-server.domain.local ip-server
Исторически, данный файл использовался вместо службы DNS. В настоящее время, файл так же может использоваться вместо службы DNS, но только при условии, что в вашей сети количество машин измеряется в единицах, а не в десятках или сотнях, потому что в таком случае, придется контролировать корректность данного файла на каждой машине.
/etc/networks
Данный файл хранит имена и адреса локальной и других сетей. Пример:
ip-server:~# cat /etc/networks default 0.0.0.0 loopback 127.0.0.0 link-local 169.254.0.0 home-network 192.168.1.0
При использовании данного файла, сетями можно управлять по имени. Например добавить маршрут не route add 192.168.1.12, а route add home-network.
/etc/nsswitch.conf
Файл определяет порядок поиска имени хоста/сети, за данную настройку отвечают строки:
Для хостов: hosts: files dns Для сетей: networks: files
Параметр files указывает использовать указанные файлы (/etc/hosts и /etc/networks соответственно), параметр dns указывает использовать службу dns.
/etc/resolv.conf
Этот файл определяет параметры механизма преобразования сетевых имен в IP адреса. Пример:
ip-server:~# cat /etc/resolv.conf nameserver 10.0.0.4 nameserver 10.0.0.1 search domain.local
Первые 2 строчки указывают сервера DNS. Третья строка указывает домены поиска. Если при разрешении имени, имя не будет FQDN-именем, то данный домен подставиться в виде «окончания». Например при выполнении команды ping host, прингуемый адрес преобразуется в host.domain.local. Остальные параметры можно почитать в man resolv.conf.
В современных дистрибутивах Linux используется динамическая генерация данного файла, с помощью утилиты resolvconf. Она является посредником между службами, динамически предоставляющими сервера имен (например DHCP client) и службами, использующими данные сервера имен. Статические адреса DNS серверов, в случае использования resolvconf, задаются внутри /etc/network/interfaces (подробнее об этом — в разделе настройки).
Настройка сети
Диагностика сети Linux
Существует большое количество инструментов диагностики сети в Linux, зачастую, они очень похожи на утилиты от Microsoft. Я рассмотрю 3 основные утилиты диагностики сети, без которых выявить неполадки будет проблематично.
ping
Думаю, что данная утилита знакома чуть ли не каждому. Работа этой утилиты заключается в отправке т.н. пакетов ICMP удаленному серверу, который будет указан в параметрах команды, сервер возвращает отправленные команды, а ping подсчитывает время требуемое отправленному пакету, чтобы дойти до сервера и вернуться. Например:
[root@proxy ~]# ping ya.ru PING ya.ru (87.250.251.3) 56(84) bytes of data. 64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=1 ttl=57 time=42.7 ms 64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=2 ttl=57 time=43.2 ms 64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=3 ttl=57 time=42.5 ms 64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=4 ttl=57 time=42.5 ms 64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=5 ttl=57 time=41.9 ms ^C --- ya.ru ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4012ms rtt min/avg/max/mdev = 41.922/42.588/43.255/0.500 ms
Как видно, из приведенного примера, ping выводит нам кучу полезной информации. Прежде всего, мы выяснили, что можем установить соединение с хостом ya.ru (иногда говорят, что «хост ya.ru нам доступен»). Во-вторых, мы видим, что DNS работает корректно, потому что «пингуемое» имя было корректно преобразовано в IP адрес (PING ya.ru (87.250.251.3)). Далее, в поле icmp_seq= указана нумерация отправляемых пакетов. Каждому отправляемому пакету последовательно присваивается номер и если в данной нумерации будут «провалы», то это нам расскажет о том, что соединение с «пингуемым» неустойчиво, а так же может означать, что сервер, которому шлют пакеты перегружен. По значению time= мы видим, сколько времени пакет путешествовал до 87.250.251.3 и обратно. Остановить работу утилиты ping можно клавишами Ctrl+C.
Так же, утилита ping интересна тем, что может позволить увидеть, где именно возникли неполадки. Допустим, утилита ping выводит сообщение network not reachable (сеть недоступна), либо другое аналогичное сообщение. Это, скорее всего, говорит о некорректной настройке вашей системы. В таком случае, можно послать пакеты по IP-адресу провайдера, чтобы понять, в каком месте возникает проблема (между локальным ПК или «дальше»). Если Вы подключены к интернету через маршрутизатор, то можно послать пакеты по его IP. Соответственно, если проблема проявиться уже на этом этапе, это говорит, о неправильном конфигурировании локальной системы, либо о повреждении кабеля, если маршрутизатор отзывается, а сервер провайдера нет, то проблема — в канале связи провайдера и т.д. Наконец, если неудачей завершилось преобразовании имени в IP, то можно проверить связь по IP, если ответы будут приходить корректно, то можно догадаться, что проблема в DNS.
Следует отметить, что данная утилита не всегда надежный инструмент для диагностики. Удаленный сервер может блокировать ответы на ICMP запросы.
traceroute
Простым языком, команда называется трассировка маршрута. Как можно понять из названия — данная утилита покажет по какому маршруту шли пакеты до хоста. Утилита traceroute несколько похожа на ping, но отображает больше интересной информации. Пример:
[root@proxy ~]# traceroute ya.ru traceroute to ya.ru (213.180.204.3), 30 hops max, 60 byte packets 1 243-083-free.kubtelecom.ru (213.132.83.243) 6.408 ms 6.306 ms 6.193 ms 2 065-064-free.kubtelecom.ru (213.132.64.65) 2.761 ms 5.787 ms 5.777 ms 3 lgw.kubtelecom.ru (213.132.75.54) 5.713 ms 5.701 ms 5.636 ms 4 KubTelecom-lgw.Krasnodar.gldn.net (194.186.6.177) 81.430 ms 81.581 ms 81.687 ms 5 cat26.Moscow.gldn.net (194.186.10.118) 47.789 ms 47.888 ms 48.011 ms 6 213.33.201.230 (213.33.201.230) 43.322 ms 41.783 ms 41.106 ms 7 carmine-red-vlan602.yandex.net (87.250.242.206) 41.199 ms 42.578 ms 42.610 ms 8 www.yandex.ru (213.180.204.3) 43.185 ms 42.126 ms 42.679 ms
Как видно, можно проследить маршрут от маршрутизатора провайдера 243-083-free.kubtelecom.ru (213.132.83.243) (Юг россии) до конечного хоста в www.yandex.ru (213.180.204.3) в москве.
dig
Данная утилита посылает запросы серверам DNS и возвращает информацию о заданном домене. Пример:
[root@proxy ~]# dig @ns.kuban.ru roboti.ru ; <<>> DiG 9.3.6-P1 <<>> @ns.kuban.ru roboti.ru ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64412 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;roboti.ru. IN A ;; ANSWER SECTION: roboti.ru. 448 IN A 72.52.4.90 ;; AUTHORITY SECTION: roboti.ru. 345448 IN NS ns1.sedoparking.com. roboti.ru. 345448 IN NS ns2.sedoparking.com. ;; Query time: 102 msec ;; SERVER: 62.183.1.244#53(62.183.1.244) ;; WHEN: Thu Feb 17 19:44:59 2011 ;; MSG SIZE rcvd: 94
Команда dig послала запрос серверу DNS — ns.kuban.ru (@ns.kuban.ru — данный параметр указывать не обязательно, в таком случае источником информации о DNS будет взят сервер из настройки вашей системы) о доменном имени roboti.ru. В результате чего, получила ответ, в котором мы можем увидеть в разделе ANSWER SECTION информацию об IP адресах домена, в разделе AUTHORITY SECTION информацию о т.н. авторитетных DNS серверах. Третья строка снизу говорит нам о том, какой сервер предоставил ответ.
Другие утилиты диагностики
Подключение новой сетевой карты
Подключение и запуск новой сетевой карты сводится к выполнению нескольких шагов:
-
Физическое подключение карты
-
Просмотр вывода dmesg на обнаружение системой новой сетевой карты:
Посмотрим вывод ДО подключения новой карты:server:~# dmesg | grep eth [ 4.720550] e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection [ 5.130191] e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection [ 15.285527] e1000: eth2: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX [ 15.681056] e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
в выводе видно, что в системе есть 2 сетевые карты eth1 и eth2. Подключаем третью и смотрим вывод:server:~# dmesg | grep eth [ 4.720513] e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection [ 5.132029] e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection [ 5.534684] e1000: eth2: e1000_probe: Intel(R) PRO/1000 Network Connection [ 39.274875] udev: renamed network interface eth2 to eth3 [ 39.287661] udev: renamed network interface eth1_rename_ren to eth2 [ 45.670744] e1000: eth2: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX [ 46.237232] e1000: eth0: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX [ 96.977468] e1000: eth3: e1000_watchdog: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
В dmesg мы видим, что появилась новая сетевушка — eth3, которая на самом деле — eth2, но переименована менеджером устройств udev в eth3, а eth2 — это на самом деле переименованная eth1 (об udev мы поговорим в отдельном посте). Появление нашей новой сетевой в dmesg нам говорит, что сетевая карта поддерживается ядром и корректно определилась. Осталось дело за малым — настроить новый интерфейс в /etc/network/interfaces (Debian), потому что данная карта не была инициализирована стартовым скриптом /etc/init.d/network. ifconfig данную карту видит:
server:~# ifconfig eth3 eth3 Link encap:Ethernet HWaddr 08:00:27:5f:34:ad inet6 addr: fe80::a00:27ff:fe5f:34ad/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:311847 errors:0 dropped:0 overruns:0 frame:0 TX packets:126 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:104670651 (99.8 MiB) TX bytes:16184 (15.8 KiB)
но опять же — не конфигурирует. Как конфигурировать сетевую карту говорилось выше.
Резюме
Думаю, на сегодня это все. Когда начал писать данную статью, думал что впишусь в один пост, но он получился громаден. Посему было решено разбить статью на две. Итого, я постарался изложить, не пошаговое хауту по настройке сети, а изложить принцип и объяснить понимание того, как же запускается и работает сеть в Linux. Очень надеюсь, что мне это удалось. Буду рад вашим комментариями и дополнениям. Со временем, буду статью дополнять.
Что еще почитать по теме?
Автор | Раздел |
---|---|
Крамаренко Максим | как сделать … |
Перед тем, как приступать к настройке сетевого подключения в Линукс, надо начать с того, что посмотреть — какие настройки сети используются сейчас. Для этого надо воспользоваться командой ifconfig. В информационном режиме она доступна и без прав ROOT, хотя для её полноценного использования лучше получить привилегии суперпользователя, введя команду sudo ifconfig. Результатом её работы будет список имеющихся в системе сетевых подключений и их параметров.
В разных версиях Линукс имя сетевого интерфейса может быть сокращением от Ethernet — eth0, eth1, eth2 и т.п.
На интерфейс lo — сокращение от loopback — то есть локальная петля с адресом 127.0.0.1.
Для примера рассмотрим интерфейс Eth0.
В строке inet addr отображается текущий IP-адрес компьютера в локальной сети, подключенной к этой сетевой карте. В примере это: 192.168.1.144
Bcast — это широковещательный адрес в сети, так называемый Бродкаст(Broadcast).
Mask — это маска сети.
HWaddr — это аппаратный адрес сетевой карты, он же MAC-адрес, используемый на канальном уровне.
Информацию о текущих подключения узнали, теперь рассмотрим настройку локальной сети в Linux. Сделать это можно тремя способами:
1 — Через графическую оболочку
2 — через команду ifconfig или инструмент Network Manager
3 — через конфигурационные файлы сетевого сервиса Netork или Networking.
На мой взгляд, последний способ — самый удобный и надёжный, а значит — правильный. Чтобы настроить сеть в Линукс надо открыть файл, содержащий конфиг интерфейса. Тут всё зависит от того, какой дистрибутив Linux используется.
Вариант 1. В дистрибутивах, основанных на Debian (Ubuntu, Kubuntu и т.п.)
Файл с параметрами сетевого подключения:
/etc/network/interfaces
Для того, чтобы изменить в linux настройки сети, файл его надо с правами root любым текстовым редактором. Например, через nano:
sudo nano /etc/network/interfaces
Для автоматического получения адресов от DHCP-сервера надо пописать следующее:
allow-hotplug eth0 iface eth0 inet dhcp
Если адрес надо прописать статически, то указываем следующее:
allow-hotplug eth0 iface eth0 inet static address 192.168.1.2 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 dns-nameservers 192.168.1.1
В этом конфиге рассмотрен пример обычной домашней сети, где адрес компьютера будет 192.168.1.2, адрес шлюза и DNS-сервера (их фукнции обычно выполняет wifi-роутер)- 192.168.1.1.
Вариант 2. RedHat-based дистрибутивы (Fedora, OpenSuse, CentOS)
Файл с настройками сети Linux:
/etc/sysconfig/network-scripts/ifcfg-eth0
Открываем его так же через nano или vim:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
В случае автоматического получения настроек от DHCP-сервера:
DEVICE=eth0 BOOTPROTO=dhcp HWADDR=00-1C-1B-11-F6-07 ONBOOT=yes
Статический IP-адрес:
DEVICE=eth0 HWADDR=00-1C-1B-11-F6-07 IPADDR=192.168.1.2 NETMASK=255.255.255.0 BROADCAST=192.168.1.255 GATEWAY=192.168.1.1 ONBOOT=yes
IP-адреса DNS-серверов в этом случае прописываются в файле
/etc/resolv.conf
вот пример для публичных DNS-серверов от Google:
nameserver 8.8.8.8 nameserver 8.8.4.4
Настройка сети в Линукс завершена. Остаётся только перезапустить сеть командой:
service network restart
или
/etc/init.d/network restart
Собственно всё.
В качестве постскриптума расскажу как включить и выключить сеть в Linux. Делается это через всё ту же команду ifconfig. Выключить сетевую карту eth0:
sudo ifconfig eth0 down
Включить сетевую плату в Линуксе обратно:
sudo ifconfig eth0 up
Полностью остановить работу всех сетевых интерфейсов.
service network stop
Или:
/etc/init.d/network stop
Включить всё назад:
service network start
Или:
/etc/init.d/network restart
Мы можем настроить сетевые интерфейсы в Linux во время установки.
Но некоторые из вас могут предпочесть сделать это после установки или изменить существующие настройки.
Как вы уже знаете, для настройки сетевых параметров из командной строки необходимо сначала узнать, сколько интерфейсов доступно в системе.
В этом подробном руководстве рассматриваются все возможные способы перечисления и поиска доступных сетевых интерфейсов в операционных системах Linux и Unix.
Содержание
- 1. Отображение сетевых интерфейсов с помощью команды ifconfig
- 2. Вывод списка сетевых интерфейсов с помощью команды ip
- 3. Выводим список сетевых интерфейсов с помощью каталога /sys/class/net/
- 4. Смотрим список сетевых интерфейсов с помощью файла /proc/net/dev
- 5. Строим список сетевых интерфейсов с помощью команды netstat
- 6. Находим список сетевых интерфейсов с помощью команды nmcli
- 7. Как показать список сетевых интерфейсов с помощью hwinfo
- 8. Как показать сетевые интерфейсы с помощью lshw
- 9. Просмотр сетевых интерфейсов с помощью inxi
- 10. Отображение сетевых интерфейсов с помощью команды lspci
- Как вывести только имена доступных сетевых интерфейсов
- Заключение
1. Отображение сетевых интерфейсов с помощью команды ifconfig
Наиболее часто используемый метод поиска информации о сетевом интерфейсе – команда ifconfig.
Я полагаю, что некоторые пользователи Linux все еще используют ее.
$ ifconfig -a
Пример вывода:
enp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 24:b6:fd:37:8b:29 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 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 171420 bytes 303980988 (289.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 171420 bytes 303980988 (289.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlp9s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.225.37 netmask 255.255.255.0 broadcast 192.168.225.255 inet6 2409:4072:6183:c604:c218:85ff:fe50:474f prefixlen 64 scopeid 0x0<global> inet6 fe80::c218:85ff:fe50:474f prefixlen 64 scopeid 0x20<link> ether c0:18:85:50:47:4f txqueuelen 1000 (Ethernet) RX packets 564574 bytes 628671925 (599.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 299706 bytes 60535732 (57.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Как видно из приведенного выше вывода, у меня есть два сетевых интерфейса, а именно enp5s0 (встроенный адаптер проводной сети Ethernet) и wlp9s0 (адаптер беспроводной сети) на моей Linux-машине.
Также lo – это интерфейс loopback, который используется для локального доступа ко всем сетевым сервисам.
Он имеет IP-адрес 127.0.0.1.
Мы также можем использовать ту же команду ‘ifconfig’ во многих вариантах UNIX, например, во FreeBSD, для получения списка доступных сетевых карт.
2. Вывод списка сетевых интерфейсов с помощью команды ip
Команда ‘ifconfig’ устарела в последних версиях Linux.
Устаревшие сетевые команды Linux и их замены
Поэтому вы можете использовать команду ‘ip’ для отображения сетевых интерфейсов, как показано ниже.
$ ip link show
Пример вывода:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 24:b6:fd:37:8b:29 brd ff:ff:ff:ff:ff:ff 3: wlp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000 link/ether c0:18:85:50:47:4f brd ff:ff:ff:ff:ff:ff
Вы также можете использовать следующие команды:
$ ip addr
$ ip -s link
Заметили ли вы, что эта команда также показывает состояние подключения сетевых интерфейсов?
Если вы внимательно посмотрите на приведенный выше вывод, вы заметите, что моя карта Ethernet не подключена сетевым кабелем (см. слово “DOWN” в приведенном выше выводе).
А беспроводная сетевая карта подключена (см. слово “UP”). Для получения более подробной информации ознакомьтесь с нашим предыдущим руководством по поиску подключенного состояния сетевых интерфейсов в Linux.
Этих двух команд (ifconfig и ip) достаточно, чтобы найти доступные сетевые карты в ваших системах Linux.
Однако в Linux существует несколько других способов составления списка сетевых интерфейсов.
3. Выводим список сетевых интерфейсов с помощью каталога /sys/class/net/
Ядро Linux сохраняет информацию о сетевых интерфейсах в каталоге /sys/class/net.
Вы можете проверить список доступных интерфейсов, заглянув в этот каталог.
$ ls /sys/class/net
Вывод:
enp5s0 lo virbr0 wlp9s0
4. Смотрим список сетевых интерфейсов с помощью файла /proc/net/dev
В операционных системах Linux файл /proc/net/dev содержит статистику о сетевых интерфейсах.
Чтобы просмотреть доступные сетевые карты, просто просмотрите его содержимое с помощью команды:
$ cat /proc/net/dev
Вывод:
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo: 2836 30 0 0 0 0 0 0 2836 30 0 0 0 0 0 0 enp5s0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 wlp9s0: 557664882 402062 0 0 0 0 0 0 20087136 165358 0 0 0 0 0 0 virbr0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5. Строим список сетевых интерфейсов с помощью команды netstat
Команда netstat отображает различные детали, такие как сетевые соединения, таблицы маршрутизации, статистику интерфейсов, маскарадные соединения и многоадресные членства.
$ netstat -i
Вывод:
Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg enp5s0 1500 0 0 0 0 0 0 0 0 BMU lo 65536 30 0 0 0 30 0 0 0 LRU virbr0 1500 0 0 0 0 0 0 0 0 BMU wlp9s0 1500 402063 0 0 0 165361 0 0 0 BMRU
Пожалуйста, имейте в виду, что netstat устарел.
Заменой для “netstat -i” является “ip -s link”.
Также обратите внимание, что этот метод выведет список только активных интерфейсов, а не всех доступных интерфейсов.
6. Находим список сетевых интерфейсов с помощью команды nmcli
nmcli – это инструмент командной строки для управления NetworkManager и составления отчетов о состоянии сети.
Он используется для создания, отображения, редактирования, удаления, активации и деактивации сетевых соединений и отображения состояния сети.
Если у вас установлена система Linux с Network Manager, вы можете перечислить доступные сетевые интерфейсы с помощью инструмента nmcli, используя следующие команды:
$ nmcli device status
Вывод:
DEVICE TYPE STATE CONNECTION wlp9s0 wifi connected JioFi4_12E9FE virbr0 bridge connected (externally) virbr0 p2p-dev-wlp9s0 wifi-p2p disconnected -- enp5s0 ethernet unavailable -- lo loopback unmanaged --
Вы также можете использовать эту команду для отображения сетевых интерфейсов в вашей системе Linux:
$ nmcli connection show
Большинство вышеупомянутых утилит предустановлены в большинстве систем Linux и Unix.
Существует еще несколько внешних утилит для отображения списка сетевых карт.
7. Как показать список сетевых интерфейсов с помощью hwinfo
Hwinfo – это утилита командной строки для просмотра информации об аппаратном обеспечении в системе Linux.
Она проверяет наличие аппаратного обеспечения в системе Linux и отображает подробную информацию о каждом аппаратном устройстве.
Hwinfo доступна в официальных репозиториях многих дистрибутивов Linux.
Чтобы установить hwinfo в системах на базе RPM, выполните команду:
$ sudo dnf install hwinfo
На системах на базе Deb вы можете установить hwinfo с помощью следующей команды:
$ sudo apt install hwinfo
После установки выполните следующую команду, чтобы перечислить имена сетевых интерфейсов с помощью утилиты hwinfo:
$ sudo hwinfo --short --network
Вывод:
network interface: enp5s0 Ethernet network interface virbr0 Ethernet network interface wlp9s0 Ethernet network interface lo Loopback network interface
8. Как показать сетевые интерфейсы с помощью lshw
Lshw (Hardware Lister) – это утилита CLI, которая предоставляет подробную информацию об аппаратной конфигурации системы Linux.
Чтобы показать список сетевых карт в Linux с помощью утилиты lshw, выполните следующие действия:
$ sudo lshw -class network -short
Вывод:
H/W path Device Class Description =============================================================== /0/100/1c.1/0 enp5s0 network RTL810xE PCI Express Fast Ethernet controller /0/100/1c.3/0 wlp9s0 network AR9285 Wireless Network Adapter (PCI-Express)
9. Просмотр сетевых интерфейсов с помощью inxi
Inxi – это еще один инструмент для получения системной информации из командной строки, такой же, как hwinfo и lshw.
Он показывает аппаратное обеспечение системы, процессор, драйверы, Xorg, рабочий стол, ядро, версию(и) GCC, процессы, использование оперативной памяти и множество другой полезной информации.
Чтобы показать информацию о сетевых картах, включая производителя, драйвер карты и количество доступных сетевых интерфейсов в системе Linux, запустите inix с опцией -N:
$ inxi -N Network: Device-1: Realtek RTL810xE PCI Express Fast Ethernet driver: r8169 Device-2: Qualcomm Atheros AR9285 Wireless Network Adapter driver: ath9k
См. также:
- 🐧 Как найти скрытые каталоги, файлы и папки Linux / Unix
- 🐧 Как найти все файлы, принадлежащие определенному пользователю в Unix / Linux
- 🐧 Как найти все файлы с правами 777 на Linux
- 📂 Как найти текущий рабочий каталог процесса, используя Pwdx на Linux
10. Отображение сетевых интерфейсов с помощью команды lspci
Команда lspci выводит список всех PCI-устройств в системе Linux.
Чтобы просмотреть список доступных сетевых интерфейсов в системе Linux, используйте lspci с командой egrep, как показано ниже:
$ lspci | egrep -i 'network|ethernet|wireless|wi-fi'
Вывод:
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL810xE PCI Express Fast Ethernet controller (rev 05) 09:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
Как вывести только имена доступных сетевых интерфейсов
До сих пор мы рассматривали различные методы поиска доступных сетевых интерфейсов в Linux.
Во всех вышеупомянутых методах мы отображали доступные сетевые интерфейсы вместе с некоторыми дополнительными деталями, такими как данные RX/TX, Mac-адрес, состояние подключения, режим, тип сети и некоторые другие.
Если вы хотите убрать ненужные детали и перечислить только название сетевых интерфейсов, вы можете использовать одну из следующих команд.
$ ifconfig -a | sed 's/[ t].*//;/^$/d'
Вывод:
enp5s0: lo: virbr0: wlp9s0:
Чтобы исключить устройство loopback (lo) из вывода, выполните эту команду:
$ ifconfig -a | sed 's/[ t].*//;/^(lo|)$/d'
Как было сказано ранее, команда ifconfig устарела.
Если команда ifconfig недоступна, используйте команду ip для отображения только имен сетевых интерфейсов с флагом -o, как показано ниже:
$ ip -o link show | awk -F': ' '{print $2}' lo enp5s0 wlp9s0 virbr0
Вы также можете использовать следующую команду:
$ ip addr show | awk '/^[1-9]/ {print $2}'
Заключение
В этом руководстве мы рассмотрели десять различных методов поиска и вывода списка доступных сетевых интерфейсов в Linux и Unix
. Мы также рассмотрели несколько способов отображения только имени сетевых интерфейсов в системах Linux.
Существуют Linux-команды, которые всегда должны быть под рукой у системного администратора. Эта статья посвящена 7 утилитам, предназначенным для работы с сетью.
Этот материал — первый в серии статей, построенных на рекомендациях, собранных от множества знатоков Linux. А именно, я спросил у наших основных разработчиков об их любимых Linux-командах, после чего меня буквально завалили ценными сведениями. А именно, речь идёт о 46 командах, некоторые из которых отличает тот факт, что о них рассказало несколько человек.
В данной серии статей будут представлены все эти команды, разбитые по категориям. Первые 7 команд, которым и посвящена эта статья, направлены на работу с сетью.
Команда ip
Команда ip
— это один из стандартных инструментов, который необходим любому системному администратору для решения его повседневных задач — от настройки новых компьютеров и назначения им IP-адресов, до борьбы с сетевыми проблемами существующих систем. Команда ip
может выводить сведения о сетевых адресах, позволяет управлять маршрутизацией трафика и, кроме того, способна давать данные о различных сетевых устройствах, интерфейсах и туннелях.
Синтаксис этой команды выглядит так:
ip <OPTIONS> <OBJECT> <COMMAND>
Самое важное тут — это <OBJECT>
(подкоманда). Здесь можно использовать, помимо некоторых других, следующие ключевые слова:
address
— адрес протокола (IPv4 или IPv6) на устройстве.tunnel
— IP-туннель.route
— запись таблицы маршрутизации.rule
— правило в базе данных политики маршрутизации.vrf
— управление виртуальными устройствами маршрутизации и перенаправления трафика.xfrm
— управление IPSec-политикой.
Ниже приведены примеры, демонстрирующие распространённые сценарии использования команды ip
.
Вывод IP-адресов, назначенных интерфейсу на сервере:
[root@server ~]# ip address show
Назначение IP-адреса интерфейсу, например — enps03
:
[root@server ~]# ip address add 192.168.1.254/24 dev enps03
Удаление IP-адреса из интерфейса:
[root@server ~]# ip address del 192.168.1.254/24 dev enps03
Изменение статуса интерфейса, в данном случае — включение eth0
:
[root@server ~]# ip link set eth0 up
Изменение статуса интерфейса, в данном случае — выключение eth0
:
[root@server ~]# ip link set eth0 down
Изменение статуса интерфейса, в данном случае — изменение MTU eth0
:
[root@server ~]# ip link set eth0 mtu 9000
Изменение статуса интерфейса, в данном случае — перевод eth0
в режим приёма всех сетевых пакетов:
[root@server ~]# ip link set eth0 promisc on
Добавление маршрута, используемого по умолчанию (для всех адресов), через локальный шлюз 192.168.1.254, который доступен на устройстве eth0
:
[root@server ~]# ip route add default via 192.168.1.254 dev eth0
Добавление маршрута к 192.168.1.0/24 через шлюз на 192.168.1.254:
[root@server ~]# ip route add 192.168.1.0/24 via 192.168.1.254
Добавление маршрута к 192.168.1.0/24, который доступен на устройстве eth0
:
[root@server ~]# ip route add 192.168.1.0/24 dev eth0
Удаление маршрута для 192.168.1.0/24, для доступа к которому используется шлюз 192.168.1.254:
[root@server ~]# ip route delete 192.168.1.0/24 via 192.168.1.254
Вывод маршрута к IP 10.10.1.4:
[root@server ~]# ip route get 10.10.1.4
Команда ifconfig
Команда ifconfig
до определённого времени представляла собой один из основных инструментов, используемых многими системными администраторами для настройки сетей и решения сетевых проблем. Теперь ей на замену пришла команда ip
, о которой мы только что говорили. Но если вас, всё же, интересует эта команда, можете взглянуть на данный материал.
Команда mtr
MTR
(Matt’s traceroute) — это программа, работающая в режиме командной строки, представляющая собой инструмент для диагностики сетей и устранения сетевых неполадок. Эта команда совмещает в себе возможности ping
и traceroute
. Она, как traceroute
, может выводить сведения о маршруте, по которому сетевые данные идут от одного компьютера к другому. Она выводит массу полезных сведений о каждом шаге маршрутизации, например — время ответа системы. Благодаря использованию команды mtr
можно получить довольно подробные сведения о маршруте, можно обнаружить устройства, которые вызывают проблемы при прохождении данных по сети. Если, например, наблюдается рост времени ответа системы, или рост числа потерянных пакетов, это позволяет с уверенностью говорить о том, что где-то между исследуемыми системами возникла проблема с сетевым соединением.
Синтаксис команды выглядит так:
mtr <options> hostname/IP
Рассмотрим несколько распространённых способов применения mtr
.
Если вызвать эту команду, указав лишь имя или адрес хоста — она выведет сведения о каждом шаге маршрутизации. В частности — имена хостов, сведения о времени их ответа и о потерянных пакетах:
[root@server ~]# mtr google.com
Вот — вариант использования mtr
, когда вместо имён хостов выводятся их IP-адреса (речь идёт о ключе -g
, благодаря которому вместо имён выводятся числовые IP-адреса):
[root@server ~]# mtr -g google.com
А следующий вариант команды позволяет выводить и имена, и IP-адреса хостов:
[root@server ~]# mtr -b google.com
Так можно задать количество ping-пакетов, которые нужно отправить системе, маршрут к которой подвергается анализу:
[root@server ~]# mtr -c 10 google.com
А так можно получить отчёт, содержащий результаты работы mtr
:
[root@server ~]# mtr -r -c 10 google.com > mtr-command-google-output
Вот — ещё один вариант получения такого отчёта:
[root@server ~]# mtr -rw -c 10 google.com > mtr-command-google-output
Для того чтобы принудительно использовать TCP вместо ICMP — надо поступить так:
[root@server ~]# mtr –tcp google.com
А вот так можно использовать UDP вместо ICMP:
[root@server ~]# mtr –udp google.com
Вот — вариант команды, где задаётся максимальное количество шагов маршрутизации:
[root@server ~]# mtr -m 35 216.58.223.78
Так можно настроить размер пакета:
[root@server ~]# mtr -r -s 50 google.com
Для вывода результатов работы mtr
в формате CSV используется такая команда:
[root@server ~]# mtr –csv google.com
Вот — команда для вывода результатов работы mtr
в формате XML:
[root@server ~]# mtr –xml google.com
Команда tcpdump
Утилита tcpdump
предназначена для захвата и анализа пакетов.
Установить её можно так:
[root@server ~]# dnf install -y tcpdump
Прежде чем приступить к захвату пакетов, нужно узнать о том, какой интерфейс может использовать эта команда. В данном случае нужно будет применить команду sudo
или иметь root-доступ к системе.
[root@server ~]# tcpdump -D
1 eth0
2 nflog
3 nfqueue
4 usbmon1
5 any
6 lo (Loopback)
Если нужно захватить трафик с интерфейса eth0
— этот процесс можно запустить такой командой:
[root@server ~]# tcpdump -i eth0
Или — такой, с указанием (через ключ -c
) количества пакетов, которые нужно захватить:
[root@server ~]# tcpdump -i eth0 -c 10
▍ Захват трафика, идущего к некоему хосту и от него
Можно отфильтровать трафик и захватить лишь тот, который приходит от определённого хоста. Например, чтобы захватить пакеты, идущие от системы с адресом 8.8.8.8 и уходящие к этой же системе, можно воспользоваться такой командой:
[root@server ~]# tcpdump -i eth0 -c 10 host 8.8.8.8
Для захвата трафика, идущего с хоста 8.8.8.8, используется такая команда:
[root@server ~]# tcpdump -i eth0 src host 8.8.8.8
Для захвата трафика, уходящего на хост 8.8.8.8, применяется такая команда:
[root@server ~]# tcpdump -i eth0 dst host 8.8.8.8
▍ Захват трафика, идущего в некую сеть и из неё
Трафик можно захватывать и ориентируясь на конкретную сеть. Делается это так:
[root@server ~]# tcpdump -i eth0 net 10.1.0.0 mask 255.255.255.0
Ещё можно поступить так:
[root@server ~]# tcpdump -i eth0 net 10.1.0.0/24
Можно, кроме того, фильтровать трафик на основе его источника или места, в которое он идёт.
Вот — пример захвата трафика, отфильтрованного по его источнику (то есть — по той сети, откуда он приходит):
[root@server ~]# tcpdump -i eth0 src net 10.1.0.0/24
Вот — захват трафика с фильтрацией по сети, в которую он направляется:
[root@server ~]# tcpdump -i eth0 dst net 10.1.0.0/24
▍ Захват трафика, поступающего на некий порт и выходящего из некоего порта
Вот пример захвата трафика только для DNS-порта по умолчанию (53):
[root@server ~]# tcpdump -i eth0 port 53
Захват трафика для заданного порта:
[root@server ~]# tcpdump -i eth0 host 8.8.8.8 and port 53
Захват только HTTPS-трафика:
[root@server ~]# tcpdump -i eth0 -c 10 host www.google.com and port 443
Захват трафика для всех портов кроме 80 и 25:
[root@server ~]# tcpdump -i eth0 port not 80 and not 25
Команда netstat
Инструмент netstat
используется для вывода сведений о сетевых соединениях и таблицах маршрутизации, данных о работе сетевых интерфейсов, о masquerade-соединениях, об элементах групп многоадресной рассылки. Эта утилита является, как и ifconfig
, частью пакета net-tools
. В новом пакете iproute2
для достижения тех же целей используется утилита ss
.
Если в вашей системе netstat
отсутствует, установить эту программу можно так:
[root@server ~]# dnf install net-tools
Ей, в основном, пользуются, вызывая без параметров:
[root@server ~]# netstat
В более сложных случаях её вызывают с параметрами, что может выглядеть так:
netstat <options>
Можно вызывать netstat
и с несколькими параметрами, перечислив их друг за другом:
netstat <option 1> <option 2> <option 3>
Для вывода сведений обо всех портах и соединениях, вне зависимости от их состояния и от используемого протокола, применяется такая конструкция:
[root@server ~]# netstat -a
Для вывода сведений обо всех TCP-портах применяется такой вариант команды:
[root@server ~]# netstat -at
Если нужны данные по UDP-портам — утилиту вызывают так:
[root@server ~]# netstat -au
Список портов любых протоколов, ожидающих соединений, можно вывести так:
[root@server ~]# netstat -l
Список TCP-портов, ожидающих соединений, выводится так:
[root@server ~]# netstat -lt
Так выводят список UDP-портов, ожидающих соединений:
[root@server ~]# netstat -lu
А так — список UNIX-портов, ожидающих соединений:
[root@server ~]# netstat -lx
Вот — команда для вывода статистических сведений по всем портам вне зависимости от протокола:
[root@server ~]# netstat -s
Так выводятся статистические сведения по TCP-портам:
[root@server ~]# netstat -st
Для просмотра списка TCP-соединений с указанием PID/имён программ используется такая команда:
[root@server ~]# netstat -tp
Для того чтобы найти процесс, который использует порт с заданным номером, можно поступить так:
[root@server ~]# netstat -an | grep ‘:<port number>’
Команда nslookup
Команда nslookup
используется для интерактивного «общения» с серверами доменных имён, находящимися в интернете. Она применяется для выполнения DNS-запросов и получения сведений о доменных именах или IP-адресах, а так же — для получения любых других специальных DNS-записей.
Рассмотрим распространённые примеры использования этой команды.
Получение A-записи домена:
[root@server ~]# nslookup example.com
Просмотр NS-записей домена:
[root@server ~]# nslookup -type=ns example.com
Выяснение сведений о MX-записях, в которых указаны имена серверов, ответственных за работу с электронной почтой:
[root@server ~]# nslookup -query=mx example.com
Обнаружение всех доступных DNS-записей домена:
[root@server ~]# nslookup -type=any example.com
Проверка использования конкретного DNS-сервера (в данном случае запрос производится к серверу имён ns1.nsexample.com
):
[root@server ~]# nslookup example.com ns1.nsexample.com
Проверка A-записи для выяснения IP-адресов домена — это распространённая практика, но иногда нужно проверить то, имеет ли IP-адрес отношение к некоему домену. Для этого нужно выполнить обратный просмотр DNS:
[root@server ~]# nslookup 10.20.30.40
Команда ping
Команда ping
— это инструмент, с помощью которого проверяют, на уровне IP, возможность связи одной TCP/IP-системы с другой. Делается это с использованием эхо-запросов протокола ICMP (Internet Control Message Protocol Echo Request). Программа фиксирует получение ответов на такие запросы и выводит сведения о них вместе с данными о времени их приёма-передачи. Ping
— это основная команда, используемая в TCP/IP-сетях и применяемая для решения сетевых проблем, связанных с целостностью сети, с возможностью установления связи, с разрешением имён.
Эта команда, при простом способе её использования, принимает лишь один параметр: имя хоста, подключение к которому надо проверить, или его IP-адрес. Вот как это может выглядеть:
[root@server ~]# ping google.com
PING google.com (216.58.206.174) 56(84) bytes of data.
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=1 ttl=56 time=10.7 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=2 ttl=56 time=10.2 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=3 ttl=56 time=10.4 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=4 ttl=56 time=10.4 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=5 ttl=56 time=17.3 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 10.219/11.844/17.381/2.773 ms
В данном случае работу команды ping
можно остановить, воспользовавшись сочетанием клавиш CTRL+C
. В противном случае она будет выполнять запросы до тех пор, пока её не остановят. После каждой ping-сессии выводятся сводные данные, содержащие следующие сведения:
Min
— минимальное время, которое требуется на получение ответа от пингуемого хоста.Avg
— среднее время, которое требуется на получение ответа.Max
— максимальное время, которое требуется на получение ответа.
Кроме того, среди данных, выводимых программой о пакетах, есть такой параметр, как TTL (Time To Live, время жизни пакета). Тут используются числовые значения TTL, указывающие на то, сколько шагов маршрутизации может пройти пакет. Это значение ещё известно как «лимит переходов» (hop limit).
Обычно, если запустить команду ping
в её простом виде, не передавая ей дополнительные параметры, Linux будет пинговать интересующий пользователя хост без ограничений по времени. Если нужно изначально ограничить количество ICMP-запросов, например — до 10, команду ping
надо запустить так:
[root@server ~]# ping -c 10 google.com
А для того чтобы увидеть лишь итоговый отчёт работы ping
— можно воспользоваться ключом -q
:
[root@server ~]# ping -c 10 -q google.com
В системах с несколькими сетевыми интерфейсами можно задавать конкретный интерфейс, которым должна пользоваться команда ping
. Например, есть компьютер, имеющий интерфейсы eth0
и eth1
. Если нужно, чтобы команда ping
использовала бы интерфейс eth0
— надо запустить её так:
[root@server ~]# ping -I eth0 google.com
Или можно указать адрес интерфейса. В данном случае речь идёт об IP-адресе 10.233.201.45:
[root@server ~]# ping -I 10.233.201.45 google.com
Применяя эту команду, можно указать и то, какую версию протокола IP использовать — v4 или v6:
[root@server ~]# ping -4 google.com
[root@server ~]# ping -6 google.com
В процессе работы с утилитой ping
вы столкнётесь с различными результатами. В частности, это могут быть сообщения о нештатных ситуациях. Рассмотрим три таких ситуации.
▍ Destination Host Unreachable
Вероятной причиной получения такого ответа является отсутствие маршрута от локальной хост-системы к целевому хосту. Или, возможно, это удалённый маршрутизатор сообщает о том, что у него нет маршрута к целевому хосту.
▍ Request timed out
Если результат работы ping
выглядит именно так — это значит, что локальная система не получила, в заданное время, эхо-ответов от целевой системы. По умолчанию используется время ожидания ответа в 1 секунду, но этот параметр можно настроить. Подобное может произойти по разным причинам. Чаще всего это — перегруженность сети, сбой ARP-запроса, отбрасывание пакетов фильтром или файрволом и прочее подобное.
▍ Unknown host/Ping Request Could Not Find Host
Такой результат может указывать на то, что неправильно введено имя хоста, или хоста с таким именем в сети просто не существует.
О хорошем качестве связи между исследуемыми системами говорит уровень потери пакетов в 0%, а так же — низкое значение времени получения ответа. При этом в каждом конкретном случае время получения ответа варьируется, так как оно зависит от разных параметров сети. В частности — от того, какая среда передачи данных используется в конкретной сети (витая пара, оптоволокно, радиоволны).
Итоги
Надеемся, вам пригодятся команды и примеры их использования, о которых мы сегодня рассказали. А если они вам и правда пригодились — возможно, вам будет интересно почитать продолжение этого материала.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Стоит ли делать перевод, продолжение этой статьи?
Проголосовали 274 пользователя.
Воздержались 28 пользователей.
Состояние перевода: На этой странице представлен перевод статьи Network configuration. Дата последней синхронизации: 12 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
В статье описана настройка сетевого подключения на 3-м уровне модели OSI и выше. Отдельные способы передачи информации рассматриваются на подстраницах /Ethernet и /Wireless.
Проверка подключения
При проблемах с подключением к сети последовательно проверьте, что:
- Сетевой интерфейс обнаружен и включён. В противном случае, проверьте драйвер устройства – см. /Ethernet#Драйвер устройства и /Wireless#Драйвер устройства.
- Вы подключены к сети: воткнут сетевой кабель или есть подключение к беспроводной сети.
- Сетевому интерфейсу присвоен IP-адрес.
- Правильно настроена таблица маршрутизации.
- Возможно пропинговать локальный IP-адрес (например, шлюз по умолчанию).
- Возможно пропинговать публичный IP-адрес (например,
8.8.8.8
— DNS-сервер Google). - Работает разрешение доменных имен (например,
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.
Управление сетевым подключением
Для настройки сетевого подключения сделайте следующее:
- Убедитесь, что сетевой интерфейс обнаружен и включён.
- Подключитесь к сети. Вставьте 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(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 интерфейс
- Обратите внимание:
-
- адрес указан в CIDR-нотации с маской подсети;
- спецсимвол
+
говорит утилитеip
вычислить широковещательный адрес на основе IP-адреса и маски подсети.
-
Примечание: Убедитесь, что добавленные вручную 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
|
Имя хоста
Имя хоста — уникальное имя-идентификатор машины в сети. Имя хоста хранится в файле /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 получить доступ к вашей системе.
- 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 может срабатывать несколько раз в процессе загрузки. Например, во втором правиле в примере выше шаблон "/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
Смотрите также
- Linux Network Administrators Guide
- Debian Reference: Network setup
- RHEL7: Networking Guide
- Monitoring and tuning the Linux Networking Stack: Receiving data
- Monitoring and tuning the Linux Networking Stack: Sending data
- Tracing a packet journey using tracepoints, perf and eBPF