Изучение настроек сетевого интерфейса с помощью ethtool в Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь использовать утилиту командной строки ethtool для проверки и управления настройками сетевых интерфейсов в среде Linux. Вы начнете с установки инструмента и определения основного сетевого интерфейса. После этого вы попрактикуетесь в просмотре текущей скорости интерфейса и режима дуплекса, вручную установите эти параметры в определенную конфигурацию, например, 10 Мбит/с полудуплекс, а затем вернете интерфейс в состояние автоматического согласования по умолчанию.

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

Установка ethtool и идентификация вашего сетевого интерфейса

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

Сначала обновим список пакетов и установим ethtool. Хорошей практикой является выполнение apt update перед установкой новых пакетов, чтобы гарантировать получение последних доступных версий из репозиториев.

Откройте терминал, который уже должен быть открыт в вашей директории ~/project. Выполните следующие команды:

sudo apt update
sudo apt install ethtool -y

Флаг -y автоматически отвечает "да" на запрос установки, делая процесс неинтерактивным. Вы должны увидеть вывод, указывающий на чтение списков пакетов и установку ethtool.

Теперь, когда ethtool установлен, вам нужно определить, какой сетевой интерфейс вы хотите исследовать. Система может иметь несколько интерфейсов, таких как интерфейс обратной связи (lo), проводной Ethernet-интерфейс (eth0 или enp0s3) и другие. Команда ip является современным стандартом для отображения и управления сетевыми устройствами, адресами и маршрутами.

Чтобы вывести список всех сетевых интерфейсов и их конфигураций, используйте команду ip a (сокращение от ip addr):

ip a

Вы увидите список всех сетевых интерфейсов. Найдите интерфейс, который не является lo (интерфейс обратной связи) и имеет состояние UP. Обычно это ваше основное сетевое соединение. Имя обычно eth0 или имя, начинающееся с enp.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:b1:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.232/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159922sec preferred_lft 1892159922sec
    inet6 fe80::216:3eff:fe01:b1ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:da:5e:55:d4 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Из приведенного выше примера вывода имя основного сетевого интерфейса — eth0. Вы также можете увидеть другие интерфейсы, такие как docker0, но для этой лабораторной работы мы сосредоточимся на eth0. Запишите имя вашего интерфейса, так как оно понадобится вам на следующих шагах. Теперь вы успешно установили необходимый инструмент и определили целевой сетевой интерфейс.

Просмотр текущей скорости и дуплекса интерфейса с помощью ethtool

На этом этапе вы используете только что установленную утилиту ethtool для проверки текущего рабочего состояния вашего сетевого интерфейса. В частности, вы сосредоточитесь на двух критически важных параметрах: Speed (Скорость) и Duplex (Дуплекс).

Сетевые карты (NIC) работают на определенных скоростях (например, 10 Мбит/с, 100 Мбит/с, 1000 Мбит/с) и в одном из двух режимов дуплекса:

  • Half-duplex (Полудуплекс): Интерфейс может только отправлять или получать данные в данный момент, но не оба одновременно.
  • Full-duplex (Полный дуплекс): Интерфейс может отправлять и получать данные одновременно, что значительно увеличивает пропускную способность.

Современные сети почти всегда используют процесс, называемый автосогласованием (auto-negotiation), при котором сетевая карта и подключенное сетевое устройство (например, коммутатор) автоматически обмениваются данными для определения максимально возможной скорости и режима дуплекса, которые поддерживаются обоими.

Теперь давайте посмотрим эти настройки для сетевого интерфейса, который вы определили на предыдущем шаге (в качестве примера мы будем использовать eth0). В терминале выполните следующую команду. Не забудьте заменить eth0 на фактическое имя вашего интерфейса, если оно отличается.

ethtool eth0

После нажатия Enter вы увидите подробную информацию об интерфейсе. В некоторых виртуальных средах вы можете увидеть много значений "Not reported" (Не сообщается) или "Unknown" (Неизвестно), что указывает на ограниченные возможности виртуального сетевого интерфейса. Это нормально для данной лабораторной среды.

Settings for eth0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
netlink error: Operation not permitted
        Link detected: yes

