Введение: Что такое NAT и зачем он нужен?
Определение и принцип работы
Динамическая сетевая трансляция портов (Dynamic Network Address Port Translation, NAPT или Masquerading) — это технология, позволяющая множеству устройств в локальной сети с приватными IP-адресами выходить в Интернет через один публичный IP-адрес маршрутизатора.
Как работает динамический NAT:
- Устройство в локальной сети (например, 172.16.1.50) отправляет запрос на внешний сайт
- Маршрутизатор фиксирует эту сессию в таблице состояний (connection tracking)
- Исходящий пакет модифицируется: приватный адрес источника заменяется на публичный IP маршрутизатора, а также меняется порт источника
- Ответ от внешнего сервера приходит на публичный IP и порт маршрутизатора
- Маршрутизатор по таблице состояний определяет, какому внутреннему устройству принадлежит ответ, и переправляет его
Преимущества использования NAT в Алт ОС Сервер:
1. Экономия IP-адресов
- Один публичный IP для всей организации
- Использование приватных адресов (RFC 1918) внутри сети
- Пример: 100 устройств используют 1 публичный IP
2. Повышенная безопасность
- Скрытие структуры внутренней сети
- Защита от прямых атак на конечные устройства
- Возможность централизованного контроля трафика
3. Гибкость и управление
- Централизованная политика доступа
- Мониторинг всего исходящего трафика
- QoS и ограничение пропускной способности
- Логирование сетевой активности
Типичные сценарии применения:
Для малого и среднего бизнеса:
- Обеспечение интернет-доступа для офиса
- Защита внутренней инфраструктуры
- Организация VPN для удаленных сотрудников
- Общий доступ к принтерам и файловым ресурсам
Для образовательных учреждений:
- Контроль доступа учащихся в Интернет
- Фильтрация нежелательного контента
- Квотирование трафика
- Логирование активности
Для домашних сетей:
- Подключение множества устройств (ПК, телефоны, IoT)
- Родительский контроль
- Защита домашней сети
Ваша конкретная задача
В данной статье мы рассмотрим классическую конфигурацию NAT-сервера:
- 2 сетевых интерфейса (минимальная конфигурация для организации доступа в Интернет)
- enp0s3 — внешний интерфейс, смотрит в Интернет (получает IP от провайдера)
- enp0s8 — внутренний интерфейс, смотрит в локальную сеть (172.16.1.0/24)
- Локальная сеть получает доступ в Интернет через NAT
- Рассмотрим два подхода: nftables (современная замена iptables) и firewalld (динамический фаервол с зонами)
Технические требования:
- Алт ОС Сервер 10.x или новее
- Минимум 2 сетевых интерфейса
- Права администратора (root)
- Базовое понимание сетевых технологий
Архитектура сети с двумя
Роли интерфейсов
enp0s3 (WAN) — Внешний интерфейс
- Подключение: Кабель от интернет-провайдера
- IP-адрес: Публичный, выдается провайдером
- Тип настройки: DHCP (автоматически) или Статический (по договору)
- Задача: Прием и передача трафика в Интернет
- Безопасность: Максимально закрыт, открыты только необходимые порты
enp0s8 (LAN) — Внутренний интерфейс
- Подключение: К внутреннему коммутатору (switch)
- IP-адрес: 172.16.1.1 (шлюз для локальной сети)
- Маска подсети: 255.255.255.0 (/24)
- Диапазон сети: 172.16.1.0 – 172.16.1.255
- Доступные адреса: 172.16.1.1 – 172.16.1.254
- Задача: Прием запросов от клиентов локальной сети
Почему выбрана сеть 172.16.1.0/24?
Сеть 172.16.1.0/24 относится к диапазону приватных адресов RFC 1918:
- 10.0.0.0/8 – для крупных сетей (до 16 млн устройств)
- 172.16.0.0/12 – для средних сетей (до 1 млн устройств)
- 192.168.0.0/16 – для малых сетей (до 65 тыс устройств)
Мы выбрали 172.16.1.0/24 потому что:
- Это приватный диапазон (не маршрутизируется в Интернете)
- Подсеть /24 дает 254 адреса — достаточно для большинства организаций
- Легко запоминается и расширяется (можно добавить 172.16.2.0/24 и т.д.)
Подготовка и сбор параметров
1. Инвентаризация оборудования и интерфейсов
Перед началом настройки необходимо точно определить, какие сетевые интерфейсы присутствуют в системе и как они именуются.
Команда для просмотра всех интерфейсов:
ip -c a
Пример вывода:
Что мы видим:
- lo — петлевой интерфейс (localhost), всегда присутствует
- enp0s3 — первый физический сетевой интерфейс (наша WAN)
- enp0s8 — второй физический сетевой интерфейс (наша LAN)
Важно: В Алт ОС имена интерфейсов имеют вид enpXsY, где X — шина PCI, Y — устройство. Это предсказуемые имена, они не меняются при перезагрузке.
2. Планирование локальной сети
Для сети на интерфейсе enp0s8 (172.16.1.0/24) определите:
Настройка сетевых интерфейсов
1. Подготовка системы
# Обновление системы (рекомендуется перед настройкой)
sudo apt-get update -y
# Установка необходимых пакетов
Для nftables
sudo apt-get install -y nftables dnsmasq bind-utils tcpdump traceroute NetworkManager-tui
Для firewalld
sudo apt-get install -y firewalld dnsmasq bind-utils tcpdump traceroute NetworkManager-tui
2. Настройка сетевых интерфейсов (enp0s3 и enp0s8)
Как настроить сетевые интерфейсы, можно почитать в следующей статье.
Настройка WAN-интерфейса (enp0s3) производится динамическии по DHCP.
Настройка LAN-интерфейса (enp0s8) производится вручную, тут необходимо задать статический ip-адресс 172.16.1.1/24.
Критически важные моменты:
- ❌ НЕ УКАЗЫВАЙТЕ GATEWAY — это приведет к конфликту маршрутов
- ✅ УКАЖИТЕ правильную маску (PREFIX="24" для 255.255.255.0)
- ✅ УБЕДИТЕСЬ, что адрес 172.16.1.1 не занят в вашей сети
# Перезапуск сети для применения конфигурации
sudo systemctl restart network
или если управляет NetworkManager
sudo systemctl restart NetworkManager
# Проверка состояния интерфейсов
ip -c a
# Проверка маршрутизации
ip route show
5. Включение IP-форвардинга
IP-форвардинг — это разрешение ядру Linux пересылать пакеты между интерфейсами. Без этого NAT работать не будет.
Чтобы включить пересылку пакетов между интерфейсами, необходимо отредактировать файл sysctl.conf
nano /etc/net/sysctl.conf
В данном файле меняем значение net.ipv4.ip_forward=0 на net.ipv4.ip_forward=1.
После необходимо применить внесенные изменения
sysctl -p /etc/net/sysctl.conf
Для проверки результата вводим команду sysctl net.ipv4.ip_forward
Настройка NAT через nftables.
Что такое nftables?
nftables — это современная подсистема фильтрации пакетов в Linux, пришедшая на смену классическому iptables. Она включена по умолчанию в Алт ОС и предлагает:
- Единый синтаксис для IPv4 и IPv6
- Производительность лучше, чем у iptables
- Меньшее потребление памяти
- Удобные наборы (sets) и словари (maps)
- Инкрементальное обновление правил
1. Базовая подготовка nftables
# Проверка установки
rpm -q nftables
# Запуск и включение автозагрузки
sudo systemctl enable --now nftables
# Создание резервной копии текущей конфигурации
sudo nft list ruleset > /etc/nftables.conf.backup
2. Создание конфигурации NAT
Создание таблицы и цепочек
bash
nft add table nat
nft add chain nat prerouting '{ type nat hook prerouting priority -100; }'
nft add chain nat postrouting '{ type nat hook postrouting priority 100; }'
3. Настройка правил NAT
Masquerade для внешнего интерфейса
bash
nft add rule nat postrouting oifname "enp0s3" masquerade
Разрешение форвардинга между интерфейсами
bash
nft add rule filter forward iifname "enp0s8" oifname "enp0s3" accept
nft add rule filter forward iifname "enp0s3" oifname "enp0s8" accept
Настройка правил для локальной сети
bash
nft add rule filter forward ip saddr 172.16.1.0/24 oifname "enp0s3" accept
4. Сохранение конфигурации
Просмотр текущих правил
bash
nft list ruleset
Сохранение в файл конфигурации
Проверяем откуда берет настройки nftables:
systemctl cat nftables
По умолчанию она берет настройки из файла /etc/nftables/nftables.nft. В него и сохраняем текущее правило.
bash
nft list ruleset >/etc/nftables/nftables.nft
Добавление автозагрузки
Добавьте в файл /etc/nftables/nftables.nft в начало:
bash
#!/usr/sbin/nft -f
flush ruleset
Проверка работы
Проверка статуса службы
bash
systemctl status nftables
Проверка правил
bash
nft list ruleset
Тестирование подключения
С устройства локальной сети (например, 172.16.1.2):
bash
ping 8.8.8.8
5. Дополнительные настройки
Резервное копирование
bash
nft list ruleset > nftables.backup
Восстановление правил
bash
nft -f nftables.backup
Перезапуск службы
bash
systemctl restart nftables
Важные замечания
- Убедитесь, что файрвол не блокирует необходимый трафик
- Проверьте корректность настроек IP-адресов интерфейсов
- При необходимости добавьте дополнительные правила для конкретных сервисов
- Сохраняйте резервные копии конфигурации перед внесением изменений
Настройка NAT через firewalld
Что такое firewalld?
firewalld — это динамический менеджер брандмауэра с поддержкой зон. В отличие от nftables/iptables, он:
- Позволяет изменять правила без перезагрузки
- Использует концепцию зон доверия
- Имеет простой синтаксис для типовых задач
- Интегрирован с NetworkManager
- Поддерживает D-Bus интерфейс
1. Подготовка firewalld
# Остановим nftables, чтобы избежать конфликта
sudo systemctl stop nftables
sudo systemctl disable nftables
# Запустим firewalld
sudo systemctl enable --now firewalld
# Проверка статуса
sudo firewall-cmd --state
2. Концепция зон в firewalld
Зона — это набор правил доверия для интерфейсов.
Для нашей задачи:
- enp0s3 → зона external (недоверенный Интернет)
- enp0s8 → зона internal (доверенная локальная сеть)
3. Настройка зон и интерфейсов
# Назначение интерфейсов зонам
sudo firewall-cmd --permanent --zone=external --change-interface=enp0s3
sudo firewall-cmd --permanent --zone=internal --change-interface=enp0s8
# Добавление источника (сеть) к зоне internal
sudo firewall-cmd --permanent --zone=internal --add-source=172.16.1.0/24
Дополнительные настройки зон.
# Настройка зоны external (Интернет)
sudo firewall-cmd --permanent --zone=external --set-target=DROP
sudo firewall-cmd --permanent --zone=external --add-service=https
sudo firewall-cmd --permanent --zone=external --add-service=http
sudo firewall-cmd --permanent --zone=external --add-icmp-block-inversion
sudo firewall-cmd --permanent --zone=external --add-icmp-block={echo-request,echo-reply}
# Настройка зоны internal (локальная сеть)
sudo firewall-cmd --permanent --zone=internal --set-target=ACCEPT
sudo firewall-cmd --permanent --zone=internal --add-service=ssh
sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
sudo firewall-cmd --permanent --zone=internal --add-service=dns
sudo firewall-cmd --permanent --zone=internal --add-service=samba
sudo firewall-cmd --permanent --zone=internal --add-port={631/tcp,445/tcp}
4. Включение NAT (маскарадинга)
Маскарадинг — это реализация NAT в firewalld:
# Включение маскарадинга для внешней зоны(Включена по умолчанию в External)
sudo firewall-cmd --permanent --zone=external --add-masquerade
# Проверка
sudo firewall-cmd --zone=external --query-masquerade
Пояснение: --add-masquerade автоматически подменяет адрес источника на IP интерфейса enp0s3 для всех пакетов, уходящих в Интернет.
5. Настройка форвардинга между зонами
Далее включаем новую политику
firewall-cmd --permanent --policy=gateway-lan-to-world --remove-disable
firewall-cmd --reload
firewall-cmd --info-policy=gateway-lan-to-world
6. Применение и проверка настроек
# Применение всех изменений
sudo firewall-cmd --reload
# Просмотр текущей конфигурации
sudo firewall-cmd --list-all-zones
# Проверка зоны external
sudo firewall-cmd --zone=external --list-all
# Проверка зоны internal
sudo firewall-cmd --zone=internal --list-all
# Проверка проброшенных портов
sudo firewall-cmd --zone=external --list-forward-ports
Тестирование подключения
С устройства локальной сети (например, 172.16.1.2):
bash
ping 8.8.8.8
Так же в firewalld можно провести дополнительные правила доступа при необходимости.
7. Проброс портов (port forwarding) в firewalld
# Проброс порта 80 на веб-сервер 172.16.1.10
sudo firewall-cmd --permanent --zone=external \
--add-forward-port=port=80:proto=tcp:toport=80:toaddr=172.16.1.10
# Проброс порта 443 на тот же сервер
sudo firewall-cmd --permanent --zone=external \
--add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.1.10
# Проброс порта 2222 на SSH сервера
sudo firewall-cmd --permanent --zone=external \
--add-forward-port=port=2222:proto=tcp:toport=22:toaddr=172.16.1.1
# Проброс диапазона портов для игр/приложений
sudo firewall-cmd --permanent --zone=external \
--add-forward-port=port=10000-20000:proto=udp:toport=10000-20000:toaddr=172.16.1.50
8. Расширенные правила (rich rules)
Rich rules позволяют создавать сложные условия:
# Ограничение SSH доступа только с определенного IP в локальной сети
sudo firewall-cmd --permanent --zone=internal \
--add-rich-rule='rule family="ipv4" source address="172.16.1.100" service name="ssh" accept'
# Ограничение скорости для ICMP (защита от ping flood)
sudo firewall-cmd --permanent --zone=external \
--add-rich-rule='rule family="ipv4" protocol value="icmp" icmp-type name="echo-request" limit value="5/minute" accept'
# Логирование попыток доступа к определенному порту
sudo firewall-cmd --permanent --zone=external \
--add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" log prefix="SSH-ATTEMPT: " limit value="3/m" accept'
9. Дополнительные полезные команды firewalld
# Блокировка определенного IP
sudo firewall-cmd --permanent --zone=external --add-rich-rule='rule family="ipv4" source address="123.123.123.123" drop'
# Разрешить доступ к серверу только из определенной страны (требуется geoip)
sudo firewall-cmd --permanent --zone=external --add-rich-rule='rule family="ipv4" source geoip="RU" accept'
# Временное открытие порта (на 1 минуту, для тестирования)
sudo firewall-cmd --zone=external --add-port=8080/tcp --timeout=60
# Блокировка всего трафика кроме SSH (аварийный режим)
sudo firewall-cmd --panic-on
sudo firewall-cmd --panic-off
Сравнение подходов и рекомендации
Сравнительная таблица nftables и firewalld
Когда выбирать nftables?
Используйте nftables, если:
- ✅ Вам нужна максимальная производительность (высоконагруженный сервер)
- ✅ Требуются сложные, многоступенчатые правила фильтрации
- ✅ Вы предпочитаете работать с конфигурационными файлами
- ✅ У вас есть опыт работы с iptables (переход на nftables будет легким)
- ✅ Нужна тонкая настройка с использованием множеств (sets) и словарей (maps)
Когда выбирать firewalld?
Используйте firewalld, если:
- ✅ Вам нужна быстрая, рабочая конфигурация "из коробки"
- ✅ Вы планируете часто менять правила (динамическая среда)
- ✅ Вы предпочитаете управлять через командную строку с простыми опциями
- ✅ У вас несколько зон с разными уровнями доверия
- ✅ Нужна интеграция с NetworkManager и графическими утилитами
Рекомендация для типового офиса
Для большинства организаций с типовыми потребностями (доступ в Интернет для офиса, несколько проброшенных портов) я рекомендую firewalld по следующим причинам:
- Простота поддержки — любой системный администратор поймет конфигурацию
- Меньше ошибок — понятные команды снижают риск опечаток
- Быстрое восстановление — легко вернуться к рабочей конфигурации
- Документация — множество примеров и готовых решений
Диагностика и устранение неисправностей
1. Общие проверки работоспособности
# Проверка доступности Интернета с самого сервера
ping -c 4 8.8.8.8
ping -c 4 google.com
# Проверка доступности шлюза для клиентов
ping -c 4 172.16.1.100 # IP любого клиента в локальной сети
# Проверка таблицы маршрутизации
ip route show
2. Диагностика nftables
# Просмотр правил с счетчиками
sudo nft list ruleset
# Мониторинг пакетов в реальном времени
sudo nft monitor
# Проверка счетчиков по цепочкам
sudo nft list chain inet filter input
sudo nft list chain inet filter forward
# Трассировка пакетов (включите перед тестированием)
sudo nft add rule inet filter input meta nftrace set 1
sudo nft monitor trace
3. Диагностика firewalld
# Просмотр логов firewalld
sudo journalctl -u firewalld -f
# Проверка примененных правил
sudo firewall-cmd --list-all
sudo firewall-cmd --zone=external --list-all
sudo firewall-cmd --zone=internal --list-all
# Тестирование доступа к порту
sudo firewall-cmd --zone=external --query-service=http
sudo firewall-cmd --zone=external --query-port=80/tcp
# Получение информации о зонах
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone
4. Проверка NAT и соединений
# Просмотр активных NAT-сессий
sudo conntrack -L
# Статистика по протоколам
sudo conntrack -S
# Очистка таблицы соединений (если что-то "зависло")
sudo conntrack -F
# Мониторинг новых соединений
sudo conntrack -E
5. Анализ сетевого трафика
# Просмотр трафика на внешнем интерфейсе
sudo tcpdump -i enp0s3 -n -v
# Просмотр только трафика NAT
sudo tcpdump -i enp0s3 -n 'ip[20:2] & 0x1fff != 0'
# Проверка, проходит ли трафик через форвардинг
sudo tcpdump -i enp0s8 -n icmp
# В другом окне пингуйте с клиента и смотрите вывод
6. Типичные проблемы и решения
ПРОБЛЕМА: Клиенты не получают IP по DHCP
# Проверка работы dnsmasq
sudo systemctl status dnsmasq
sudo journalctl -u dnsmasq -f
# Проверка, слушает ли dnsmasq порт 67
sudo ss -tulpn | grep :67
# Временный запуск в отладочном режиме
sudo dnsmasq --no-daemon --log-queries
ПРОБЛЕМА: NAT работает, но нет DNS
# Проверка DNS с сервера
dig @8.8.8.8 google.com
# Проверка доступности DNS-порта на клиенте
nc -zv 172.16.1.1 53
# Проверка правил фаервола для DNS
sudo nft list chain inet filter input | grep 53
# или
sudo firewall-cmd --zone=internal --list-services
ПРОБЛЕМА: Не работает проброс портов
# Проверка, слушает ли целевой сервер порт
nc -zv 172.16.1.10 80
# Проверка правил проброса
sudo nft list chain ip nat prerouting
# или
sudo firewall-cmd --zone=external --list-forward-ports
# Проверка, доходят ли пакеты до сервера
sudo tcpdump -i enp0s8 -n port 80
# В другом окне попробуйте достучаться извне
ПРОБЛЕМА: Очень медленный Интернет
# Проверка загрузки интерфейсов
ip -s link show enp0s3
ip -s link show enp0s8
# Проверка количества соединений
sudo conntrack -L | wc -l
# Проверка ошибок на интерфейсах
netstat -i
# Проверка MTU (возможно, нужно уменьшить для PPPoE)
ip link show enp0s3 | grep mtu
7. Сброс всего в исходное состояние
Если что-то пошло не так:
# Для nftables
sudo nft flush ruleset
sudo systemctl restart nftables
# Для firewalld
sudo firewall-cmd --complete-reload
sudo systemctl restart firewalld
# Сброс интерфейсов
sudo systemctl restart network
Заключение {#заключение}
Что мы сделали?
Мы развернули полноценный NAT-сервер на Алт ОС с двумя сетевыми интерфейсами:
- enp0s3 подключен к Интернету (публичный адрес)
- enp0s8 обслуживает локальную сеть 172.16.1.0/24
- Настроили два варианта файервола: nftables и firewalld
- Обеспечили безопасность и мониторинг
Ключевые моменты, которые нужно запомнить:
- NAT необходим для организации доступа в Интернет из локальной сети при ограниченном количестве публичных IP-адресов
- IP-форвардинг должен быть включен обязательно
- Правильная маршрутизация критически важна (шлюз по умолчанию только на внешнем интерфейсе)
- Безопасность строится на принципе "что явно не разрешено — запрещено"
- Мониторинг и логи помогут быстро находить проблемы
Дальнейшие шаги для улучшения:
# 1. Настройка кэширующего DNS для ускорения
sudo apt-get install -y bind
# ... настройка named.conf
# 2. Установка системы мониторинга
sudo apt-get install -y netdata
sudo systemctl enable --now netdata
# 3. Настройка резервного копирования конфигураций
cat << 'EOF' | sudo tee /etc/cron.daily/backup-network
#!/bin/bash
BACKUP_DIR="/root/network-backups"
mkdir -p $BACKUP_DIR
cp /etc/nftables.conf $BACKUP_DIR/nftables-$(date +%Y%m%d).conf
cp /etc/firewalld/* $BACKUP_DIR/ -r
find $BACKUP_DIR -type f -mtime +30 -delete
EOF
sudo chmod +x /etc/cron.daily/backup-network
# 4. Настройка оповещений о проблемах
# Добавить проверки в Zabbix/Nagios или использовать простой скрипт с отправкой на email
Финальная проверка работоспособности:
Создайте скрипт для быстрой диагностики:
sudo nano /usr/local/bin/check-nat.sh
И в нем пропишите следующее:
#!/bin/bash
echo "=== ПРОВЕРКА NAT-СЕРВЕРА ==="
echo "Дата: $(date)"
echo
echo "1. Статус интерфейсов:"
ip -br addr show | grep -E "enp0s3|enp0s8"
echo
echo "2. Таблица маршрутизации:"
ip route show
echo
echo "3. IP-форвардинг:"
cat /proc/sys/net/ipv4/ip_forward
echo
echo "4. Доступ в Интернет (ping 8.8.8.8):"
ping -c 2 8.8.8.8 > /dev/null 2>&1 && echo "✓ OK" || echo "✗ FAILED"
echo
echo "5. DNS разрешение (dig google.com):"
dig +short google.com | head -3
echo
echo "6. Активные NAT-сессии:"
sudo conntrack -L | grep -c "ESTABLISHED" | xargs echo "Всего:"
echo
echo "7. Статистика фаервола:"
if command -v nft &> /dev/null; then
echo "nftables:"
sudo nft list counters 2>/dev/null | grep -v "{" | head -5
elif command -v firewall-cmd &> /dev/null; then
echo "firewalld: $(sudo firewall-cmd --state)"
sudo firewall-cmd --list-all | grep -E "ports|services"
fi
echo
echo "=== ПРОВЕРКА ЗАВЕРШЕНА ==="
После сохранения выдайте права
sudo chmod +x /usr/local/bin/check-nat.sh
sudo /usr/local/bin/check-nat.sh
Заключительные рекомендации
- Всегда имейте резервную копию конфигурации перед изменениями
- Тестируйте новые правила в нерабочее время
- Ведите журнал изменений (что, когда и зачем меняли)
- Регулярно обновляйте систему и компоненты безопасности
- Обучите коллег основам диагностики на случай вашего отсутствия
Правильно настроенный NAT-сервер на Алт ОС будет работать годами, обеспечивая стабильный и безопасный доступ в Интернет для всей вашей организации. Выбирайте подход (nftables или firewalld), который лучше подходит под ваш уровень подготовки и требования к гибкости, и смело внедряйте решение в эксплуатацию!