Интернет-шлюз на Ubuntu / Debian: NAT, маршрутизация и проброс портов
Настройка шлюза состоит из трёх шагов:
- Включение IP-форвардинга на уровне ядра;
- Настройка брандмауэра (NAT);
- Опционально — проброс портов (port forwarding).
Настройка ядра
vi /etc/sysctl.d/gateway.conf
net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.d/gateway.conf
При ошибке sysctl: command not found установите пакет:
apt install procps
Либо перезайдите с полным окружением root:
su -
С одним сетевым адаптером больше ничего не нужно — Ubuntu начнёт работать как интернет-шлюз. С несколькими адаптерами настраиваем сетевой экран.
Настройка брандмауэра (iptables)
Пусть интернет — через ens160, локальная сеть — через ens32:
INTERNET=ens160
LOCAL=ens32
Значения замените на свои.
Правило NAT:
iptables -t nat -I POSTROUTING -o ${INTERNET} -j MASQUERADE
Если локальная и глобальная сети на разных интерфейсах, добавляем форвардинг:
iptables -I FORWARD -i ${LOCAL} -o ${INTERNET} -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i ${LOCAL} -o ${INTERNET} -j ACCEPT
${INTERNET} — выход в интернет, ${LOCAL} — локальная сеть.
apt install iptables-persistent
netfilter-persistent save
Проброс портов (Port Forwarding)
Нужен, чтобы направлять запросы на сервер за NAT без прямого выхода наружу.
Iptables
Двумя командами:
iptables -t nat -I PREROUTING -p tcp -m tcp -d 10.8.232.111 --dport 25 -j DNAT --to-destination 192.168.0.15:8025
iptables -t nat -I POSTROUTING -p tcp -m tcp -s 192.168.0.15 --sport 8025 -j SNAT --to-source 10.8.232.111:25
Или по интерфейсу:
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 25 -j DNAT --to-destination 192.168.0.15:8025
iptables -I FORWARD -p tcp -d 192.168.0.15 --dport 8025 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
где eth0 — внешний интерфейс.
Разрешаем порт назначения:
iptables -I INPUT 1 -p tcp --dport 8025 -j ACCEPT
Открываем не входящий порт (25), а порт назначения (8025): цепочки PREROUTING/POSTROUTING выполняются до FILTER.
netfilter-persistent save
Шаблон с переменными
IPADDR=192.168.1.10 # адрес, на который переводим
PORTOUT=443 # внешний порт NAT
PORTIN=443 # порт сервера назначения
INT=eth0 # интерфейс NAT
PROTO=tcp # протокол
iptables -t nat -I PREROUTING -p ${PROTO} -i ${INT} --dport ${PORTOUT} -j DNAT --to-destination ${IPADDR}:${PORTIN}
iptables -I FORWARD -p ${PROTO} -d ${IPADDR} --dport ${PORTIN} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
netfilter-persistent save
Тонкости и подводные камни
ip_forwardбез сохранения —sysctl.dобязателен, иначе после перезагрузки шлюз перестанет работать.MASQUERADEvsSNAT— MASQUERADE подходит для динамического внешнего IP; SNAT — для статического.- Цепочки и порядок — PREROUTING/POSTROUTING (nat) обрабатываются до FORWARD (filter); открывайте порт назначения.
-Ivs-A—-Iвставляет правило в начало, что важно при наличии запрещающих правил выше.- Обратный путь (hairpin NAT) — для доступа к проброшенному сервису изнутри сети нужны дополнительные правила DNAT/SNAT.
netfilter-persistent— без сохранения правила потеряются после перезагрузки.- nftables — в новых системах iptables может быть фронтендом над nftables; поведение сохраняется, но проверяйте
nft list ruleset. - MTU — при туннелях/VPN на шлюзе возможны проблемы с крупными пакетами.
Шпаргалка
# форвардинг
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/gateway.conf
sysctl -p /etc/sysctl.d/gateway.conf
# NAT
iptables -t nat -I POSTROUTING -o ens160 -j MASQUERADE
iptables -I FORWARD -i ens32 -o ens160 -j ACCEPT
netfilter-persistent save
# проброс порта
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to-destination 192.168.1.10:443
iptables -I FORWARD -p tcp -d 192.168.1.10 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
netfilter-persistent save
Проверено на: Ubuntu 22.04/24.04/26.04, Debian 12.
Дата: Сентябрь 2026.