NAT, SNAT, DNAT и Masquerade
Введение
NAT (Network Address Translation) и Masquerade — это технологии, позволяющие множеству компьютеров в локальной сети с приватными IP-адресами выходить в интернет через один единственный публичный IP-адрес. Это основа работы домашних роутеров и корпоративных шлюзов. Хотя Masquerade является частным случаем NAT, между ними есть ключевые различия.
Как работает NAT?
NAT (статический или SNAT) работает по принципу "один-к-одному". Вы явно указываете, на какой публичный IP-адрес нужно заменить адреса из вашей локальной сети. Этот IP-адрес должен быть постоянным (статическим).
Процесс:
- Пакет от компьютера в локальной сети идет на шлюз.
- Шлюз меняет адрес источника (приватный IP) на указанный публичный IP.
- Пакет уходит в интернет на адрес назначения.
- Ответный пакет приходит на публичный IP шлюза.
- Шлюз, помня о предыдущей подмене, меняет адрес назначения в пакете обратно на приватный IP вашего компьютера.
- Пакет доставляется вашему компьютеру в локальной сети.
Схема работы NAT:
+-----+ [Src: 192.168.0.10] +------+ [Src: 111.111.111.111] +--------+
| ПК1 +--------------------->| Шлюз |-------------------------->| Сервер |
| | [Dst: 94.25.13.72] | | [Dst: 94.25.13.72] | |
+-----+ +--+---+ +--------+
|
| [Src: 94.25.13.72] [Src: 94.25.13.72]
| [Dst: 111.111.111.111] [Dst: 192.168.0.10]
+--------------------------+
| Шлюз (обратная замена) |
+--------------------------+
Пояснение:
ПК1
отправляет пакет наСервер
в интернете.Шлюз
меняет источник192.168.0.10
на свой публичный111.111.111.111
.Сервер
отвечает на111.111.111.111
.Шлюз
получает ответ, находит его в своей таблице соединений (NAT table) и меняет адрес назначения обратно на192.168.0.10
.- Пакет доходит до
ПК1
.
Как работает Masquerade?
Masquerade — это особый, упрощенный случай NAT (Source NAT). Его ключевая особенность в том, что шлюзу не нужно знать свой публичный IP-адрес заранее. Он автоматически подставляет тот IP, который назначен на его внешний интерфейс (например, eth0
). Это идеально для ситуаций, когда публичный IP-адрес выдается провайдером динамически (DHCP) и может меняться.
Процесс абсолютно идентичен NAT, за исключением пункта 2: замена адреса происходит не на заранее заданный, а на текущий адрес внешнего интерфейса.
Схема работы Masquerade:
+-----+ [Src: 192.168.0.10] +------+ [Src: <IP eth0>] +--------+
| ПК1 +--------------------->| Шлюз |-------------------------->| Сервер |
| | [Dst: 94.25.13.72] | | [Dst: 94.25.13.72] | |
+-----+ +--+---+ +--------+
|
| [Src: 94.25.13.72] [Src: 94.25.13.72]
| [Dst: <IP eth0>] [Dst: 192.168.0.10]
+--------------------------+
| Шлюз (обратная замена) |
+--------------------------+
Пояснение: Схема та же, но вместо статического 111.111.111.111
используется динамический <IP eth0>
.
Сравнение NAT и Masquerade
Характеристика | NAT (SNAT) | Masquerade |
---|---|---|
Тип IP-адреса | Статический (постоянный) | Динамический (может меняться) |
Производительность | Чуть выше, так как правило статическое | Чуть ниже, так как правило динамическое |
Настройка | Требует явного указания --to-source <IP> | Автоматически использует IP внешнего интерфейса |
Использование | Серверы, где нужен постоянный публичный IP | Домашние сети, клиентские рабочие места |
Вывод: Используйте MASQUERADE
, если ваш публичный IP выдается по DHCP (чаще всего). Используйте SNAT
, если у вас статический белый IP-адрес.
Настройка в iptables
Перед настройкой NAT/Masquerade необходимо разрешить форвардинг (проброс) пакетов между сетевыми интерфейсами.
1. Разрешение форвардинга пакетов
Эти правила разрешают прохождение пакетов через шлюз из локальной сети и обратно.
# Разрешить FORWARD для пакетов, идущих ИЗ нашей локальной сети
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
# Разрешить FORWARD для пакетов, идущих В нашу локальную сеть
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
Схема зоны действия правила FORWARD:
[ INTERNET ]
|
| eth0 (внешний)
+----+----+
| Шлюз | <-- Правила FORWARD работают здесь
+----+----+
| eth1 (внутренний)
|
[ Локальная сеть ]
192.168.0.0/24
2. Включение Masquerade
Правило добавляется в цепочку POSTROUTING
таблицы nat
. Это важно, так как подмена адреса должна происходить после того, как пакет уже маршрутизирован и готов к отправке во внешний интерфейс.
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
-t nat
— работа с таблицей nat.-A POSTROUTING
— добавление правила в цепочку POSTROUTING.-o eth0
— указание внешнего интерфейса.-s 192.168.0.0/24
— применяем правило к пакетам из указанной сети.-j MASQUERADE
— действие: маскарадинг.
3. Включение NAT (SNAT)
Команда почти идентична, но вместо MASQUERADE
используется SNAT
с явным указанием адреса.
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to-source 111.111.111.111
-j SNAT --to-source 111.111.111.111
— действие: замена источника на указанный IP.
Схема работы цепочек iptables для исходящего пакета:
+--------------------------------------------------------------------+
| Локальный компьютер |
| +----------------------------------------------------------+ |
| | OUTPUT chain | |
| +----------------------------------------------------------+ |
+-----------------------------------+-------------------------------|
|
( Маршрутизация )
|
v
+--------------------------------------------------------------------+
| Шлюз (Сервер) |
| +-------------------------+ +-------------------------+ |
| | PREROUTING chain | | POSTROUTING chain | |
| | (таблица nat) | | (таблица nat) | |
| +-------------------------+ +------------+------------+ |
| | | |
| v v |
| +-------------------------+ +-------------------------+ |
| | FORWARD chain | | Внешний интерфейс +--------> INTERNET
| | (таблица filter) | | eth0 | |
| +-------------------------+ +-------------------------+ |
| | |
| v |
| +-------------------------+ |
| | Внутренний интерфейс | |
+---+ eth1 +--------------------------------------+
+-------------------------+
Пакет, пришедший из локальной сети на внешний интерфейс, проходит цепочку FORWARD, а маскарадинг (NAT) происходит в POSTROUTING.
Включение IP Forwarding
Самая частая ошибка — забыть включить IP-форвардинг на ядре Linux. Без этого пакеты просто не будут передаваться между сетевыми интерфейсами, и никакие правила iptables не помогут.
Проверка текущего статуса:
cat /proc/sys/net/ipv4/ip_forward
1
— форвардинг включен.0
— форвардинг выключен.
Включение на лету:
echo 1 > /proc/sys/net/ipv4/ip_forward
Для постоянного включения (после перезагрузки) нужно раскомментировать или добавить строку в файл /etc/sysctl.conf
(в Альт Линукс нужно редактировать /etc/net/sysctl.conf
):
net.ipv4.ip_forward=1
И применить изменения:
sysctl -p
Что такое таблица nat
в iptables?
Чтобы понять, как именно работают правила MASQUERADE и SNAT, важно разобраться с структурой iptables
. Iptables
— это не просто набор команд, это фреймворк, который управляет сетевыми пакетами на основе правил, организованных в таблицы и цепочки.
Таблицы
Таблицы представляют собой различные категории обработки пакетов. Основные таблицы:
- filter: Стандартная таблица для фильтрации пакетов (разрешить/запретить проход). Её цепочки по умолчанию: INPUT, OUTPUT, FORWARD.
- nat: Таблица для преобразования сетевых адресов (NAT). Именно она нас интересует.
- mangle: Специализированная таблица для изменения заголовков пакетов (например, изменение TTL).
- raw: Таблица для настройки исключений из трассировки соединений.
Цепочки таблицы nat
Таблица nat
содержит цепочки, которые обрабатывают пакеты в ключевые моменты их жизни на сервере. Эти цепочки — точки, где происходит магия изменения адресов.
Схема прохождения пакета через цепочки iptables:
[ Пакет с интернета ] [ Пакет из локальной сети ]
| |
v v
+--------------+ +--------------+
| PREROUTING | | OUTPUT |
| (nat) | | (nat) |
+--------------+ +--------------+
| |
v v
+--------------+ +--------------+
| Роутинг |<----------------------| Роутинг |
| (Решение, куда | | (Решение, куда |
| отправить пакет)| | отправить пакет)|
+--------------+ +--------------+
| |
v v
+----------------+ +--------------+
| FORWARD (filter)| | POSTROUTING |
| | | (nat) |
+----------------+ +--------------+
| |
v v
+----------------+ +--------------+
| POSTROUTING | | [В Интернет] |
| (nat) | | |
+----------------+ +--------------+
|
v
[ Локальному процессу ]
Пояснение схемы:
- PREROUTING: Пакеты попадают в эту цепочку сразу после приема сетевым интерфейсом, до того как ядро примет решение о маршрутизации (куда отправить пакет: локальному процессу или форвардить дальше). Здесь меняется адрес назначения (DNAT).
- OUTPUT: (Используется реже) Пакеты, сгенерированные самим сервером (шлюзом), проходят через эту цепочку перед их отправкой.
- POSTROUTING: Пакеты попадают в эту цепочку после принятия решения о маршрутизации, но перед непосредственной отправкой пакета в сеть. Здесь меняется адрес источника (SNAT). Это идеальное место для Masquerade, так как мы уже знаем, через какой интерфейс (
-o eth0
) пакет будет отправлен.
Почему мы используем -t nat -A POSTROUTING
?
-t nat
: Мы говоримiptables
, что хотим работать с таблицей, ответственной за преобразование адресов.-A POSTROUTING
: Мы добавляем правило в конец цепочкиPOSTROUTING
этой таблицы. Это значит, что наше правило выполнится в последний момент перед отправкой пакета в сеть. К этому моменту мы уже точно знаем, через какой внешний интерфейс (-o eth0
) "уйдет" пакет, и можем корректно подменить адрес источника на адрес этого интерфейса.
Типы NAT в одноименной таблице
В таблице nat
используются два основных действия:
SNAT (Source NAT): Изменение адреса источника. Используется, когда клиенты из локальной сети инициируют соединение с интернетом. Правило добавляется в цепочку POSTROUTING.
-j SNAT --to-source IP:порт
— для статического IP.-j MASQUERADE
— автоматический SNAT на IP выходного интерфейса.
DNAT (Destination NAT): Изменение адреса назначения. Используется для проброса портов (Port Forwarding), когда соединение инициируется извне. Например, чтобы из интернета можно было подключиться к веб-серверу в локальной сети с адресом
192.168.0.100
. Правило добавляется в цепочку PREROUTING.-j DNAT --to-destination Локальный_IP:порт
Сводная таблица цепочек nat
:
Цепочка | Когда срабатывает? | Типичное применение | Пример команды |
---|---|---|---|
PREROUTING | Сразу после приема пакета, до маршрутизации. | DNAT, проброс портов. | iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination 192.168.0.100:80 |
OUTPUT | Перед отправкой пакета, сгенерированного самим сервером. | Локальный DNAT (редко). | — |
POSTROUTING | После маршрутизации, перед отправкой пакета в сеть. | SNAT, MASQUERADE (основная тема статьи). | iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE |
Таким образом, таблица nat
— это специальный отдел внутри iptables
, который не фильтрует пакеты, а intelligently изменяет их адреса в строго определенные моменты времени, что и позволяет реализовать сложную сетевую логику, такую как общий выход в интернет или проброс сервисов.
DNAT: Проброс портов
DNAT (Destination NAT) используется для перенаправления входящих соединений с внешнего интерфейса шлюза на внутренние серверы в локальной сети.
Типичный сценарий использования: Проброс порта 80 на веб-сервер в локальной сети с IP-адресом 192.168.0.100.
Схема работы DNAT:
+--------+ [Dst: 111.111.111.111:80] +------+ [Dst: 192.168.0.100:80] +-------------+
| Клиент +------------------------------>| Шлюз |-------------------------->| Веб-сервер |
| | | | | 192.168.0.100|
+--------+ +--+---+ +-------------+
|
| [Src: 192.168.0.100] [Src: 192.168.0.100]
| [Dst: <Client IP>] [Dst: <Client IP>]
+---------------------------+
| Шлюз (обратное преобразование источника)
+---------------------------+
Настройка DNAT в iptables:
# Разрешаем форвардинг для связанных соединений
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Разрешаем форвардинг нового трафика на веб-сервер
iptables -A FORWARD -d 192.168.0.100 -p tcp --dport 80 -j ACCEPT
# Правило DNAT: перенаправляем входящий трафик на веб-сервер
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
# Для ответных пакетов автоматически применяется обратное преобразование
Дополнительные возможности DNAT:
Перенаправление на другой порт:
bashiptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.100:80
Проброс для конкретного интерфейса:
bashiptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
Проброс для конкретного источника:
bashiptables -t nat -A PREROUTING -s 203.0.113.25 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
Локальный проброс (REDIRECT):
bashiptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Важные замечания по DNAT:
- Для работы DNAT должен быть включен IP-форвардинг
- Не забудьте настроить правила FILTER для разрешения трафика
- Для ответных пакетов обычно автоматически применяется обратное преобразование
- При сложной сетевой топологии может потребоваться дополнительная настройка маршрутизации
Заключение
NAT, Masquerade и DNAT — мощные инструменты для управления сетевым трафиком в Linux. Понимание их работы и различий позволяет эффективно настраивать сетевую инфраструктуру любой сложности — от простого выхода в интернет для домашней сети до организации доступа к внутренним серверам через проброс портов.