Skip to content

NAT, SNAT, DNAT и Masquerade

Введение

NAT (Network Address Translation) и Masquerade — это технологии, позволяющие множеству компьютеров в локальной сети с приватными IP-адресами выходить в интернет через один единственный публичный IP-адрес. Это основа работы домашних роутеров и корпоративных шлюзов. Хотя Masquerade является частным случаем NAT, между ними есть ключевые различия.

Как работает NAT?

NAT (статический или SNAT) работает по принципу "один-к-одному". Вы явно указываете, на какой публичный IP-адрес нужно заменить адреса из вашей локальной сети. Этот IP-адрес должен быть постоянным (статическим).

Процесс:

  1. Пакет от компьютера в локальной сети идет на шлюз.
  2. Шлюз меняет адрес источника (приватный IP) на указанный публичный IP.
  3. Пакет уходит в интернет на адрес назначения.
  4. Ответный пакет приходит на публичный IP шлюза.
  5. Шлюз, помня о предыдущей подмене, меняет адрес назначения в пакете обратно на приватный IP вашего компьютера.
  6. Пакет доставляется вашему компьютеру в локальной сети.

Схема работы 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. ПК1 отправляет пакет на Сервер в интернете.
  2. Шлюз меняет источник 192.168.0.10 на свой публичный 111.111.111.111.
  3. Сервер отвечает на 111.111.111.111.
  4. Шлюз получает ответ, находит его в своей таблице соединений (NAT table) и меняет адрес назначения обратно на 192.168.0.10.
  5. Пакет доходит до ПК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. Разрешение форвардинга пакетов

Эти правила разрешают прохождение пакетов через шлюз из локальной сети и обратно.

bash
# Разрешить 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. Это важно, так как подмена адреса должна происходить после того, как пакет уже маршрутизирован и готов к отправке во внешний интерфейс.

bash
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 с явным указанием адреса.

bash
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 не помогут.

Проверка текущего статуса:

bash
cat /proc/sys/net/ipv4/ip_forward
  • 1 — форвардинг включен.
  • 0 — форвардинг выключен.

Включение на лету:

bash
echo 1 > /proc/sys/net/ipv4/ip_forward

Для постоянного включения (после перезагрузки) нужно раскомментировать или добавить строку в файл /etc/sysctl.conf (в Альт Линукс нужно редактировать /etc/net/sysctl.conf):

bash
net.ipv4.ip_forward=1

И применить изменения:

bash
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 используются два основных действия:

  1. SNAT (Source NAT): Изменение адреса источника. Используется, когда клиенты из локальной сети инициируют соединение с интернетом. Правило добавляется в цепочку POSTROUTING.

    • -j SNAT --to-source IP:порт — для статического IP.
    • -j MASQUERADE — автоматический SNAT на IP выходного интерфейса.
  2. 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:

bash
# Разрешаем форвардинг для связанных соединений
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:

  1. Перенаправление на другой порт:

    bash
    iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.100:80
  2. Проброс для конкретного интерфейса:

    bash
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
  3. Проброс для конкретного источника:

    bash
    iptables -t nat -A PREROUTING -s 203.0.113.25 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
  4. Локальный проброс (REDIRECT):

    bash
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

Важные замечания по DNAT:

  1. Для работы DNAT должен быть включен IP-форвардинг
  2. Не забудьте настроить правила FILTER для разрешения трафика
  3. Для ответных пакетов обычно автоматически применяется обратное преобразование
  4. При сложной сетевой топологии может потребоваться дополнительная настройка маршрутизации

Заключение

NAT, Masquerade и DNAT — мощные инструменты для управления сетевым трафиком в Linux. Понимание их работы и различий позволяет эффективно настраивать сетевую инфраструктуру любой сложности — от простого выхода в интернет для домашней сети до организации доступа к внутренним серверам через проброс портов.

Контакты: bystrovno@basealt.ru