Внимательно изучите вывод. Ключевые строки для этого шага:

  • Speed: Unknown!: Текущая скорость не сообщается драйвером.
  • Duplex: Unknown! (255): Режим дуплекса также не сообщается.
  • Auto-negotiation: off: Это важно. Это показывает, что интерфейс не настроен на автосогласование, поэтому на следующем шаге мы сможем вручную установить скорость и дуплекс.
  • netlink error: Operation not permitted: Эта ошибка часто встречается в контейнеризированных или виртуальных средах с ограниченными правами доступа. Она не помешает нам завершить лабораторную работу.

Строка Link detected: yes подтверждает, что физическое соединение с сетью активно. Эти настройки являются основополагающими для работы физического уровня (Уровень 1).

Ручная установка скорости интерфейса на 10 Мбит/с Half-Duplex

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

Важное примечание: Ручная установка этих параметров может вызвать проблемы с сетевым подключением, если она выполнена некорректно. Принудительная установка параметра, не соответствующего устройству на другом конце кабеля (например, порту коммутатора), может привести к несоответствию дуплекса (duplex mismatch), что серьезно ухудшает производительность сети, или может привести к полному отказу соединения. В этой виртуальной среде попытка внести изменения безопасна.

Для изменения настроек вы будете использовать команду ethtool с флагом -s, который означает "settings" (настройки). Эта операция требует прав администратора, поэтому необходимо использовать sudo.

Давайте попробуем установить скорость интерфейса на 10 Мбит/с и режим дуплекса на полудуплекс. Не забудьте заменить eth0 на имя вашего интерфейса, если оно отличается.

sudo ethtool -s eth0 speed 10 duplex half

Эта команда не выводит никакого сообщения об успехе. Чтобы подтвердить, были ли применены изменения, вы должны снова проверить настройки интерфейса, используя команду из предыдущего шага:

ethtool eth0

Теперь изучите вывод. Найдите строки Speed и Duplex. Даже несмотря на первоначальные ошибки, вы увидите, что команда установки скорости и дуплекса была выполнена успешно.

Settings for eth0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 10Mb/s
        Duplex: Half
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
netlink error: Operation not permitted
        Link detected: yes

Теперь вы должны увидеть Speed: 10Mb/s и Duplex: Half. Обратите внимание, что Auto-negotiation по-прежнему off, что ожидаемо, поскольку вы вручную установили параметры. Это подтверждает, что вы можете успешно изменять настройки сетевого интерфейса.

Просмотр и изменение функций разгрузки с помощью ethtool -k

На этом этапе вы научитесь проверять и изменять функции сетевой разгрузки (offload features). Это расширенные возможности сетевой карты (NIC), которые позволяют оборудованию выполнять задачи, обычно обрабатываемые центральным процессором (CPU), такие как вычисление контрольных сумм или сегментация данных. Разгрузка этих задач может повысить производительность сети.

Сначала давайте посмотрим текущие настройки разгрузки для вашего интерфейса, используя флаг -k (или --show-features).

ethtool -k eth0

Вы увидите список функций, некоторые из которых помечены как on (включено), а некоторые как off (выключено). Статус [fixed] означает, что настройка не может быть изменена пользователем.

Features for eth0:
rx-checksumming: on [fixed]
tx-checksumming: on
        tx-checksum-ipv4: off [fixed]
        tx-checksum-ip-generic: on
        tx-checksum-ipv6: off [fixed]
        tx-checksum-fcoe-crc: off [fixed]
        tx-checksum-sctp: off [fixed]
scatter-gather: on
        tx-scatter-gather: on
        tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: on
        tx-tcp-mangleid-segmentation: off
        tx-tcp6-segmentation: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
... (вывод длинный и может отличаться)

Теперь давайте попрактикуемся в изменении одной из этих настроек. Мы временно отключим TX checksumming (контрольную сумму при передаче). Эта операция требует прав администратора, поэтому необходимо использовать sudo и флаг -K (или --features).

sudo ethtool -K eth0 tx-checksumming off

Команда теперь сообщает о внесенных изменениях. Обратите внимание, что отключение tx-checksumming автоматически отключило другие связанные функции. Это связано с тем, что некоторые функции зависят от других.

Actual changes:
tx-checksum-ip-generic: off
tx-tcp-segmentation: off [not requested]
tx-tcp-ecn-segmentation: off [not requested]
tx-tcp6-segmentation: off [not requested]

