Snat dnat что это
Записки IT специалиста
Технический блог специалистов ООО»Интерфейс»
В прошлом материале нашего цикла мы рассмотрели таблицу NAT брандмауэра iptables и основные приемы работы с ней. Данная таблица широко используется для выхода устройств локальной сети в интернет через единственный шлюз или для проброса портов. Достигается это за счет изменения сетевых адресов пакетов и требует определенных теоретических знаний, которые мы привели в предыдущей статье. Теперь же рассмотрим типовые сценарии использования, а также проблемы и тонкости, с которыми вы можете столкнуться.
Выход в интернет
Для выхода устройств, не обладающих собственным выделенным IP-адресом в сеть интернет, используется пограничное устройство, способное маршрутизировать пакеты, т.е. передавать от одного интерфейса к другому. Для его обозначения используют термины: роутер, маршрутизатор, шлюз. Все они обозначают одно и то же устройство. Для того, чтобы включить маршрутизацию в Linux необходимо в файл /etc/sysctl.conf добавить строку:
И перечитать настройки командой:
Теперь нам нужно отправить все пакеты из локальной сети с назначением в сеть интернет с внешнего интерфейса маршрутизатора таким образом, чтобы они вернулись назад. В этом нам поможет SNAT, который заменит внутренние адреса источников пакетов, на внешний адрес роутера. Ниже показана условная схема, на которой отображены адреса и интерфейсы, все преобразования адресов производимые SNAT выделены зеленым цветом.
Поэтому добавим следующее правило:
Оно достаточно просто и разбиралось нами в предыдущей статье, поэтому не будем на нем останавливаться подробно. Оно предписывает изменить адрес источника на внешний адрес интерфейса ens33 всем пакетам из сети 192.168.100.0/24 выходящим через этот интерфейс.
Если вы являетесь обладателем выделенного IP-адреса, то можете снизить нагрузку на устройство используя SNAT:
Обязательными критериями в обоих случаях являются интерфейс выхода и диапазон адресов сети источника.
В иных сценариях нужно предоставить доступ к сети интернет VPN-пользователям, которые подключаются непосредственно к маршрутизатору. Проще всего с OpenVPN, в этом случае существует единая сеть /24 для всех клиентов и достаточно просто указать ее в качестве сети-источника пакетов. Если сетей несколько, то можно их перечислить через запятую:
Хуже с РРР-соединениями, они не являются сетями, а представляют соединения точка-точка, причем адреса разных концов туннеля могут иметь произвольные адреса, даже из разных подсетей. В этом случае критерий в виде адреса сети источника не может быть применим и требуется идти другим путем. Вспомним, что каждое РРР-соединение создает в системе интерфейс вида pppN, вот от этого мы и будем плясать. Добавим правило:
Здесь мы в качестве критерия использовали интерфейс-источник, в данном случае любое PPP-подключение. Мы ведь знаем кто у нас подключается по VPN, не так-ли?
При наличии выделенного внешнего адреса MASQUERADE также рекомендуется заменить на SNAT.
Если у вас несколько исходящих интерфейсов, то настроить SNAT/MASQUERADE нужно для каждого из них.
Проброс портов
Для этого добавим следующее правило:
Согласно нему все пакеты, приходящие на внешний интерфейс и имеющие порт назначения в TCP-сегментах 443, будут перенаправлены внутреннему узлу 192.168.100.10. Так как мы не указали порт назначения, то он не будет изменен в заголовках, что и не требовалось. Адресом источника пакета по-прежнему остается некий внешний адрес.
Получив такой пакет веб-сервер формирует ответ, с назначением на адрес источника, так как он не принадлежит локальной сети, то такой пакет будет направлен шлюзу, на котором произойдет его обработка в уже существующем правиле SNAT/MASQUERADE, который заменит внутренний адрес источника внешним адресом роутера. Таким образом удаленный узел будет считать, что работает непосредственно с веб-сервером, не получая никакой дополнительной информации о реальной конфигурации сети с противоположной стороны.
Если внешний и внутренний порты отличаются, то правило будет иметь несколько иной вид:
Обратите внимание, что в качестве критерия —dport мы указываем порт, используемый на внешнем интерфейсе, а в параметре —to-destination реальный порт назначения.
Оба указанных правила будут принимать соединения с любого адреса на внешнем интерфейсе ens33, но, если там у нас настроено несколько адресов, но принимать подключения мы хотим только с одного из них? Нужно изменить критерий в условии правила:
Теперь, вместо пакетов, приходящих на интерфейс ens33, мы принимаем только те, которые предназначены адресу 203.0.113.15.
Также напомним, что TCP и UDP-порты, не смотря на одинаковые номера являются различными и могут без проблем работать одновременно. Допустим у нас в сети есть два OpenVPN-сервера, один с транспортом UDP для большинства клиентов, а второй с TCP, например, на базе Mikrotik. Нам нужно пробросить их оба на внешний интерфейс. Нет ничего сложного:
Один адрес, один порт, но разные протоколы позволяют по-разному обрабатывать трафик.
В некоторых случаях бывает нужно пробросить несколько внешних портов на один внутренний. Скажем некоторое время ваш RDP-сервер был проброшен на порт 3390, так как порт 3389 занимал другой сервер. Затем его убрали, но перенастроить большое количество внешних клиентов быстро невозможно, да и не нужно:
Здесь мы подключили внешний модуль multiport, позволяющий указывать в критерии несколько портов через запятую, но в параметре —to-destination обязательно нужно указать порт назначения, иначе они будут проброшены как есть, без изменения.
Кстати, этим можно воспользоваться для веб-сервера, пробросив сразу порты HTTP и HTTPS:
Так как мы не указали порт назначения, то порт 80 будет проброшен на этот же самый порт узла назначения, а 443 на 443.
Проброс портов с узла, не являющегося основным шлюзом сети
Это более редкий и более сложный сценарий, но мы рассмотрим его, максимально приблизив к реальным задачам. Допустим у нас есть филиал, в котором есть собственный маршрутизатор и был собственный внутренний веб-сервер, на работу с которым были настроены внешние клиенты. Затем этот веб-сервер упразднили, перенеся все на сервер в центральном офисе. Чтобы не перенастраивать клиентов решили просто изменить проброс портов с узла внутренней сети филиала на узел центрального офиса. Казалось бы, в чем проблема? Между площадками стабильный VPN-канал, настроена маршрутизация, бегают пинги. Но внезапно ничего не работает! Почему?
Некий удаленный узел отправляет пакет веб-серверу 203.0.113.20, указанный узел получает такой пакет и меняет в нем адрес назначения на реальный адрес веб-севера в сети центрального офиса. Адрес источника при этом не меняется. Веб-сервер, получив такой пакет формирует ответ и так как источник находится за пределами внутренней сети и к нему нет отдельного маршрута, то он будет отправлен основному шлюзу своей сети. Т.е. маршрутизатору центрального офиса, а не маршрутизатору филиала! Тот выполнит подмену адреса источника на свой внешний адрес и отправит пакет по назначению, но получатель его отбросит, т.к. он пытался установить связь с узлом 203.0.113.20, а отвечает ему почему-то 203.0.113.15, такой пакет получит статус INVALID и будет заблокирован брандмауэром.
Как быть? Очевидно, что нам нужно приять меры для того, чтобы ответный пакет был отправлен маршрутизатору филиала, для этого мы снова используем SNAT, заменив адрес источника пакета внутренним адресом маршрутизатора филиала, так как он подключен через VPN, то этим адресом следует указать его адрес в VPN-сети.
Какие правила нам для этого потребуются? Прежде всего выполним DNAT для пришедшего на внешний интерфейс пакета:
На выходе из брандмауэра изменим адрес источника при помощи SNAT, указав внутренний адрес маршрутизатора филиала:
Внимательный читатель заметит, что под это правило попадут не только внешние пакеты, но и пакеты локальной сети филиала, направленные веб-серверу. Но ничего страшного в этом случае не произойдет, работа сети на будет нарушена, но между веб-сервером и филиалом появится еще один NAT. На что это может повлиять? Как минимум на то, что вместо реальных адресов клиентов в логи будет попадать внутренний адрес маршрутизатора. Чтобы изменить такое поведение усложним правило:
В него мы добавили новый критерий: адрес источника не должен принадлежать диапазону сети филиала, т.е. 192.168.200.0/24.
Теперь осталось выполнить обратный SNAT для ответных пакетов:
Данное правило для всех пакетов, покидающих роутер с внешнего интерфейса ens35 и источником с адресом веб-сервера, выполняет замену адреса источника на внешний адреса маршрутизатора. Нужно ли здесь учитывать пакеты из локальной сети филиала? Нет, так как для них исходящим интерфейсом будет интерфейс, смотрящий в локальную сеть, а не наружу.
В случае динамического внешнего адреса замените SNAT на MASQUERADE:
Ну и не забываем при построении всех остальных правил, что DNAT выполняется при входе в брандмауэр, до принятия всех решений о маршрутизации, а SNAT после, на выходе.
NAT loopback или Hairpin NAT
Несмотря на интересное название, это очень распространенный случай. Мобильный клиент, для которого настроен проброс портов на внешнем интерфейсе приходит в офис и у него внезапно все перестает работать. Можно, конечно, настроить несколько вариантов подключения, для нахождения в офисе и для нахождения вне его, но зачем?
Прежде всего давайте разберемся, почему вдруг все сломалось, для этого внимательно рассмотрим следующую схему:
Мобильный клиент, с адресом принадлежащим офисной сети, обращается к серверу в этой же сети, но через внешний интерфейс маршрутизатора. Маршрутизатор привычно выполнит DNAT и отправит пакет серверу, который увидит, что адрес источник находится в одной сети с ним и пошлет обратный пакет напрямую, минуя маршрутизатор.
Но клиент устанавливал соединение с узлом 203.0.113.15, а получает пакет от узла 192.168.100.10, такой пакет получит статус INVALID и будет отброшен. Понятно, что ничего работать не будет.
Как избежать этой ситуации? Нужно сделать так, чтобы обратный пакет не отправлялся напрямую клиенту, а был возвращен маршрутизатору, для этого снова используем SNAT. Обратите внимание, что к этому времени пакет уже пройдет цепочку PREROUTING и в критериях нам следует оперировать внутренним адресом и портом назначения.
Правило DNAT при этом не меняется:
А вот в цепочку POSTROUTING мы добавляем следующее правило:
Что оно делает? Все пакеты, проходящие через маршрутизатор и имеющие в качестве адреса источника диапазон локальной сети и предназначенные серверу 192.168.100.10 в этой же сети, будут подвергнуты преобразованию адреса источника SNAT, который будет заменен на внутренний адрес маршрутизатора.
Для обратного пакета будет выполнена автоматическая замена на основании таблицы трансляции NAT, и он будет возвращен клиенту с внешнего адреса маршрутизатора, несмотря на то что клиент находится во внутренней сети.
Дополнительные материалы:
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
Или подпишись на наш Телеграм-канал:
Общее представление об 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 — отправить пакет пользовательскому приложению.
Опции:
-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:
Очистить все правила
Очистить все правила в цепочке INPUT:
Удаления правила для всех входящих пакетов от 10.0.0.1:
Добавить правило на 3 место в цепочке INPUT (остальные сдвинутся ниже):
Удалить 3 правило в цепочке INPUT:
Сохранение после перезагрузки
и в настройках интефейса прописать
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:
Для статического внешнего адреса интерфейса:
Для динамического внешнего адреса интерфейса:
DNAT подменяет адрес назначения для входящих пакетов, позволяя «пробрасывать» адреса или отдельные порты внутрь локальной сети. Например:
Для начала разрешаем шлюзу передавать транзитный трафик:
Разрешаем проходить траффику из и в локальную сеть,например, 10.1.30.0/24:
Из внешнего источника по порту 29001 можно получить доступ по ssh к компьютеру во внутренней сети 10.1.30.40:
Что такое NAT, как его настроить и использовать — NAT, PAT, Static NAT, Dynamic NAT
Сегодня затронем подробнее тему несколько болезненную и довольно непонятную, но более непонятную, чем болезненную.
В большей степени эта проблема касается тех, кто играет в многопользовательские игры и коротко эта проблема звучит примерно так: «ПОЧЕМУ КО МНЕ НИКТО НЕ ЗАХОДИТ?». Для других эта проблема выглядит несколько иначе, а именно:
Но, однако, нет никакого заговора, виновник всех этих бед находится рядом с вами и хитро подмигивает вам лампочками, а зовут его. роутер, да-да, тот самый, который раздает вам интернет на все ваши (и может быть соседские) девайсы.
Если коротко, то пользователи из интернета просто не могут к вам подключиться, потому что ваш роутер их не пускает, но он делает это не просто из прихоти, а потому, что не знает о том, что все эти люди хотят подключиться именно к вам. Вот он и думает, что они что-то хотят от него самого.
Общее определение
Тип первый, Static NAT
Static NAT не требуется для дома, а нужен в том случае, если провайдер выделил несколько IP адресов (внешние или «белые» адреса) вашей компании, и вам нужно, чтобы некоторые серверы всегда были видны из интернета, при этом их адреса бы не менялись.
Т.е. происходит преобразование адресов 1-1 (один внешний IP назначается одному внутреннему серверу). При такой настройке ваши серверы всегда будут доступны из интернета на любом порту.
Кстати говоря о портах, попробую несколько углубиться в эту тему, но не слишком сильно. Дело в том, что любой сервис, любая программа обращается к компьютеру, серверу, роутеру или сервису (будь то почта, веб-страничка или любой другой сервис) не только по IP адресу, но и по порту. Например, чтобы вам открыть страничку google.com со своего компьютера, вам надо ввести две вещи: IP адрес ( DNS имя) и.. порт.
Но постойте, возмутитесь вы, ведь никакого порта вы не вводите и все отлично открывается!
Так в чем же дело в статике?
Дело в том, что, нет, в DNS записи порт не прячется, как некоторые могли бы подумать, этот самый порт ваш браузер сам подставляет в адресную строку вместо вас. Вы можете легко это проверить. Введите в адресной строке google.com:80 и увидите, что страничка гугла открылась, но волшебные » :80 » внезапно исчезли.
Так вот, чтобы пользователям из интернета вас видеть и иметь возможность к вам подключаться, они должны знать две вещи: ваш IP адрес и ваш порт, на котором расположен ваш сервис.
При статическом NAT вам будет фиолетово какой порт использует сервер или программа, т.к. сервер становится полностью доступен из интернета. Чтобы уже ограничить используемые порты, настраивается на этом сервере межсетевой экран.
Схема работы статического NAT
Преимущества данного способа:
Тип второй, Dynamic NAT
Динамический NAT отличается от статического немногим. Он используется почти также, но с тем лишь исключением, что ваши сервера не видны из интернета, но самим серверам этот интернет нужен. Суть его в том, что вам также выдаются несколько внешних IP адресов от провайдера, после чего роутер сам распределяет адреса между «нуждающимися».
Т.е. как только сервер или компьютер захотел выйти в интернет, роутер смотрит на свой список внешних адресов, выданных провайдером, и выдает один адрес из этого списка, при этом помечает что вот он выдал такой-то внешний адрес такому-то серверу или компьютеру (таблица NAT ).
При этом срок жизни такой записи длится очень короткое время и как только сервер/компьютер перестал требовать доступ в интернет, этот адрес удаляется из таблицы NAT роутера.
Существенный недостаток в том, что количество серверов и компьютеров, которым требуется доступ в интернет, не должен сильно превышать кол-во выданных провайдером внешних адресов.
Недостаток и преимущества динамики
Ведь как только у роутера закончатся адреса в списке, он не сможет пустить новые компьютеры или серверы в интернет, пока не освободится хотя бы один внешний адрес.
Преимущества данного способа:
Тип третий, Port Address Translation (PAT), также известный как NAT Overload или NAT Masquerading
Еще немного про порты и другие нюансы
Многие программы (не только лишь все) имеют вшитые порты без возможности перенастройки, либо, к примеру, у вас есть два Веб-сервера на винде (так называемый IIS ), которые работают на 80 порту каждый и вам нужно дать доступ из интернета на оба сервера.
Итого, на роутере мы настраиваем порты таким образом:
Имя | Приложение | Внутренний IP | Внутренний порт | Внешний IP | Внешний порт |
Сервер 1 | Teamspeak | 192.168.1.2 | 9987* | 87.123.41.12 | 9987 |
Сервер 2 | FTP сервер | 192.168.1.3 | 21* | 87.123.41.12 | 21000 |
Сервер 3 | Веб-сервер | 192.168.1.4 | 80* | 87.123.41.12 | 80 |
Сервер 3 | Веб-сервер | 192.168.1.4 | 443* | 87.123.41.12 | 444 |
ПК 1 | uTorrent | 192.168.1.10 | 26000 | 87.123.41.12 | 26000 |
ПК 2 | Bit-Torrent | 192.168.1.20 | 26100 | 87.123.41.12 | 26100 |
ПК 2 | Game Server | 192.168.1.20 | 27015* | 87.123.41.12 | 27015 |
ПК 1 | RDP | 192.168.1.10 | 3389** | 87.123.41.12 | 33891 |
ПК 2 | RDP | 192.168.1.20 | 3389** | 87.123.41.12 | 33892 |
Наглядная схемка ниже:
Теперь я постараюсь объяснить почему я написал именно эти порты.
Немного деталей про порты
Подытожив все это получаем, что удаленным пользователям всеравно какие у нас внутренние порты, они о них не знают и знать не могут. Эта информация нужна только нашему роутеру, чтобы он мог пересылать запросы туда, куда они и должны попадать.
Преимущества и недостатки третьего варианта
Теоретически, вы можете назначить одному IP адресу до 131072 (2 * 2^16) приложений. Почему я говорю «приложений», а не компьютеров/серверов?
Углубляться в это в рамках этой статьи я не буду, в этом нет необходимости.
Для любой программы есть хелп, в котором написано какие порты ей нужны для работы, если их нельзя сменить. Многие приложения позволяют вам самим назначить какие порты какого типа использовать, таким образом упрощая вашу задачу. Для остальных же есть такой замечательный ресурс, как portforward.com.
Послесловие
Получилось несколько сумбурно, да и тема довольно непростая, но надеюсь теперь при слове NAT вас не будет бросать в дрожь 🙂
Как и всегда, если есть какие-то вопросы, мысли, дополнения и всё такое прочее, то добро пожаловать в комментарии к этой записи.
PS : За существование статьи отдельное спасибо другу проекта и члену нашей команды под ником “barn4k“