Задание №8: Статический проброс портов (DNAT) на роутерах
В данном задании на пограничных маршрутизаторах главного офиса (HQ-RTR) и филиала (BR-RTR) настраивается статическая трансляция сетевых адресов назначения (Destination NAT / Port Forwarding) с помощью подсистемы nftables.
Проброс портов позволяет внешним узлам (включая маршрутизатор ISP и будущий обратный прокси Nginx) обращаться к внутренним серверам филиалов, находящимся за NAT в приватных изолированных сетях:
- Веб-приложение Apache на
HQ-SRVпубликуется снаружи через порт8080. - Веб-приложение Docker
tespappнаBR-SRVпубликуется снаружи через порт8080. - Доступ к серверам по защищенному протоколу SSH транслируется через порт
2026.
Место выполнения
Все действия выполняются под пользователем root на пограничных маршрутизаторах:
- HQ-RTR — публикация веб-сервера
HQ-SRV(8080 → 80) и SSH (2026 → 2026). - BR-RTR — публикация Docker-приложения
BR-SRV(8080 → 8080) и SSH (2026 → 2026).
1. Теоретическая справка: Destination NAT (DNAT) в nftables
Чем DNAT отличается от SNAT?
- Source NAT (SNAT / Masquerade), который мы настраивали в Модуле №1, срабатывает в цепочке
postroutingи подменяет IP-адрес источника, когда клиент из локальной сети выходит в Интернет. - Destination NAT (DNAT / Port Forwarding) срабатывает в цепочке
prerouting(до принятия решения о маршрутизации) и подменяет IP-адрес и порт назначения, перенаправляя входящие извне пакеты на конкретный внутренний хост.
Разбор синтаксиса команд nftables:
nft add chain nat prerouting { type nat hook prerouting priority dstnat \; }:- Добавляет в существующую таблицу
natцепочку с именемprerouting. type nat hook prerouting— привязывает цепочку к стандартному хуку ядра перед маршрутизацией.priority dstnat— выставляет приоритет-100, необходимый для обработки трансляции назначения.
- Добавляет в существующую таблицу
iif "enp7s1"(Inbound Interface) — правило применяется только к пакетам, приходящим на внешний интерфейс со стороны провайдера ISP.tcp dport 8080 dnat to 192.168.1.10:80— перенаправляет TCP-трафик с внешнего порта8080на порт80внутреннего сервераHQ-SRV.tcp dport { 8080, 2026 } dnat to 192.168.3.10— группировка наборов портов (set) вnftables. Если внутренние и внешние порты совпадают (порт в порт), их можно перечислить через запятую в фигурных скобках в одном правиле.
2. Настройка на маршрутизаторе HQ-RTR
Выполняем команды под пользователем root на машине HQ-RTR:
# 1. Создаём цепочку prerouting для трансляции адресов назначения
nft add chain nat prerouting { type nat hook prerouting priority dstnat \; }
# 2. Пробрасываем SSH: внешний порт 2026 -> 192.168.1.10:2026
nft add rule nat prerouting iif "enp7s1" tcp dport 2026 dnat to 192.168.1.10
# 3. Пробрасываем веб-сайт: внешний порт 8080 -> 192.168.1.10:80 (порт Apache)
nft add rule nat prerouting iif "enp7s1" tcp dport 8080 dnat to 192.168.1.10:80
# 4. Проверяем сформированные правила в оперативной памяти
nft list ruleset
# 5. Сохраняем итоговые правила в файл постоянной конфигурации
nft list ruleset > /etc/nftables/nftables.nft
# 6. Перезапускаем службу nftables для проверки корректности файла
systemctl restart nftables
# 7. Финально убеждаемся, что правила загрузились после перезапуска
nft list rulesetОжидаемый вид таблицы nat в выводе nft list ruleset:
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "enp7s1" masquerade
}
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif "enp7s1" tcp dport 2026 dnat to 192.168.1.10
iif "enp7s1" tcp dport 8080 dnat to 192.168.1.10:80
}
}3. Настройка на маршрутизаторе BR-RTR
Выполняем команды под пользователем root на машине BR-RTR:
# 1. Создаём цепочку prerouting для трансляции адресов назначения
nft add chain nat prerouting { type nat hook prerouting priority dstnat \; }
# 2. Пробрасываем сразу оба порта (8080 и 2026) на сервер BR-SRV (192.168.3.10)
nft add rule nat prerouting iif "enp7s1" tcp dport { 8080, 2026 } dnat to 192.168.3.10
# 3. Проверяем правила в оперативной памяти
nft list ruleset
# 4. Сохраняем правила в файл постоянной конфигурации
nft list ruleset > /etc/nftables/nftables.nft
# 5. Перезапускаем службу nftables
systemctl restart nftables
# 6. Проверяем статус правил после перезапуска
nft list rulesetОжидаемый вид таблицы nat в выводе nft list ruleset:
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
oifname "enp7s1" masquerade
}
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif "enp7s1" tcp dport { 8080, 2026 } dnat to 192.168.3.10
}
}4. Верификация проброса портов с маршрутизатора ISP
Для проверки корректности трансляции переходим на маршрутизатор ISP (внешняя точка) и выполняем запросы к внешним IP-адресам роутеров филиалов:
# 1. Проверяем веб-приложение HQ (порт 8080 роутера HQ-RTR)
curl -I http://172.16.1.2:8080
# Ожидаемый ответ: HTTP/1.1 200 OK (отвечает веб-сервер Apache с HQ-SRV)
# 2. Проверяем Docker-приложение филиала (порт 8080 роутера BR-RTR)
curl -I http://172.16.2.2:8080
# Ожидаемый ответ: HTTP/1.1 200 OK (отвечает приложение tespapp с BR-SRV)
# 3. Проверяем доступность порта SSH HQ-SRV через внешний адрес HQ-RTR
nc -zv 172.16.1.2 2026
# Вывод: Connection to 172.16.1.2 2026 port [tcp/*] succeeded!
# 4. Проверяем доступность порта SSH BR-SRV через внешний адрес BR-RTR
nc -zv 172.16.2.2 2026
# Вывод: Connection to 172.16.2.2 2026 port [tcp/*] succeeded!Итог выполнения Задания №8
Статическая трансляция портов DNAT полностью настроена на обоих маршрутизаторах, правила зафиксированы в /etc/nftables/nftables.nft, а внутренние веб- и SSH-сервисы доступны для внешних подключений.
