Как в линукс найти сеть

Содержание

Доброго времени, уважаемые читатели. Публикую вторую часть статьи о сетевой подсистеме 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 серверах. Третья строка снизу говорит нам о том, какой сервер предоставил ответ.

Другие утилиты диагностики

Подключение новой сетевой карты

Подключение и запуск новой сетевой карты сводится к выполнению нескольких шагов:

  1. Физическое подключение карты

  2. Просмотр вывода 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. Очень надеюсь, что мне это удалось. Буду рад вашим комментариями и дополнениям. Со временем, буду статью дополнять.

Что еще почитать по теме?

Автор Раздел
Крамаренко Максим как сделать …

Настройка сети в Linux ubuntu fedora centos

Перед тем, как приступать к настройке сетевого подключения в Линукс, надо начать с того, что посмотреть — какие настройки сети используются сейчас. Для этого надо воспользоваться командой ifconfig. В информационном режиме она доступна и без прав ROOT, хотя для её полноценного использования лучше получить привилегии суперпользователя, введя команду sudo ifconfig. Результатом её работы будет список имеющихся в системе сетевых подключений и их параметров.

linux настройка локальной домашней сети линукс

В разных версиях Линукс имя сетевого интерфейса может быть сокращением от 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. 1. Отображение сетевых интерфейсов с помощью команды ifconfig
  2. 2. Вывод списка сетевых интерфейсов с помощью команды ip
  3. 3. Выводим список сетевых интерфейсов с помощью каталога /sys/class/net/
  4. 4. Смотрим список сетевых интерфейсов с помощью файла /proc/net/dev
  5. 5. Строим список сетевых интерфейсов с помощью команды netstat
  6. 6. Находим список сетевых интерфейсов с помощью команды nmcli
  7. 7. Как показать список сетевых интерфейсов с помощью hwinfo
  8. 8.  Как показать сетевые интерфейсы с помощью lshw
  9. 9. Просмотр сетевых интерфейсов с помощью inxi
  10. 10. Отображение сетевых интерфейсов с помощью команды lspci
  11. Как вывести только имена доступных сетевых интерфейсов
  12. Заключение

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.

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

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

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

Ping

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

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

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

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

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

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

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

  1. Убедитесь, что сетевой интерфейс обнаружен и включён.
  2. Подключитесь к сети. Вставьте Ethernet-кабель или подключитесь к беспроводной сети.
  3. Настройте сетевое подключение:
    • статический 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 получить доступ к вашей системе.

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

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

Вы можете изменить имя устройства, установив его вручную при помощи правила 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

Понравилась статья? Поделить с друзьями:
  • Как найти людей в алтайском крае
  • Как найти постановление по фио
  • Как найти операцию или в информатике
  • Как найти дифференциал второго порядка примеры
  • Как найти клавиатуру на телефоне андроид