1. Основы сетевой модели и управление интерфейсами через пакет iproute2
Основы сетевой модели и управление интерфейсами через пакет iproute2
В 2001 году в ядре Linux версии 2.4 произошла тихая революция: старый пакет net-tools, верой и правдой служивший десятилетиями, был официально признан устаревшим (deprecated). Несмотря на это, системные администраторы до сих пор по привычке вводят ifconfig или route -n, сталкиваясь с тем, что эти утилиты либо отсутствуют в современных дистрибутивах вроде RHEL 9 или последних версиях Debian, либо выдают некорректную информацию о сложных сетевых структурах. Современный стек Linux требует понимания пакета iproute2, который общается с ядром через протокол Netlink. Это не просто замена старых команд, а принципиально иной подход к управлению сетевой подсистемой, позволяющий манипулировать объектами, о которых net-tools даже не «подозревал».
Архитектура сетевого стека и роль Netlink
Прежде чем переходить к синтаксису команд, необходимо понять, как именно происходит взаимодействие пользователя и ядра Linux. В старой модели net-tools общение шло через системные вызовы ioctl. Этот механизм был ограниченным: он не позволял эффективно передавать сложные структуры данных и требовал постоянного опроса состояния интерфейсов.
Пакет iproute2 использует интерфейс Netlink — сокет-ориентированный протокол для обмена информацией между пространством пользователя (user space) и пространством ядра (kernel space). Netlink асинхронен, поддерживает широковещательные уведомления (например, когда интерфейс «падает», ядро само сообщает об этом подписанным процессам) и позволяет управлять не только адресами, но и политиками маршрутизации, очередями трафика (Traffic Control) и туннелями.
Основным инструментом пакета является утилита ip. Её синтаксис строится по объектно-ориентированному принципу:
ip [OPTIONS] OBJECT {COMMAND | help}
Где объектами могут выступать:
* link (L2) — физические или виртуальные сетевые устройства.
* addr (L3) — протокольные адреса (IPv4/IPv6) на устройствах.
* route — записи в таблице маршрутизации.
* neigh — записи в ARP-таблице (L2-L3 соответствие).
* rule — правила политики маршрутизации (Policy Based Routing).
Управление физическим уровнем: объект link
Работа с любым сетевым интерфейсом начинается с его активации и настройки параметров канального уровня. Объект link отвечает за всё, что касается «железа» или его виртуальной эмуляции, не затрагивая IP-адресацию.
Просмотр состояния и изменение статуса
Команда ip link show выводит список всех доступных интерфейсов. Важно уметь читать вывод этой команды, так как он содержит критические флаги:
* UP — интерфейс программно включен.
* LOWER_UP — физический линк установлен (кабель воткнут, сигнал есть).
* MTU (Maximum Transmission Unit) — максимальный размер кадра. По умолчанию для Ethernet это 1500 байт.
Для включения или выключения интерфейса используются команды:
ip link set dev eth0 up
ip link set dev eth0 down
Изменение параметров: MTU и MAC-адрес
В высокопроизводительных сетях (например, при работе с хранилищами iSCSI) часто требуется использование Jumbo Frames — кадров увеличенного размера.
ip link set eth0 mtu 9000
Изменение MAC-адреса (L2-адреса) может потребоваться для обхода ограничений провайдера или в целях безопасности:
ip link set dev eth0 address 00:11:22:33:44:55
Важно: перед изменением MAC-адреса интерфейс должен быть переведен в состояние down.
Работа с именами интерфейсов
Современные системы используют Predictable Network Interface Names (например, enp0s3), но иногда администратору удобнее вернуть классические имена или задать логические:
ip link set enp0s3 name external0
Это переименование сработает только в текущей сессии и требует, чтобы интерфейс был выключен.
Протокольный уровень: объект addr
В отличие от ifconfig, который привязывал один IP-адрес к одному интерфейсу (и требовал создания алиасов вроде eth0:1), утилита ip рассматривает адреса как независимые объекты, которых на одном интерфейсе может быть неограниченное количество.
Назначение и удаление адресов
Базовый синтаксис добавления адреса:
ip addr add 192.168.1.10/24 dev eth0
Здесь мы используем нотацию CIDR (Classless Inter-Domain Routing). Если мы добавим еще один адрес на тот же интерфейс:
ip addr add 10.0.0.5/8 dev eth0
Оба адреса будут активны одновременно. В выводе ip addr show они будут перечислены один за другим. Это критически важно для настройки виртуальных хостингов или обеспечения плавного переезда из одной подсети в другую.
Удаление адреса происходит аналогично:
ip addr del 192.168.1.10/24 dev eth0
Область видимости (Scope)
У каждого IP-адреса в Linux есть параметр scope, который определяет, насколько «далеко» этот адрес известен стеку:
global — адрес валиден везде (по умолчанию для большинства адресов).link — адрес валиден только на этом конкретном интерфейсе (например, IPv6 Link-Local адреса или широковещательные адреса подсетей).host — адрес валиден только внутри самого хоста (например, Loopback 127.0.0.1).Пример ручного указания scope:
ip addr add 192.168.50.1/24 dev eth0 scope link
Это скажет ядру, что данный адрес не должен использоваться для пакетов, уходящих за пределы этого сегмента сети.
Вторичные адреса и флаг secondary
Если вы назначаете несколько адресов из одной и той же подсети на один интерфейс, первый адрес становится первичным (primary), а остальные — вторичными (secondary).
Если удалить первичный адрес, по умолчанию ядро удалит и все вторичные. Чтобы этого избежать, в sysctl существует параметр net.ipv4.conf.all.promote_secondaries = 1, который при удалении первичного адреса «повышает» следующий за ним вторичный до статуса основного.
Управление соседями: объект neigh
Объект neigh (neighbour) управляет таблицей ARP (для IPv4) и Neighbor Discovery (для IPv6). Это мост между L2 и L3 уровнями.
Когда компьютер хочет отправить пакет на IP-адрес в локальной сети, он должен узнать MAC-адрес получателя. Результат этого процесса кэшируется.
Просмотр таблицы:
ip neigh show
Статусы записей:
* REACHABLE — адрес подтвержден и доступен.
* STALE — запись есть в кэше, но её актуальность давно не проверялась.
* DELAY — ядро ждет подтверждения доступности.
* FAILED — не удалось разрешить IP в MAC.
В задачах безопасности или при настройке специфического оборудования (например, роутеров с жесткой привязкой) может потребоваться создание статической записи:
ip neigh add 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
Параметр nud permanent (Neighbour Unreachability Detection) гарантирует, что запись не будет удалена по таймеру.
Маршрутизация: объект route
Маршрутизация в Linux — это процесс принятия решения о том, через какой интерфейс и какому следующему узлу (gateway) отправить пакет.
Просмотр таблиц маршрутизации
Команда ip route show (или сокращенно ip r) выводит основную таблицу маршрутизации (main). Однако Linux поддерживает до 255 различных таблиц маршрутизации.
По умолчанию используются три таблицы:
local (ID 255) — содержит маршруты к локальным адресам и широковещательным адресам. Имеет наивысший приоритет.main (ID 254) — обычная таблица, где хранятся все пользовательские маршруты.default (ID 253) — зарезервирована для нужд постобработки (редко используется).Добавление маршрутов
Маршрут по умолчанию (Default Gateway):
ip route add default via 192.168.1.1 dev eth0
Маршрут к конкретной сети:
ip route add 10.10.0.0/16 via 192.168.1.5 dev eth0
Маршрут типа «черная дыра» (Blackhole):
ip route add blackhole 1.1.1.1
Пакеты на этот адрес будут уничтожаться ядром без уведомления отправителя, что полезно для защиты от простых DoS-атак или блокировки нежелательного трафика.
Метрики и выбор маршрута
Если в системе есть два канала в интернет, у них могут быть разные метрики. Ядро выбирает маршрут с наименьшей метрикой:
ip route add default via 10.0.0.1 dev eth0 metric 100
ip route add default via 192.168.1.1 dev eth1 metric 200
В данном случае трафик пойдет через eth0.
Анализ выбора маршрута
Одной из самых полезных функций iproute2 для диагностики является возможность спросить у ядра: «А как ты отправишь пакет на этот адрес?»
ip route get 8.8.8.8
Ядро вернет полный путь: через какой адрес, какой интерфейс и с каким исходным IP (source address) уйдет пакет. Это позволяет мгновенно выявить ошибки в конфигурации маршрутизации без отправки реальных пакетов.
Продвинутые возможности: Policy Based Routing (PBR)
Стандартная маршрутизация базируется только на адресе назначения (Destination IP). Однако Linux позволяет принимать решения на основе:
* Адреса отправителя (Source IP).
* Входящего интерфейса.
* Маркировки пакетов (через iptables/nftables).
* Протокола или порта.
Для этого используется объект ip rule.
Просмотр правил:
ip rule show
По умолчанию правила выглядят так:
0: from all lookup local32766: from all lookup main32767: from all lookup defaultЧисло в начале — это приоритет (чем меньше, тем выше приоритет). Пример задачи: направить весь трафик от конкретного пользователя или подсети через другой шлюз.
100):ip route add default via 10.1.1.1 table 100192.168.50.0/24 в эту таблицу:ip rule add from 192.168.50.0/24 table 100Теперь основной шлюз системы может быть одним, а для выбранной подсети — совершенно другим. Это основа для построения сложных VPN-шлюзов и систем балансировки нагрузки.
Виртуальные интерфейсы: VLAN, Bridge, Bond
Пакет iproute2 полностью взял на себя функции создания виртуальных сущностей, для которых раньше требовались отдельные утилиты (vconfig, brctl).
VLAN (802.1Q)
Создание тегированного интерфейса:ip link add link eth0 name eth0.10 type vlan id 10
Здесь eth0 — родительский интерфейс, а 10 — VLAN ID. После создания интерфейс eth0.10 ведет себя как обычная сетевая карта.Bridge (Мост)
Мост объединяет несколько интерфейсов в один L2-сегмент (аналог программного коммутатора).ip link add name br0 type bridge
ip link set eth1 master br0
ip link set eth2 master br0
ip link set br0 up
Теперь eth1 и eth2 работают как порты одного свитча.Bonding (Агрегация каналов)
Для повышения отказоустойчивости или пропускной способности:ip link add bond0 type bond mode 802.3ad
ip link set eth0 master bond0
ip link set eth1 master bond0
Это заменяет старые методы настройки через файлы в /proc/net/bonding.Диагностика и мониторинг в реальном времени
Команда ip monitor позволяет «подслушивать» события сетевого стека. Если запустить её в отдельном терминале, вы будете видеть в реальном времени:
* Появление и исчезновение IP-адресов.
* Изменение статуса линков (up/down).
* Обновление таблиц маршрутизации.
* Изменения в ARP-таблице.
Это незаменимый инструмент при отладке скриптов автоматизации или поиске причин кратковременных разрывов связи.
Сравнение с устаревшим стеком (net-tools)
Для понимания глубины изменений приведем таблицу соответствия:
| Задача | Старая команда (net-tools) | Новая команда (iproute2) |
| :--- | :--- | :--- |
| Показать все интерфейсы | ifconfig -a | ip link show |
| Назначить IP-адрес | ifconfig eth0 192.168.1.1 | ip addr add 192.168.1.1/24 dev eth0 |
| Показать таблицу маршрутов | route -n | ip route show |
| Показать ARP-таблицу | arp -n | ip neigh show |
| Включить интерфейс | ifconfig eth0 up | ip link set eth0 up |
| Создать VLAN | vconfig add eth0 10 | ip link add link eth0 name eth0.10 type vlan id 10 |
Главное преимущество iproute2 не в краткости (иногда старые команды короче), а в атомарности и полноте данных. ifconfig часто скрывает адреса, назначенные через ip addr, если они не соответствуют формату алиасов. Это может привести к ситуации, когда администратор «не видит» работающий на сервере адрес, что является критической брешью в безопасности.
Нюансы работы с MTU и фрагментацией
При настройке интерфейсов через ip link важно помнить о влиянии MTU на производительность. Если на пути пакета встречается узел с меньшим MTU, происходит фрагментация.
В Linux можно управлять поведением стека в таких случаях через атрибуты маршрутов:
ip route add 10.0.0.0/24 via 192.168.1.1 mtu lock 1400
Флаг lock запрещает ядру пытаться изменять MTU для этого маршрута в рамках процесса Path MTU Discovery. Это бывает полезно в сетях, где ICMP-сообщения (необходимые для работы PMTUD) блокируются фаерволами.
Статистика и глубокий анализ
Объект link позволяет получать детальную статистику по ошибкам, коллизиям и сброшенным пакетам:
ip -s link show eth0
Вывод покажет два блока данных: RX (прием) и TX (передача). Обращайте внимание на параметры:
* errors: общие ошибки (проблемы с кабелем или драйвером).
* dropped: пакеты, сброшенные из-за переполнения буфера или отсутствия ресурсов.
* overrun: ситуация, когда ядро не успевает забирать данные из кольцевого буфера сетевой карты.
Если вы видите рост overrun, это сигнал к тому, что система не справляется с нагрузкой на сетевом уровне и требуется тюнинг очередей (RSS/RPS), который мы будем рассматривать в следующих главах.
Тонкости удаления объектов
Удаление объектов в iproute2 требует осторожности. Например, команда:
ip addr flush dev eth0
Удалит все адреса с интерфейса одним действием. Это гораздо быстрее и эффективнее, чем удалять каждый адрес по отдельности в цикле, особенно если на интерфейсе висят сотни или тысячи IP (что часто бывает в контейнеризированных средах или на нагруженных веб-серверах).
Аналогично работает ip route flush cache, которая очищает кэш маршрутизации ядре. В современных ядрах (начиная с 3.6) кэш маршрутизации IPv4 был удален и заменен более эффективной структурой FIB (Forwarding Information Base), но команда сохранена для совместимости и очистки некоторых параметров.
Резюмируя философию iproute2
Переход на iproute2 — это переход от управления «железками» к управлению «объектами сетевого графа». Понимание того, что адрес — это не свойство интерфейса, а самостоятельная сущность, привязанная к нему, открывает двери к сложным конфигурациям: Anycast-адресам, VRF (Virtual Routing and Forwarding) и продвинутому туннелированию.
Изучение iproute2 является фундаментом. Даже если в вашем дистрибутиве используется NetworkManager, systemd-networkd или netplan, все они «под капотом» используют те же механизмы Netlink, которыми вы манипулируете через команду ip. Знание этих основ позволяет диагностировать проблемы там, где высокоуровневые утилиты бессильны или выдают абстрактные ошибки.