NAT — SNAT, DNAT, PAT & Port Forwarding
In the initial years of the internet, computers on a private network connected to the internet in this way:
- A unique public IP address was assigned to each device on the network. These all are at the LAN(Local Area Network) side of the default gateway.
- Assign the IP address of the ISP(Internet Service Provider) to the WAN(Wide Area Network) side of the default gateway.
- Every computer knows the default gateway’s IP address.
All the IPs in this setup are public IPs and this system poses 2 big problems:
- Security Vulnerability: Since the IPs of the network are all public, anyone can access this “private” network.
- IP address exhaustion: As the growth of the internet began, IP addresses started getting lesser and lesser available.
To tackle these problems, NAT or Network Address Translation comes to the rescue. NAT is a technique in which a router or a similar device translates one IP address into another IP address. To be more specific, a router translates the private address of an internal host into a public IP address for outgoing traffic. And the opposite, the router also translates its own public IP address into a private one for the incoming traffic.
A point to be made is that private IP addresses are free to use but they are not routable.
In short, NAT improves security as it hides internal hosts’ IP addresses. Network Address Translation (NAT) is designed for IP address conservation. It enables private IP networks that use unregistered IP addresses to connect to the Internet.
There are 4 types of NAT:
- Static NAT (SNAT) — A type of network where one private address is mapped with one public IP address. These IP addresses never change
SNAT allows internal hosts/servers to have a private IP address and still access the internet. But this kind of setup is wasteful of expensive public IPs. SNAT deals more with incoming traffic.
- Dynamic NAT (DNAT) — The mapping of an internal private IP address into the router’s public IP is dynamic. This is also called IP masquerading. The outgoing traffic carries “a” public IP of the router. When data comes in, it is looked upon in the NAT table for its destination address.
This setup is more secure as hackers can’t get the host address straight away. But still expensive.
Записки IT специалиста
Основы iptables для начинающих. Часть 3. Таблица nat
- Автор: Уваров А.С.
- 25.07.2021
В качестве продолжения нашего цикла о брандмауэре iptables мы рассмотрим таблицу nat, в которой происходит преобразование сетевых адресов. С этой таблицей, также, как и с filter вы будете часто встречаться, выполняя такие привычные и повседневные задачи, как выход в интернет, проброс портов или перенаправление трафика. При этом действие механизма NAT более сложное и требует более глубокого понимания происходящих процессов, поэтому советуем уделить внимание в первую очередь теоретической части.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
NAT (Network Address Translation, преобразование сетевых адресов) — это механизм работающий в IP-сетях и позволяющий преобразовывать IP-адреса транзитных пакетов. Протокол IP — маршрутизируемый протокол сетевого уровня (L3), предназначенный для передачи данных между сетями. Единицей передачи данных на уровне IP-протокола является пакет.
Сразу с этого места сделаем небольшое отступление, потому как с понятием «пакет» существует изрядная путаница, которая может приводить начинающих в некоторое замешательство. Начнем с того, что понятие пакет применимо только к протоколу IP сетевого уровня (L3). Пакет состоит из заголовка и полезной нагрузки. Заголовок, вместе с иной служебной информацией, содержит два важных поля: адрес отправителя (SRC IP) и адрес получателя (DST IP). Полезной нагрузкой IP-пакета является один из протоколов транспортного уровня (L4): TCP, UDP, GRE и т.д.
Единицей передачи данных в TCP является сегмент, в UDP — дейтаграмма, также оба этих протокола используют порты, порт — это логическая сущность, определяемая целым неотрицательным числом, которая позволяет создавать и поддерживать на одном узле несколько независимых соединений. Часть портов зарезервирована за типовыми службами, так каждый знает, что TCP 80 — это HTTP, а UDP 53 — DNS. Т.е. номер порта является дополнительным идентификатором, позволяющим отделять одни данные от других и направлять их нужным службам. TCP-сегмент или UDP-дейтаграмма также содержат заголовок и полезную нагрузку, заголовок также содержит два важных поля: порт источник (SRC PORT) и порт назначения (DST PORT).
![]()
Следует четко запомнить: IP-заголовок содержит только адрес отправителя и адрес получателя, понятие порт в протоколе IP отсутствует. Порт появляется в заголовках транспортного протокола L4 (TCP, UDP), но информация об адресах источника и назначения там отсутствует. Но как быть, если где-то говорят о пакете на порт TCP 80? Это выражение следует понимать, как IP-пакет с полезной нагрузкой в виде TCP-сегмента с портом назначения 80. Также следует помнить, что у каждого транспортного протокола свой набор портов и одни и те же порты могут быть использованы одновременно с разными протоколами.
Теперь перейдем к самому понятию NAT, эта технология возникла тогда, когда потребовалось предоставить доступ к внешней сети узлам сети внутренней, не имеющим выделенного IP-адреса. По мере роста сетей при ограниченном количестве «белых» IP-адресов это становилось все большей проблемой и привело к совершенствованию механизма NAT.
Существует несколько видов NAT:
- Симметричный — когда все порты внутреннего адреса транслируются на порты внешнего адреса, при этом устройство становится полностью доступным из внешней сети.
- Динамический — когда порт внутреннего адреса случайным образом транслируется на порт одного из внешних адресов, причем для каждого нового соединения может быть использован отличающийся адрес
- Перегруженный — когда порты нескольких внутренних адресов транслируются на случайные порты единственного внешнего адреса.
Далее мы будем говорить именно о перегруженном NAT (NAPT, NAT Overload, PAT, маскарадинг), потому что в большинстве реализаций используется именно он, также следует отметить, что PAT (Port Address Translation, Трансляция порт-адрес) требует обязательного наличия открытого порта, что может вызвать проблемы с прохождением NAT для транспортных протоколов не использующих порты, например, GRE.
Вернемся к iptables, функции NAT реализованы в одноименной таблице nat (все таблицы обозначаются строчными буквами), которая содержит цепочки PREROUTING, POSTROUTING и OUTPUT. В первые две цепочки попадает весь трафик узла, в последнюю только собственный исходящий.
![]()
Обратите внимание, что все преобразования NAT выполняются либо до, либо после принятия решения о маршрутизации и фильтрации трафика брандмауэром, этот момент следует учитывать при построении правил фильтрации.
В таблице nat доступно два основных действия:
- SNAT — Source Network Address Translation — изменение адреса и порта источника пакета, доступен в цепочке POSTROUTING
- DNAT — Destination Network Address Translation — изменение адреса и порта назначения пакета, доступен в цепочках PREROUTING и OUTPUT
Таким образом изменить адрес и порт назначения мы можем только перед входом пакета в брандмауэр и до принятия решения о маршрутизации, а изменить адрес и порт источника можем только при выходе пакета из брандмауэра, после принятия решения о маршрутизации. Это еще одно важное правило, которое следует твердо запомнить: DNAT — на входе, SNAT — на выходе.
Более подробное знакомство мы начнем со SNAT, как мы уже говорили выше данное действие изменяет адрес и порт источника пакета, одно из основных практический применений — обеспечения доступа локальной сети в интернет. Давайте посмотрим, в чем состоит проблема и как SNAT помогает ее решить. Для использования в локальных сетях используются диапазоны частных или т.н. «серых» IP-адресов, их особенностью является то, что они не маршрутизируются в интернете, т.е. если маршрутизатору попадает такой пакет и для него нет отдельного маршрута — он будет отброшен. При этом внешний адрес у данной сети один и его как-то следует использовать для обращения к внешнему миру всех локальных ПК.
Что делает SNAT? Он заменяет адрес источника пакета внешним адресом, также, при необходимости, меняет и порт источника, что позволяет различать запросы, сделанные с одного и того же порта разных ПК, запись о выполненной трансляции заносится в специальную таблицу трансляций (она же таблица NAT). Получив ответ роутер находит запись в таблице трансляций и на ее основании изменяет адрес и порт назначения ответного пакета, после чего он прозрачно доставляется адресату в локальной сети.
![]()
В общем виде запись в iptables для SNAT будет выглядеть следующим образом:
Первое, на что следует обратить внимание — это ключ -t, который указывает используемую таблицу, если данный ключ не указан, то по умолчанию используется таблица filter. Запись добавляется в цепочку POSTROUTING и предписывает выполнить действие SNAT для всех пакетов, попадающих под критерий -o ens33, т.е. использующих в качестве исходящего внешний интерфейс ens33. Для SNAT обязательно указывается параметр —to-source, который используется для указания адреса, присваиваемому пакету, теперь именно этот адрес будет указываться в качестве исходящего.
Приведенное выше правило будет изменять адрес источника для всех исходящих пакетов без разбору, что не всегда корректно и безопасно, поэтому правилом хорошего тона считается явно задавать диапазон адресов для преобразования:
Также мы можем выполнять трансляцию адресов не для всего трафика, а выборочно, указывая необходимые порты и протоколы, скажем только для SSH:
Частным случаем SNAT является действие MASQUERADE (маскарадинг), его основным отличием является то, маскарадинг самостоятельно получает IP-адрес от заданного сетевого интерфейса и не требует его явного указания. Это удобно если на внешнем интерфейсе используется динамический IP-адрес. Вторая особенность MASQUERADE в том, что при остановке интерфейса таблица трансляций полностью очищается и все текущие соединения разрываются. Причина такого поведения в том, что при следующем запуске интерфейса имеется возможность получить новый IP-адрес и все текущие записи сразу окажутся неверны.
Можно ли использовать MASQUERADE со статическим внешним адресом? Можно, но следует учитывать, что данное действие дает более высокую нагрузку на систему, так как определяет адрес внешнего интерфейса для каждого пакета, и в данном случае предпочтительно использовать SNAT.
Маскарадинг, также, как и SNAT, можно использовать только в цепочке POSTROUTING, и типичная запись будет выглядеть так:
Оба этих действия также позволяют явно указывать исходящий порт или диапазон портов для трансляции, для SNAT это делается в параметре —to-source через двоеточие, а в MASQUERADE используется специальная опция —to-ports:
Теперь вернемся к порядку прохождения пакетов по таблицам и цепочкам. Как несложно заметить — цепочка POSTROUTING таблицы nat является завершающим этапом обработки трафика, после которого он покидает брандмауэр. Это говорит о том, что в правилах фильтрации следует использовать только исходные адреса и порты источников, до трансляции. Новые адреса в брандмауэр не попадают.
Второе основное действие в таблице nat — это DNAT — или изменения адреса и порта назначения пакета. Это действие применимо в цепочках PREROUTING и OUTPUT, т.е. на самом входе в брандмауэр, раньше таблицы nat пакеты попадают только в mangle. На практике DNAT применяется в основном для проброса портов, типовой пример:
Данное правило изменит адрес назначения всех пакетов пришедших на внешний интерфейс ens33 по протоколу tcp с портом назначения TCP-сегмента 3389 на адрес внутреннего сервера 192.168.100.1. Изменение номера порта при этом не производится. Если же вы используете нестандартный порт, то правило будет выглядеть несколько иначе:
При выполнении проброса портов обязательным критерием должен быть указан входящий интерфейс (как в правиле выше) или адрес этого интерфейса, в противном случае преобразованию будут подвергаться все пакеты, в том числе и проходящие из внутренней сети наружу. При использовании адресов вместо интерфейсов правило будет иметь следующий вид:
А теперь давайте попробуем разобраться как оно вообще работает. Некий узел XXX.XXX.XXX.XXX отправляет пакет на внешний адрес нашего роутера 198.51.100.1, адресом источника будет являться адрес узла, адресом назначения — внешний адрес роутера. Получив такой пакет брандмауэр находит нужное правило и изменяет адрес назначения пакета на внутренний адрес целевого узла, т.е. на 192.168.100.1 и отправляет его в локальную сеть.
Узел назначения видит, что ему пришел пакет от удаленного узла XXX.XXX.XXX.XXX и он формирует ответный пакет с этим адресом в качестве назначения, а в качестве источника подставляет собственный адрес. Так как удаленный узел не принадлежит локальной сети данный пакет будет направлен основному шлюзу, т.е. назад нашему роутеру. А так как на шлюзе в любом случае включен либо SNAT, либо MASQUERADE, то локальный адрес источника будет заменен адресом внешнего интерфейса и такой пакет будет отправлен назад удаленному узлу.
![]()
Наблюдательный читатель сделает здесь два вывода. Первый — DNAT не использует таблицу трансляций, второй — уже имеющийся на роутере SNAT или MASQUERADE автоматически выполняет обратное преобразование. Таким образом удаленный узел общается только с внешним адресом роутера и не имеет ни малейшего представления о сети за ним, а локальный узел продолжает считать, что работает с удаленным узлом напрямую, все необходимые трансляции NAT делает прозрачно и на лету.
Частным случаем DNAT является REDIRECT, это действие позволяет перенаправлять пакеты на другой порт текущего узла. Это удобно при прозрачном проксировании, либо перенаправлении трафика. Например, перехватим все DNS-запросы и направим их локальному DNS-серверу, развернутому на этом же узле:
А следующее правило выполнит прозрачное проксирование HTTP-трафика, не предназначенного узлу на развернутый на нем прокси-сервер:
Где 192.168.100.2 — внутренний адрес нашего роутера, остальные критерии мы сознательно не будем комментировать, если вы внимательно изучили предыдущие статьи цикла, то должны без труда прочитать условие.
Мы же перейдем к не менее интересной теме последующего движения пакетов. Давайте еще раз внимательно изучим схему выше. Действие DNAT в цепочке PREROUTING выполняется до решения о маршрутизации, а, следовательно, пакеты могут претерпевать «чудесные превращения». Непонимание этого момента приводит ко многим грубым ошибкам в настройке брандмауэра и неработоспособным конфигурациям.
Допустим у нас с внешнего адреса 198.51.100.1 и порта 3390 сделан проброс на внутренний адрес 192.168.100.1 и порт 3389, но нормально закрытый брандмауэр блокирует подключения. Что нам нужно сделать? Правильно, открыть порт. Если долго не думать, то вырисовывается такой набор правил:
На первый взгляд все правильно: мы «открыли» порт 3390 для внешних подключений, а затем перенаправили соединения с него на внутренний узел. Однако это грубая ошибка. Почему? Давайте разбираться.
И снова схема движения пакетов! Так, что мы видим? А видим мы то, что пакет первым делом попадает в цепочку PREROUTING таблицы nat и именно здесь у него будут изменены адрес и порт назначения. После чего пакет из локального, предназначенного данному узлу, превратится в транзитный и вместо цепочки INPUT таблицы filter пойдет в цепочку FORWARD и приведенное выше правило никогда не сработает.
А как будет правильно?
Обратите внимание, что вместе с локальным адресом в качестве критерия мы используем именно локальный порт — 3389, а не проброшенный 3390, так как DNAT изменит как адрес назначения, так и порт.
Аналогично, действие REDIRECT превращает транзитные пакеты в локальные и при возникновении такой необходимости фильтровать мы их должны уже не в цепочке FORWARD, а в INPUT.
Коротко отдельно коснемся цепочки OUTPUT, вопреки распространенному мнению, это вход в брандмауэр, а не выход. Сюда поступают исходящие пакеты от локальных служб узла и последовательно проходят таблицы mangle — nat -filter. Поэтому если вы фильтруете исходящий трафик после преобразования сетевых адресов, то следует учитывать уже новые адреса и порты назначения. Единственное, что не меняется — это статус пакета, он остается локальным и не при каких обстоятельствах не попадет в цепочку FORWARD, даже если после всех преобразований сетевых адресов он попадает под критерии транзитного.
В данной статье мы рассмотрели только базовые возможности таблицы nat в самых простых конфигурациях, но именно прочное усвоение базовых принципов позволяет успешно изучать более сложные схемы, которых мы обязательно коснемся в наших будущих публикациях.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Дополнительные материалы:
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
![]()
Или подпишись на наш Телеграм-канал: ![]()
Общее представление об iptables. Добавление, удаление, цепочки.
iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4, 2.6, 3.x, 4.x. Для использования утилиты iptables требуются привилегии суперпользователя (root).
Цепочки, схема
Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели.
output — эта цепочка используется для исходящих пакетов и соединений. Сюда, например, попадают пакеты, когда вы запускаете браузер и пытаетесь открыть любой сайт.
prerouting — в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в input, output или forward;
postrouting — сюда попадают все проходящие пакеты, которые уже прошли цепочку forward

