Что вы найдете в этой шпаргалке
Вы держите в руках практическую памятку по управлению сетевым трафиком в Linux. Материал построен вокруг трех ключевых инструментов: ip route для статической маршрутизации, iptables для трансляции адресов и фильтрации, ip rule для гибкой политики маршрутизации на основе источника или метки пакета. Все примеры проверены на Ubuntu 24.04 и Debian 12, команды можно копировать и применять без адаптации.
Шпаргалка разбита на логические блоки. Сначала разберем базовые операции с таблицей маршрутизации: просмотр, добавление, удаление статических маршрутов и настройку шлюза по умолчанию. Затем перейдем к iptables: маскарадинг, проброс портов, сохранение правил. Третий блок посвящен policy routing с несколькими таблицами и ip rule. В конце - инструменты диагностики и сводная таблица команд для ежедневной работы. Если вам нужен более глубокий разбор конкретной темы, обратитесь к нашим расширенным руководствам по статической маршрутизации и Policy-Based Routing.
Управление таблицей маршрутизации: команды ip route
Утилита ip route из пакета iproute2 - основной инструмент для работы с таблицей маршрутизации в современных дистрибутивах. Команда route считается устаревшей и не рекомендуется к использованию. Все операции выполняются от root или через sudo.
Просмотр текущей таблицы маршрутизации
Для вывода основной таблицы маршрутизации выполните:
ip route show
Альтернативные формы той же команды: ip route list или ip r. Чтобы посмотреть содержимое конкретной таблицы, укажите её имя:
ip route show table main
ip route show table local
Разберем типовую строку вывода:
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100
- 192.168.1.0/24 - сеть назначения в CIDR-нотации.
- dev eth0 - интерфейс, через который доступна сеть.
- proto kernel - источник маршрута: kernel (автоматически при поднятии интерфейса), static (добавлен вручную), dhcp, bgp и другие.
- scope link - область действия: link означает прямую связность без шлюза, global - через шлюз.
- src 192.168.1.10 - предпочитаемый адрес источника для исходящих пакетов в эту сеть.
- metric 100 - вес маршрута: при наличии нескольких путей до одной сети выбирается маршрут с меньшей метрикой.
Строка со шлюзом по умолчанию выглядит так:
default via 192.168.1.1 dev eth0 proto static
Здесь default - синоним сети 0.0.0.0/0, via 192.168.1.1 - адрес следующего перехода.
Добавление и удаление статических маршрутов
Синтаксис добавления маршрута к подсети:
ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
Маршрут к конкретному хосту задается маской /32:
ip route add 203.0.113.50/32 via 192.168.1.254
Для IPv6 синтаксис аналогичен, но с ключевым словом -6:
ip -6 route add 2001:db8:1::/64 via 2001:db8:ff::1 dev eth0
Указание метрики позволяет влиять на приоритет маршрута:
ip route add 10.0.0.0/8 via 192.168.1.254 metric 200
Удаление маршрута выполняется командой del с тем же синтаксисом:
ip route del 10.0.0.0/8 via 192.168.1.254
Можно удалить все маршруты до конкретной сети разом:
ip route del 10.0.0.0/8
Маршруты, добавленные через ip route add, не переживают перезагрузку сети. Для постоянной конфигурации используйте Netplan, systemd-networkd или прописывайте команды в /etc/network/interfaces с директивой up. Подробный разбор постоянной настройки маршрутов через Netplan и systemd-networkd вы найдете в этом руководстве.
Настройка шлюза по умолчанию (default gateway)
Шлюз по умолчанию принимает все пакеты, для которых нет более специфичного маршрута. Добавление default gateway:
ip route add default via 192.168.1.1 dev eth0
Если шлюз уже существует и его нужно заменить, используйте replace - это атомарная операция, которая не приводит к разрыву соединения:
ip route replace default via 192.168.1.254 dev eth0
Предупреждение. При удаленной работе через SSH никогда не удаляйте старый шлюз до добавления нового. Последовательность ip route del default с последующим ip route add default via ... создает окно без маршрута по умолчанию. Вы потеряете связь с сервером. Правильный подход - сначала добавить новый шлюз с большей метрикой, проверить связность, затем удалить старый. Либо использовать ip route replace.
Удаление шлюза по умолчанию:
ip route del default
Для систем с несколькими интернет-каналами можно задать несколько default gateway с разными метриками. Трафик пойдет через шлюз с наименьшей метрикой, второй шлюз останется резервным. Детально этот сценарий разобран в блоке policy routing.
Фильтрация и перенаправление трафика с помощью iptables
Iptables - интерфейс к подсистеме netfilter ядра Linux. Правила организованы в таблицы и цепочки. Для задач маршрутизации важны три таблицы:
- filter - таблица по умолчанию, цепочки INPUT, FORWARD, OUTPUT. Используется для фильтрации пакетов.
- nat - трансляция сетевых адресов, цепочки PREROUTING, INPUT, OUTPUT, POSTROUTING.
- mangle - модификация заголовков пакетов, установка fwmark для policy routing.
Порядок прохождения пакета через цепочки зависит от его направления. Для транзитного трафика (форвардинг) последовательность такова: PREROUTING → FORWARD → POSTROUTING. Для локально сгенерированных пакетов: OUTPUT → POSTROUTING.
Маскарадинг (SNAT/MASQUERADE) для выхода в интернет
Маскарадинг позволяет хостам локальной сети с частными адресами выходить в интернет через единственный публичный IP шлюза. Сначала включите форвардинг пакетов:
sysctl -w net.ipv4.ip_forward=1
Для сохранения настройки после перезагрузки раскомментируйте или добавьте строку в /etc/sysctl.conf:
net.ipv4.ip_forward=1
Правило маскарадинга для интерфейса eth0, смотрящего в интернет:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Разберем синтаксис: -t nat - работаем с таблицей nat, -A POSTROUTING - добавляем правило в конец цепочки POSTROUTING (срабатывает после принятия решения о маршрутизации), -o eth0 - применяем только к пакетам, покидающим интерфейс eth0, -j MASQUERADE - действие: подменить адрес источника на адрес исходящего интерфейса.
Разница между SNAT и MASQUERADE: SNAT требует явного указания адреса источника (-j SNAT --to-source 203.0.113.5) и работает быстрее, так как не проверяет адрес интерфейса для каждого пакета. MASQUERADE автоматически подставляет текущий IP интерфейса и необходим при динамическом внешнем адресе. Для статического публичного IP предпочтительнее SNAT.
Проброс портов (DNAT) к внутренним серверам
Проброс порта позволяет направить входящее соединение с внешнего интерфейса на конкретный хост и порт внутренней сети. Правило состоит из двух частей: DNAT в цепочке PREROUTING и разрешающее правило в цепочке FORWARD.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
Пояснение: -i eth0 - входящий интерфейс, -p tcp --dport 8080 - протокол и порт назначения, -j DNAT --to-destination 192.168.1.100:80 - подменить адрес назначения на внутренний сервер и порт 80.
Разрешаем форвардинг этого трафика:
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
Если политика цепочки FORWARD по умолчанию DROP, добавьте также правило для обратного трафика:
iptables -A FORWARD -p tcp -s 192.168.1.100 --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
Сохранение и восстановление правил iptables
Правила iptables хранятся в памяти ядра и теряются при перезагрузке. Для сохранения используйте пакет iptables-persistent:
apt install iptables-persistent
При установке пакет предложит сохранить текущие правила. Для ручного сохранения в любой момент:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
Восстановление правил:
iptables-restore < /etc/iptables/rules.v4
Сервис netfilter-persistent автоматически загружает сохраненные правила при старте системы.
Policy Routing: маршрутизация на основе правил
Стандартная таблица маршрутизации принимает решение только на основе адреса назначения. Policy routing расширяет эту логику: вы можете направить трафик через разные шлюзы в зависимости от адреса источника, метки пакета (fwmark), TOS-поля или входящего интерфейса. Это критически важно для серверов с несколькими интернет-каналами, VPN-туннелями и изолированными сетевыми средами.
Создание дополнительных таблиц маршрутизации
Linux поддерживает до 256 таблиц маршрутизации с идентификаторами от 0 до 255. Зарезервированы: 0 (unspec), 253 (default), 254 (main), 255 (local). Пользовательские таблицы принято размещать в диапазоне 1-252. Именованные таблицы регистрируются в файле /etc/iproute2/rt_tables:
# Добавляем строки в /etc/iproute2/rt_tables
100 ISP1
200 ISP2
Теперь наполним таблицу ISP2 маршрутами. Предположим, второй провайдер подключен через интерфейс eth1 с адресом шлюза 10.0.0.1:
ip route add 10.0.0.0/24 dev eth1 src 10.0.0.100 table ISP2
ip route add default via 10.0.0.1 dev eth1 table ISP2
Первый маршрут описывает непосредственно подключенную сеть провайдера. Второй - шлюз по умолчанию в рамках этой таблицы.
Настройка правил выбора таблицы (ip rule)
Правила ip rule определяют, какую таблицу маршрутизации использовать для конкретного пакета. Правила просматриваются в порядке возрастания приоритета (числового значения).
Просмотр текущих правил:
ip rule show
Вывод по умолчанию содержит три правила:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Правило 0 обрабатывает локальные адреса самого хоста, 32766 - основная таблица, 32767 - таблица по умолчанию (обычно пустая).
Направим трафик, исходящий от подсети 192.168.2.0/24, через второго провайдера:
ip rule add from 192.168.2.0/24 lookup ISP2 priority 1000
Теперь любой пакет с адресом источника из этой подсети будет маршрутизироваться по таблице ISP2, а не main. Для привязки к конкретному приложению используйте маркировку пакетов через iptables:
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
ip rule add fwmark 1 lookup ISP2 priority 1001
Этот пример направляет весь исходящий HTTPS-трафик через второго провайдера независимо от адреса источника. Сценарий удобен для разделения трафика приложений между основным каналом и VPN-туннелем. Пошаговый разбор такой настройки с готовыми командами вы найдете в статье Source-based маршрутизация (PBR) на Linux.
Типовой сценарий: резервирование каналов с проверкой доступности
Схема с двумя провайдерами и автоматическим переключением при отказе основного канала - частый запрос в корпоративных средах. Простейший вариант - два шлюза по умолчанию с разными метриками в таблице main:
ip route add default via 192.168.1.1 metric 100
ip route add default via 10.0.0.1 metric 200
Пока шлюз с метрикой 100 доступен, трафик идет через него. При отказе интерфейса маршрут удаляется автоматически, и вступает в силу второй шлюз. Этот механизм работает только при физическом падении линка. Если канал «завис» на уровне провайдера, но линк остался поднятым, переключения не произойдет.
Для отслеживания логической доступности применяют скрипты с периодическим пингом внешнего хоста и условным изменением метрики:
#!/bin/bash
ping -c 3 -W 2 8.8.8.8 > /dev/null 2>&1
if [ $? -ne 0 ]; then
ip route replace default via 10.0.0.1 metric 50
else
ip route replace default via 192.168.1.1 metric 50
fi
Скрипт запускается по cron раз в минуту. При недоступности 8.8.8.8 через основной канал метрика резервного шлюза снижается до 50, и трафик переключается. Это минимальное решение. В production-средах рекомендуем использовать специализированные демоны вроде keepalived с VRRP или bird для динамической маршрутизации. Если вы проектируете отказоустойчивую инфраструктуру, присмотритесь к облачным решениям: Timeweb Cloud предоставляет готовую облачную инфраструктуру с настраиваемыми сетевыми интерфейсами и резервированием каналов.
Диагностика и отладка: как понять, куда идет трафик
Маршрутизация работает не так, как ожидалось? Набор инструментов для быстрой локализации проблемы.
ip route get - главный инструмент отладки. Показывает реальный путь пакета с учетом всех таблиц и правил policy routing:
ip route get 8.8.8.8 from 192.168.2.50
Вывод сообщит, через какой шлюз и интерфейс уйдет пакет, какую таблицу маршрутизации использовал и какой адрес источника будет подставлен.
traceroute - трассировка пути до удаленного хоста:
traceroute -n 8.8.8.8
Опция -n отключает DNS-резолвинг, ускоряя вывод. Для явного указания исходного адреса используйте -s.
tcpdump - захват трафика на интерфейсе для проверки, доходят ли пакеты:
tcpdump -i eth0 -n host 192.168.1.100 and port 80
Просмотр счетчиков iptables - покажет, сколько пакетов попало под каждое правило:
iptables -L -v -n -t nat
iptables -L -v -n -t filter
Ненулевые счетчики подтверждают, что правило срабатывает. Нулевые - повод проверить порядок правил и критерии совпадения.
Типовые ошибки и их признаки:
- Забытый
ip_forward- транзитные пакеты молча отбрасываются. Проверьте:sysctl net.ipv4.ip_forward. - Неверный порядок правил в iptables - пакет попадает под более раннее правило и не доходит до нужного. Используйте
-Iвместо-Aдля вставки в начало цепочки. - Конфликт маршрутов - две записи для одной сети с одинаковой метрикой. Ядро использует первую найденную, поведение недетерминировано.
- Отсутствие обратного маршрута - пакет уходит через один шлюз, а ответ возвращается через другой и отбрасывается как невалидный. Проверяйте симметричность путей.
- Неверный src в маршруте - пакет уходит с IP, не принадлежащим исходящему интерфейсу, и отбрасывается провайдером. Указывайте
srcявно в таблицах policy routing.
Для комплексного анализа сетевой связности в корпоративных средах обратитесь к руководству по IP-маршрутизации и диагностике.
Шпаргалка: типовые команды для ежедневной работы
Сводка всех ключевых команд из статьи в одной таблице. Копируйте и адаптируйте под свои адреса и интерфейсы.
| Задача | Команда |
|---|---|
| Просмотр таблицы маршрутизации | ip route show |
| Просмотр конкретной таблицы | ip route show table ISP2 |
| Добавить маршрут к подсети | ip route add 10.0.0.0/8 via 192.168.1.254 |
| Добавить маршрут к хосту | ip route add 203.0.113.50/32 via 192.168.1.254 |
| Добавить маршрут с метрикой | ip route add 10.0.0.0/8 via 192.168.1.254 metric 200 |
| Добавить IPv6 маршрут | ip -6 route add 2001:db8:1::/64 via 2001:db8:ff::1 |
| Удалить маршрут | ip route del 10.0.0.0/8 |
| Добавить шлюз по умолчанию | ip route add default via 192.168.1.1 |
| Заменить шлюз по умолчанию | ip route replace default via 192.168.1.254 |
| Включить форвардинг | sysctl -w net.ipv4.ip_forward=1 |
| Маскарадинг (NAT) | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
| Проброс порта (DNAT) | iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 |
| Сохранить правила iptables | iptables-save > /etc/iptables/rules.v4 |
| Восстановить правила iptables | iptables-restore < /etc/iptables/rules.v4 |
| Создать таблицу маршрутизации | echo '200 ISP2' >> /etc/iproute2/rt_tables |
| Добавить маршрут в таблицу | ip route add default via 10.0.0.1 table ISP2 |
| Правило policy routing по источнику | ip rule add from 192.168.2.0/24 lookup ISP2 |
| Маркировка пакета в iptables | iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1 |
| Правило policy routing по метке | ip rule add fwmark 1 lookup ISP2 |
| Проверить путь пакета | ip route get 8.8.8.8 from 192.168.2.50 |
| Трассировка маршрута | traceroute -n 8.8.8.8 |
| Счетчики правил iptables | iptables -L -v -n -t nat |
Эта шпаргалка покрывает 90% ежедневных задач системного администратора по управлению маршрутизацией. Для углубленного изучения отдельных тем используйте наши расширенные руководства. Если вы активно работаете с генерацией конфигураций и документации, обратите внимание на AiTunnel - агрегатор API нейросетей, который ускоряет рутинные задачи по написанию скриптов и описанию инфраструктуры.