Linux как маршрутизатор и фильтр [212.1]

Рейтинг: 68.5% · 14 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Linux как маршрутизатор и фильтр [212.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1] (вы здесь)
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 37. Linux как маршрутизатор и фильтр [212.1]

Задача урока - превратить обычный сервер в полноценный шлюз: заставить его пропускать чужой трафик между интерфейсами (форвардинг), подменять адреса для выхода локальной сети в интернет (NAT и masquerade) и закрыть периметр пакетным фильтром. В 2026 году актуальный инструмент фильтрации - nftables, а старый iptables живёт только как совместимость поверх того же ядерного движка. Разберём, как это устроено внутри, и научимся писать и сохранять правила.

Изображение

Как это работает

По умолчанию Linux ведёт себя как хост: пакет, чей адрес назначения не принадлежит самой машине, молча отбрасывается. Чтобы ядро начало пересылать такие пакеты между интерфейсами, нужно включить форвардинг - параметр sysctl net.ipv4.ip_forward. Только тогда машина становится маршрутизатором и смотрит в таблицу маршрутизации, куда отправить транзитный пакет дальше.

NAT - это переписывание адресов на лету. Когда хосты из сети 192.168.0.0/24 идут в интернет через шлюз, их приватные адреса наружу выпускать нельзя. SNAT подменяет адрес источника на внешний адрес шлюза, а masquerade - это частный случай SNAT, который сам подхватывает текущий IP исходящего интерфейса. Masquerade нужен там, где внешний адрес динамический (PPPoE, DHCP от провайдера); если адрес статический, выгоднее явный SNAT - он чуть быстрее, так как не дёргает интерфейс на каждый поток.

Внутри ядра весь фильтр и NAT работают через подсистему netfilter - набор хуков (prerouting, input, forward, output, postrouting), через которые проходит каждый пакет. И nftables, и legacy iptables вешают свои правила именно на эти хуки. Разница в том, что у iptables таблицы и цепочки жёстко зашиты (filter, nat, mangle), а в nftables вы создаёте таблицы и цепочки сами и задаёте их тип и приоритет. nftables даёт единый синтаксис для IPv4 и IPv6 (семейство inet), атомарную загрузку всего набора правил и наборы (sets) - быстрые хеш-структуры для списков адресов и портов вместо сотни отдельных правил.

Команды и примеры

Включаем форвардинг. Временно - через sysctl, постоянно - файлом в /etc/sysctl.d/:

Код: Выделить всё

sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-router.conf
sysctl --system        # перечитать все конфиги
cat /proc/sys/net/ipv4/ip_forward   # проверка, должно быть 1
Для IPv6 аналогично net.ipv6.conf.all.forwarding=1.

Базовый шлюз на nftables. eth0 - наружу, eth1 - в локальную сеть:

Код: Выделить всё

nft add table inet fw
nft 'add chain inet fw forward { type filter hook forward priority 0; policy drop; }'
nft 'add chain inet fw postrt  { type nat    hook postrouting priority 100; }'

# выпускаем локалку наружу с подменой адреса
nft add rule inet fw postrt oifname "eth0" masquerade
# разрешаем установленные и обратные соединения
nft add rule inet fw forward ct state established,related accept
# разрешаем новые соединения из локалки наружу
nft add rule inet fw forward iifname "eth1" oifname "eth0" accept
Статический SNAT вместо masquerade, если внешний IP известен:

Код: Выделить всё

nft add rule inet fw postrt oifname "eth0" snat ip to 203.0.113.10
Наборы (sets) - белый список разрешённых портов одной строкой:

Код: Выделить всё

nft 'add chain inet fw input { type filter hook input priority 0; policy drop; }'
nft add rule inet fw input ct state established,related accept
nft add rule inet fw input iif lo accept
nft add rule inet fw input tcp dport { 22, 80, 443 } accept
nft add rule inet fw input ip protocol icmp accept
Просмотр, сохранение и восстановление. nftables хранит весь набор в одном файле:

Код: Выделить всё