Добавление/удаление правил
Действия над пакетами:
ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
DROP — удалить пакет;
REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
LOG — сделать запись о пакете в лог файл;
QUEUE — отправить пакет пользовательскому приложению.
# iptables -t таблица действие цепочка дополнительные_параметры
Опции:
-A — добавить правило в цепочку;
-С — проверить все правила;
-D — удалить правило;
-I — вставить правило с нужным номером;
-L — вывести все правила в текущей цепочке;
-S — вывести все правила;
-F — очистить все правила;
-N — создать цепочку;
-X — удалить цепочку;
-P — установить действие по умолчанию
Дополнительные опции:
-p — указать протокол, один из tcp, udp, icmp и др.;
-s — указать ip адрес устройства-отправителя пакета;
-d — указать ip адрес получателя;
-i — входной сетевой интерфейс;
-o — исходящий сетевой интерфейс;
-j — выбрать действие, если правило подошло.
Примеры:
Вывод всех правил на экран:
Вывод всех правил на экран c нумерацией строк:
Вывод правил для цепочки INPUT
Блокировка всех входящих пакетов от 10.0.0.1:
Блокировка всех исходящих пакетов от 10.0.0.1:
Блокировка всех входящих соединений от 10.0.0.1 по ssh:
# iptables -A INPUT -p tcp —dport ssh -s 10.0.0.1 -j DROP
Очистить все правила
Очистить все правила в цепочке INPUT:
Удаления правила для всех входящих пакетов от 10.0.0.1:
Добавить правило на 3 место в цепочке INPUT (остальные сдвинутся ниже):
# iptables -I INPUT 3 -p tcp —dport ssh -s 10.0.0.1 -j DROP
Удалить 3 правило в цепочке INPUT:
Сохранение после перезагрузки
и в настройках интефейса прописать
pre-up iptables-restore < /etc/iptables.up.rules
SNAT, DNAT, MASQUERADE
DNAT — от англ. Destination Network Address Translation — Изменение Сетевого Адреса Получателя. DNAT — это изменение адреса назначения в заголовке пакета. Зачастую используется в паре с SNAT. Основное применение — использование единственного реального IP-адреса несколькими компьютерами для выхода в Интернет и предоставления дополнительных сетевых услуг внешним клиентам.
SNAT — от англ. Source Network Address Translation — Изменение Сетевого Адреса Отправителя. SNAT — это изменение исходного адреса в заголовке пакета. Основное применение — использование единственного реального IP-адреса несколькими компьютерами для выхода в Интернет. В натоящее время диапазон реальных IP-адресов, по стандарту IPv4, недостаточно широк, и его не хватает на всех (переход на IPv6 разрешит эту проблему).
Маскировка (MASQUERADE) применяется в тех же целях, что и SNAT, но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия — производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP, SLIP или DHCP.
Предположим у нас есть сервер с двумя интерфейсами. Один смотрит в Интернет, другой в локальную сеть и не забывает про правила для input и output. Раздадим интернет:
Для начала разрешаем шлюзу передавать транзитный трафик:
Разрешаем проходить трафику из и в локальную сеть,например, 10.1.30.0/24:
# iptables -A FORWARD -s 10.1.30.0/24 -j ACCEPT
# iptables -A FORWARD -d 10.1.30.0/24 -j ACCEPT
Для статического внешнего адреса интерфейса:
# iptables -A POSTROUTING -s 10.0.3.0/24 -o eth1 -j SNAT —to-source внешний_адрес_интерфейса
Для динамического внешнего адреса интерфейса:
# iptables -A POSTROUTING -s 10.0.3.0/24 -o eth1 -j MASQUERADE
DNAT подменяет адрес назначения для входящих пакетов, позволяя «пробрасывать» адреса или отдельные порты внутрь локальной сети. Например:
Для начала разрешаем шлюзу передавать транзитный трафик:
Разрешаем проходить траффику из и в локальную сеть,например, 10.1.30.0/24:
# iptables -A FORWARD -s 10.1.30.0/24 -j ACCEPT
# iptables -A FORWARD -d 10.1.30.0/24 -j ACCEPT
Из внешнего источника по порту 29001 можно получить доступ по ssh к компьютеру во внутренней сети 10.1.30.40:
# iptables -A PREROUTING -s адрес/сеть_внешнего_источника -i eth1 -p tcp -m tcp —dport 29001 -j DNAT —to-destination 10.1.30.40:22
Introduction : SNAT vs DNAT

In our previous post, we discussed about the NAT in detail. NAT is abbreviated for Network Address Translation, so the key word here is translation, as it is the process that is responsible for translation of an IP address. The translation can be from a public IP address to a private IP address or vice versa.
In this post, we will focus on two terms i.e. SNAT and DNAT. Both SNAT and DNAT are related to NAT, so one should have an understanding of the concept of NAT beforehand.
What is SNAT?

SNAT i.e. Source Network Address Translation as the name implies involves the translation of source IP address. Thus it allows the internal host to connect with the internet by translating its private IP address to public IP address. There are 3 types of SNAT:
- DIPP( Dynamic IP and Port ): In this type of SNAT, multiple hosts can be allowed to have the same public IP address for their source IP addresses but with different port numbers.
- Dynamic IP: In this type of SNAT, one-to-one dynamic translation is allowed only of a source IP address (and not for port number) to the next available address in the NAT Address Pool.
SNAT can also translate source port in TCP/UDP headers.
What is DNAT?

DNAT i.e. Destination Network Address Translation is used by an external host to initiate connection with a private network. So, it translates the public IP address of an external host to the private IP of internal Host.
DNAT can also translate destination port in TCP/UDP headers.
You can watch this video for better understanding:
(or continue reading)
Below table summarizes the differences between SNAT and DNAT –

Conclusion : SNAT vs DNAT
In the nutshell, we can say the major difference between SNAT and DNAT is that, SNAT is used to allow the internal host to connect with the internet and DNAT is used by an external host to initiate connection with a private network.
Continue Reading:
If you want to learn more about NAT, then check our e-book on NAT Interview Questions and Answers in easy to understand PDF Format explained with relevant Diagrams (where required) for better ease of understanding.

I am here to share my knowledge and experience in the field of networking with the goal being — «The more you share, the more you learn.»
I am a biotechnologist by qualification and a Network Enthusiast by interest. I developed interest in networking being in the company of a passionate Network Professional, my husband.
I am a strong believer of the fact that «learning is a constant process of discovering yourself.»
— Rashmi Bhardwaj (Author/Editor)