Чтобы проверить изменение в полном списке, вы можете снова выполнить ethtool -k eth0.

Теперь давайте снова включим его, чтобы восстановить стандартное поведение, повышающее производительность.

sudo ethtool -K eth0 tx-checksumming on

Снова вывод показывает фактические изменения. Вы можете увидеть, что, даже если вы запросили функцию on, она останется off, если оборудование имеет фиксированную настройку. Также показано автоматическое повторное включение связанных функций.

Actual changes:
tx-checksum-ipv4: off [requested on]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [requested on]
tx-tcp-segmentation: on [not requested]
tx-tcp-ecn-segmentation: on [not requested]
tx-tcp6-segmentation: on [not requested]
tx-checksum-fcoe-crc: off [requested on]
tx-checksum-sctp: off [requested on]

Завершив этот шаг, вы узнали, как просматривать и изменять аппаратные функции разгрузки вашей сетевой карты, и увидели, как зависимости функций и аппаратные ограничения влияют на результат.

Изучение статистики интерфейса с помощью ethtool -S

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

Для просмотра этой статистики используйте флаг -S (или --statistics). Не забудьте заменить eth0 на имя вашего интерфейса.

ethtool -S eth0

Вывод будет представлять собой длинный список счетчиков. В данной среде сетевая карта (NIC) использует несколько очередей, поэтому статистика сообщается для каждой очереди. Давайте сосредоточимся на счетчиках пакетов rx_queue_ и tx_queue_.

NIC statistics:
     rx_queue_0_packets: 63768
     rx_queue_0_bytes: 93307801
     ...
     rx_queue_1_packets: 77180
     rx_queue_1_bytes: 111222183
     ...
     tx_queue_0_packets: 14363
     tx_queue_0_bytes: 4229599
     ...
     tx_queue_1_packets: 5287
     tx_queue_1_bytes: 1262219
     ... (много другой статистики)

Примечание: Ваши цифры будут отличаться, так как они отражают весь трафик с момента активации интерфейса.

Теперь давайте сгенерируем некоторый сетевой трафик, чтобы увидеть, как изменяются эти счетчики. Мы будем использовать команду ping для отправки нескольких пакетов на адрес обратной петли (127.0.0.1), который является локальной машиной. Флаг -c 4 указывает ping отправить ровно 4 пакета.

ping -c 4 127.0.0.1

Вы увидите вывод, показывающий отправку и получение 4 пакетов.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.037 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 0.037/0.038/0.040/0.001 ms

Теперь, когда вы сгенерировали некоторый трафик, давайте снова проверим статистику:

ethtool -S eth0

Снова изучите значения rx_queue_*_packets и tx_queue_*_packets.

NIC statistics:
     rx_queue_0_packets: 63879
     ...
     rx_queue_1_packets: 77227
     ...
     tx_queue_0_packets: 14460
     ...
     tx_queue_1_packets: 5328
     ... (много другой статистики)

Вы должны увидеть, что общее количество пакетов в очередях приема и передачи увеличилось. Из-за фоновой активности системы увеличение может быть больше, чем 4 пакета от нашей команды ping, но это изменение подтверждает, что интерфейс корректно отправляет и получает данные. Это фундаментальный метод проверки работоспособности соединения. Если бы вы устраняли проблему и видели увеличение счетчиков ошибок, это было бы явным признаком проблемы.

Резюме

В этой лабораторной работе вы научились управлять настройками сетевого интерфейса с помощью утилиты ethtool в Linux. Вы начали с установки пакета ethtool и определения имени основного сетевого интерфейса с помощью команды ip a. После этого вы использовали ethtool для изучения текущих рабочих параметров интерфейса, а затем вручную установили его скорость и режим дуплекса.

Далее лабораторная работа провела вас через исследование более продвинутых функций. Вы узнали, как просматривать и изменять настройки аппаратной разгрузки (hardware offload), такие как tx-checksumming, с помощью флагов -k и -K. Наконец, вы научились проверять подробную статистику интерфейса с помощью ethtool -S и генерировать трафик с помощью ping, чтобы в реальном времени наблюдать за изменением этой статистики, что обеспечивает практический метод проверки состояния соединения и устранения проблем с подключением.