nft list ruleset                 # показать всё
nft list table inet fw           # одну таблицу
nft -s list ruleset > /etc/nftables.conf   # выгрузить (-s без счётчиков)
nft -f /etc/nftables.conf        # загрузить из файла (атомарно)
systemctl enable --now nftables  # автозагрузка при старте
В Debian/Ubuntu пакет nftables ставится через apt и сразу даёт сервис nftables.service; в RHEL/Fedora - через dnf install nftables, поверх firewalld (который сам пишет правила в nftables).

Legacy iptables - дать коротко, для экзамена. В 2026 это наследие, на современных дистрибутивах команда iptables на деле iptables-nft (обёртка над тем же движком):

Код: Выделить всё

iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Сохранение iptables отличается по семействам. Debian/Ubuntu - пакет iptables-persistent и команды:

Код: Выделить всё

iptables-save  > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
RHEL/Fedora - служба iptables-services и dnf, правила в /etc/sysconfig/iptables, сохранение через service iptables save. Но на RHEL 10 это deprecated, штатный путь - firewalld и nftables.

Частые грабли
  • Забыли включить ip_forward - правила NAT написаны верно, а пакеты не идут. Проверяйте /proc/sys/net/ipv4/ip_forward первым делом.
  • Поставили sysctl только через sysctl -w - после перезагрузки форвардинг отключается. Нужна запись в /etc/sysctl.d/.
  • masquerade в цепочке с типом filter или с неправильным priority - правило не срабатывает. NAT работает только в цепочке type nat hook postrouting (для SNAT/masquerade) или prerouting (для DNAT).
  • policy drop в цепочке forward или input, но не разрешили established,related и loopback - сервер режет ответы на собственные запросы и теряет связь по SSH. Сначала правило accept для lo и established, потом меняйте политику.
  • Смешали iptables-legacy и iptables-nft на одной машине - правила из разных бэкендов не видят друг друга, хотя ядро одно. Используйте update-alternatives и не плодите оба.
  • Редактировали /etc/nftables.conf, но не перезагрузили nftables.service - в памяти ядра остались старые правила.
Мини-лаба
  • Поднимите ВМ с двумя интерфейсами: eth0 в режиме NAT/моста наружу, eth1 в internal-сети с клиентом.
  • Включите net.ipv4.ip_forward через /etc/sysctl.d/ и убедитесь, что значение пережило reboot.
  • Создайте таблицу inet, цепочку postrouting типа nat и добавьте masquerade на oifname eth0.
  • С клиента из internal-сети пропингуйте 8.8.8.8 и через nft list ruleset посмотрите счётчики пакетов на правиле.
  • Закройте input политикой drop, разрешив lo, established,related и tcp dport 22 через set.
  • Выгрузите ruleset в /etc/nftables.conf, перезагрузите ВМ и проверьте, что правила и связь восстановились автоматически.
Контрольные вопросы
  • Какой sysctl-параметр превращает Linux-хост в маршрутизатор и как сделать его постоянным?
  • Чем masquerade отличается от SNAT и в каком случае каждый из них предпочтительнее?
  • Через какие хуки netfilter проходит транзитный пакет и в какой цепочке выполняется NAT источника?
  • Зачем в цепочке с политикой drop нужно правило для состояния established,related?
  • Какие преимущества дают наборы (sets) в nftables по сравнению с отдельными правилами?
  • Какие команды сохраняют и восстанавливают ruleset nftables и как обеспечить его автозагрузку?
👍4 ❤️1 🔥1 😄 🤔2
Аватара пользователя
tagarna
Сообщения: 1
Зарегистрирован: 31 май 2026, 09:26

Re: Linux как маршрутизатор и фильтр [212.1]

Сообщение tagarna »

А если внешний IP статический, реально есть смысл менять masquerade на snat? насколько прирост заметен под нагрузкой?
👍2 ❤️1 🔥 😄 🤔1
Аватара пользователя
plumper1
Сообщения: 1
Зарегистрирован: 12 май 2026, 10:01

Re: Linux как маршрутизатор и фильтр [212.1]

Сообщение plumper1 »

Поймал грабли: переписал nftables.conf, а правила старые. Оказалось забыл systemctl reload nftables, в памяти висел прошлый ruleset.
👍2 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Доступ к почтовым ящикам: Dovecot [211.3]
Следующая глава →
FTP-серверы [212.2]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей