Перейти к основному содержимому
Вернуться в категорию

Проброс портов и настройка NAT: руководство по iptables

Концепции NAT, правила DNAT/SNAT, проброс портов с iptables и nftables, маскарадинг и сценарии использования: игровые серверы, веб-серверы за NAT.

Время чтения: 13 мин Безопасность
проброс портовnatiptablesdnatsnatmasqueradelinuxсетевая конфигурация

Содержание

Проброс портов и настройка NAT: руководство по iptables

Проброс портов и NAT (Network Address Translation) — фундаментальные инструменты управления сетевым трафиком. Вы используете эти техники для открытия сервисов за сервером наружу, настройки игровых серверов или управления несколькими сервисами через один IP.

Что такое NAT?

NAT (Network Address Translation) — сетевая техника, изменяющая адреса источника или назначения IP-пакетов. Есть два основных типа:

  • SNAT (Source NAT): Изменяет IP-адрес источника — для исходящего трафика
  • DNAT (Destination NAT): Изменяет IP-адрес назначения — для маршрутизации входящего трафика
  • Masquerade: Специальный тип SNAT для динамических IP

Включение IP-пересылки

hljs bash
# Включить временно
sudo sysctl -w net.ipv4.ip_forward=1

# Включить постоянно
sudo nano /etc/sysctl.conf
# Добавить строку:
# net.ipv4.ip_forward=1

# Применить изменения
sudo sysctl -p

# Проверить
cat /proc/sys/net/ipv4/ip_forward
# Вывод: 1

Проброс портов с iptables (DNAT)

Базовый проброс портов

hljs bash
# Перенаправить внешний порт 80 на внутренний сервер
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80

# Перенаправить внешний порт 443 на внутренний сервер
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443

# Перенаправить на другой номер порта (внешний 8080 → внутренний 80)
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80

# Разрешить перенаправленный трафик
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 443 -j ACCEPT

Проброс UDP-портов

hljs bash
# Проброс UDP-порта для игрового сервера
sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination 192.168.1.30:27015
sudo iptables -A FORWARD -p udp -d 192.168.1.30 --dport 27015 -j ACCEPT

SNAT и Masquerade

hljs bash
# Masquerade — для динамического IP
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# SNAT — для статического IP (эффективнее)
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1

Полная конфигурация NAT

hljs bash
# 1. Очистить существующие правила
sudo iptables -F
sudo iptables -t nat -F

# 2. Политики по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 3. Loopback и установленные соединения
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 4. SSH-доступ
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 5. Правила проброса портов
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination 192.168.1.30:27015

# 6. Правила FORWARD
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
sudo iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 443 -j ACCEPT
sudo iptables -A FORWARD -p udp -d 192.168.1.30 --dport 27015 -j ACCEPT

# 7. Masquerade
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 8. Сохранить правила
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

Проброс портов с nftables

#!/usr/sbin/nft -f

flush ruleset

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100;
        tcp dport 80 dnat to 192.168.1.10:80
        tcp dport 443 dnat to 192.168.1.10:443
        udp dport 27015 dnat to 192.168.1.30:27015
    }
    
    chain postrouting {
        type nat hook postrouting priority 100;
        oif eth0 masquerade
    }
}

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        iif lo accept
        ct state established,related accept
        tcp dport 22 accept
    }
    
    chain forward {
        type filter hook forward priority 0; policy drop;
        ct state established,related accept
        ip daddr 192.168.1.10 tcp dport { 80, 443 } accept
        ip daddr 192.168.1.30 udp dport 27015 accept
    }
    
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Сценарии использования

Сценарий 1: Игровой сервер (CS2, Minecraft)

hljs bash
# Сервер CS2
sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination 192.168.1.30:27015
sudo iptables -t nat -A PREROUTING -p tcp --dport 27015 -j DNAT --to-destination 192.168.1.30:27015
sudo iptables -A FORWARD -d 192.168.1.30 -p udp --dport 27015 -j ACCEPT

# Сервер Minecraft
sudo iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.31:25565
sudo iptables -A FORWARD -d 192.168.1.31 -p tcp --dport 25565 -j ACCEPT

Сценарий 2: Веб-сервер за NAT

hljs bash
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
sudo iptables -A FORWARD -i eth0 -d 192.168.1.10 -p tcp -m multiport --dports 80,443 -j ACCEPT

Устранение неполадок

hljs bash
# Просмотр таблицы NAT
sudo iptables -t nat -L -n -v

# Просмотр таблицы отслеживания соединений
sudo conntrack -L

# Мониторинг трафика на конкретном порту
sudo tcpdump -i eth0 port 80

# Проверка IP-пересылки
cat /proc/sys/net/ipv4/ip_forward

После добавления правил проброса портов не забудьте добавить как правила PREROUTING (DNAT), так и FORWARD. Добавления только правила DNAT недостаточно — трафик также должен быть разрешён в цепочке FORWARD.

Заключение

Проброс портов и NAT — фундаментальные компоненты управления сетью Linux. Правильно настроив правила DNAT, SNAT и masquerade с помощью iptables или nftables, вы можете открыть игровые серверы, веб-сервисы и другие приложения из-за NAT.