NAT в роутере и на сервере – что это такое и где используется
NAT (происходит от английского термина Network Address Translation, который переводится как «преобразование сетевых адресов») при помощи этой функции в сетях TCP/IP преобразовываются IP-адреса транзитных пакетов. Он есть у всех роутеров, имеет название port forwarding.
Преимущество данной технологии в том, что не надо изменять конфигурацию маршрутизаторов и окончательных узлов внутренней сети. Эти технологии не применяются там, где в работе с внешними сетями задействовано много внутренних узлов.
Типы NAT
Static NAT
Как правило, не используется физическими лицами для их потребностей, а применяется компаниями, в которых есть много IP адресов с необходимостью, чтобы они для некоторых серверов оставались постоянными и были доступны из вне. Чтобы открыть какой-нибудь сервис (почта, сайт и т.д.) необходимо знать 2 параметра: IP адрес (DNS имя) и порт. При этом порт обычно не вводится (если он не был изменен), поскольку программы вводят его автоматически и, следовательно, пользователь даже не задумывается о его наличии. Для того чтобы другие пользователи глобальной паутины могли работать с определённым компьютером, им необходимы знать его IP (DNS имя) и порт сервиса.
Если у человека статический Network Address Translation и один компьютер в сети, то знать порт не обязательно, достаточно будет знания IP. Чтобы ограничить доступ, нужна установка межсетевого экрана.
Чтобы было понятнее, можно провести такую аналогию: IP адрес — это чей-то дом, а порт – его квартира. Чтобы человека нашли, нужно знать и то и другое.

Как это работает. Допустим, провайдер выдал 4 IP для 3-х серверов. Роутеру назначается первый, а остальные достаются серверам. Чтобы на них смогли попасть достаточно указать внешние IP, например, второй, а роутер всё равно перенаправит на первый сервер. Человек попадает на сервер, работает на нём, но не знает, что его адрес иной. Запись будет храниться об этом в таблице NAT.
Есть положительные моменты: адреса пользователя не видны, но он сам виден из интернета. Минусы: любому другому пользователю будет просто совершить попытку взлома его компьютера.
Dynamic NAT
В отличие от статического имеет одно исключение: из глобальной паутины нет возможности увидеть сервера, с которыми производится работа. Клиент получает несколько IP, но здесь их распределяет роутер. Когда клиент находится в интерне, роутер сам выбирает среди полученных один адрес, выдаёт его и заносит в таблицу Network Address Translation. Но сама запись долго не хранится, когда пользователь вышел из интернета она вытирается из таблицы.
Большим недостатком является то, что необходимое число входов в глобальную паутину не может быть больше количества IP адресов, которые выдал провайдер. Пока не найдутся свободные, новые пользователи не смогут подключиться к компьютеру. Но по сравнению с первым типом есть большое превосходство, другие пользователи не смогут свободно зайти на жёсткий диск компьютера, так как адреса постоянно меняются. Также самим клиентам не надо распределять IP адреса, их распределит роутер.
Port Address Translation (PAT), NAT Overload и Masquerading

Данный тип актуальнее физическому лицу, поскольку выдается единственный внешний адрес, а пользователь только назначает порт любому серверу. Скажем, кому-то необходимо, чтобы к нему могли зайти в торрент, для этого понадобятся не только внутренние, но и внешние порты. Программой используется внутренний порт только на компьютере, на котором она установлена. С других же машин будут подключаться к внешнему порту, находящемуся на роутере. Очень часто, но не всегда они совпадают.
У данного метода есть преимущество: доступ открыт для определённой программы, все остальное закрыто. А недостаток в том, что очень часто порты нужно настраивать вручную.
Как изменить тип NAT
Нужно зайти на свой роутер. Для этого, в браузере набираем 192.168.1.1 или 192.168.0.1 (или другую комбинацию в зависимости от маршрутизатора). Вводим логин и пароль. Там смотрим свой IP и настройки сети.
Затем необходимо обратиться к провайдеру интернет-подключения, сообщить данные, которые смотрели в роутере и он всё перенастроит.
Терминология NAT
Для NAT важно различать внутреннюю и внешнюю сеть. К внутренней относятся все сети, которые необходимы в преобразовании, к внешней – все остальные сети.
Система имеет 4 разновидности адресов:

- внутренний и внешний локальный;
- внутренний и внешний глобальный.
В задачи внутреннего входит преобразование механизмов NAT, внешний служит адресом устройства, куда необходимо войти. Под локальным понимают тот, который бывает во внутренних, а глобальным – во внешних сетях.
Как проверить находится ли компьютер за NAT
Для этого достаточно определить IP компьютера пользователя. Если какой-то адрес попадает в диапазоны (используются только для локальных сетей):
- 10.0. 0. 0 — 10. 255.255.255;
- 172.Х. 0. 0 — 172. Х.255.255 (Х принимает значение от 16 до 31);
- 192.168. Х. 0 — 192.168.Х.255 (Х чаще всего 0 или 1, принимает значения от 0 до 255).
Это значит, что данный компьютер находится в локальной сети и пользователь в NAT.
Настройки NAT, как сделать его открытым
Чтобы настроить NAT в роутере, нужно зайти в браузер, набрать 192.168.1.1 или 192.168.0.1 (адрес роутера) после чего потребуется ввести логин с паролем (обычно Admin/Admin). Затем находится поле Configuration (настройки), потом Network (сеть) и Routing (маршруты или маршрутизация). В новом окне выбирают Policy Routing (новое правило). Здесь задаются условия маршрутизации. Выбрать можно по различным свойствам, таким, как: пользователи, интерфейсы, IP-адрес источников или получателей, порт назначения.
Задаем условия трафика, там есть несколько назначений: Auto перенаправит трафик в глобальный интерфейс, который указан по умолчанию, Gateway на адрес, имеющийся в настройках, Trunk — на несколько интерфейсов, Interface – на тот интерфейс, который указан.
На сервере настраивается следующим образом: в начале находится Диспетчер сервера, на который щёлкают мышкой, потом в новом окошке на добавить роли и компоненты, затем далее, устанавливают удалённый доступ, потом добавить компоненты и продолжить. Затем выбирают службы ролей и отмечают маршрутизация, нажимают на далее. В самом конце на закрыть.
После подключения компьютера к серверу необходимо его настроить в NAT. В меню пуск находится окно администрирование — маршрутизация и удалённый доступ. Для активации нужно нажать на «включить маршрутизацию и удалённый доступ». Затем на «далее» и выбрать преобразование сетевых адресов NAT. Потом нажимаем на интернет и включаем базовые службы назначения. Продолжаем несколько раз нажимать на «далее» и последний раз на «готово».
Сделать NAT открытым может помочь провайдер с которым клиент заключил договор на поставку интернет услуг, просто необходимо обратиться к нему с этим вопросом.
Технология NAT loopback и NAT Traversal
Суть NAT loopback в том, что если пакет попадает из внутренней сети на IP-адрес роутера, то такой пакет будет принят, как внешний и на него будут распространяться брандмауэрные правила для внешних соединений. После успешного прохождению пакета через брандмауэр вступит в работу Network Address Translation, который будет посредником для двух внутрисетевых машин. Получается следующее:
- снаружи локальной сети можно узнать о настройках сетевой службы;
- зайти на сервер по имени домена, который находится в локальной сети. Без функции loopback (или hairpinning) данные действия были бы невозможными, нужно было бы для любого домена настраивать файл hosts;
- основной минус – увеличение нагрузки на роутер с хабом.
NAT Traversal – это возможности у сетевых приложений определить то, что они располагаются за границами устройства. В этом случае Network Address Translation оказывает содействие в том, чтобы определить внешний IP-адрес данного устройства и сопоставлять порты, чтобы NAT пересылал используемые приложениями пакеты с внешнего порта на внутренний. Все эти процессы выполняются автоматически. Без них пользователю пришлось бы вручную сопоставлять настройки портов и вносить в разные параметры изменения. Но есть и минусы – нужно проявлять осторожность для таких приложений – они обладают возможностями широкого контроля над устройствами, а следовательно могут появится уязвимости.
Хостинг на Raspberry Pi. NAT Loopback в D-Link DIR-620

Сегодня я Хочу рассказать о том как с помощью Raspberry Pi можно организовать технологию NAT Loopback в домашних маршрутизаторах на примере Wi-Fi роутера D-Link DIR-620.
Вообще чтобы было понятно что это такое [NAT Loopback] попытаюсь простенько рассказать.
Смысл технологии NAT loopback (или NAT hairpinning) прост: если пакет приходит из внутренней сети на внешний IP-адрес маршрутизатора, он считается пришедшим извне — а значит, работают правила брандмауэра, относящиеся ко внешним соединениям. И если пакет успешно пройдёт сквозь брандмауэр, сработает NAT, взяв на себя посредничество между двумя внутрисетевыми машинами. Это даёт две вещи.
Прямо изнутри локальной сети можно проверить, как настроены сетевые службы.
Доступ к серверу, находящемуся в локальной сети, по доменному имени. Без NAT loopback пришлось бы править файл hosts на каждой машине для каждого задействованного домена и поддомена.
Недостатком NAT loopback можно считать повышенную нагрузку на хаб и маршрутизатор (по сравнению с прямым доступом к серверу).
Как уже было сказано это возможность постучаться изнутри на внешний адрес. В некоторых домашних роутерах это возможность есть. а в моем нет. Да мало того еще странная вкладка как DMZ так и Виртуальные серверы. Почему в этот функционал не дать возможность Nat Looback? Ну это всего вопрос к производителям, который мною уже задавался, а вот ответ так я и получить не смог.
Зато было выяснено что к модему можно подключиться через telnet и выполнить пару команд, которые этот механизм NAT Loopback реализуют, минус в этом есть, что все эти действия помогают только до перезагрузки роутера.
Считаю это не страшным так как у меня в принципе полноценный сервер, которому ничего не стоит выполнять эти команды по планировщику и при включении. Основной загвоздкой было то, что у меня динамический внешний IP и его как-то нужно узнавать.
первым вариантом было как-то парсить результаты ответа от какого-нибудь 2ipru, но результаты запроса из google показали существование другого сервиса — icanhazip.com. Именно он мне и приглянулся, так как отдает чистый текст, который не нужно парсить, а просто брать и использовать.
На форуме D-Link мне подсказали что выполнять по telnetу
iptables -t nat -A POSTROUTING -d 192.168.0.80 -s 192.168.0.0/24 -p tcp —dport 21 -j SNAT —to-source 192.168.8.103
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d 192.168.8.103 -p tcp —dport 21 -j DNAT —to-destination 192.168.0.80
192.168.0.80 — адрес моего ПК, 192.168.8.103 — адрес на WAN роутера
После недолгих раздумий был написан небольшой bash скриптик
WAN_IP=»`wget -qO — http://icanhazip.com`»
echo «Логин Админа»
echo «Пароль Админа»
echo «iptables -t nat -A POSTROUTING -d 192.168.0.89 -s 192.168.0.0/24 -p tcp —dport 80 -j SNAT —to-source $WAN_IP»
echo «iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d $WAN_IP -p tcp —dport 80 -j DNAT —to-destination 192.168.0.89»
Команда sleep обязательна, так как это небольшая задержка на выполнения команды, а 192.168.0.89 — это IP адрес сервера к которому нужен доступ.
Собственно все что хотел сегодня Вам рассказать.
С уважением Ваш ИТ Инженер.
Посмотри и сравни — Windows и Linux — практический взгляд. Угадай кто кого?
Правильный NAT Loopback/HairPin NAT в MikroTik
Смысл технологии NAT loopback (NAT hairpinning) в том, что когда из внутренней сети приходит запрос на внешний IP-адрес маршрутизатора, он считается пришедшим извне — а значит, работают правила брандмауэра, относящиеся ко внешним соединениям. Таким образом, правила проброса портов извне также будут активны и корректно обрабатываться на запросах, пришедших из локальной сети. В этой статье разберем различные методы реализации этой схемы.
Немного теории
Технология NAT — Network Address Translation (а точнее один из его подвидов PAT — Port Address Translation) позволяет использовать один внешний адрес для создания подключений несколькими устройствами в локальной сети. Разберем как это работает.
Упрощенная схема прохода пакетов в Linux/MikroTik (PacketFlow)
Возьмем стандартную сеть и маршрутизатор MikroTik:
Схема сети для примеров
Когда компьютер в локальной сети хочет получить доступ до ресурса и посылает запрос в интернет, маршрутизатор создает новую запись в таблице трансляции адресов (NAT connections table), присваивает метку new на этапе connection tracking. Далее следует этап routing decision, где маршрутизатор присваивает пакету выходной интерфейс (как правило WAN — ether1), после прохода цепочки forward, в post routing происходит замена адреса источника на адрес выходного интерфейса динамически (action: masquerade) либо на заранее заданный статически (action: src-nat — to-address). Таким образом пакет уходит в интернет с внешним IP адресом маршрутизатора с исходным адресом назначения.
В виде правил MikroTik механизм выглядит примерно так:
Первый этап прохождения NAT: запрос из LAN в WAN
Для того, чтобы идентифицировать данное соединение в таблице трансляции адресов создается запись, где содержатся параметры соединения: адрес источника (в локальной сети), адрес назначения, порт назначения, порт источника. В MikroTik эту таблицу можно посмотреть в IP — Firewall — Connections. Данные записи содержат дополнительные поля, такие как: наличие fasttrack, есть ли ответные пакеты, активность правил цепочек src-nat и dst-nat и другие. Если NAT в MikroTik не включен (отсутствуют работающие правила таблицы NAT), то connection tracking автоматически отключается за ненадобностью.
Таким образом, когда приходит ответ от сервера, маршрутизатор смотрит таблицу трансляции адресов и если находит там подходящую запись, то на этапе connection tracking заменяет адрес назначения с внешнего IP маршрутизатора на локальный адрес устройства, на сохраненный ранее в таблице трансляции. С помощью этого механизма, устройство в локальной сети получает доступ в интернет.
Второй этап прохождения NAT: ответ из WAN в LAN
Проброс портов
Ключевой особенностью является то, что новые запросы могут создавать только в одну сторону: из локальной сети в интернет, но не наоборот. «NAT не является firewall», однако в стандартной конфигурации из-за специфики работы он запрещает все новые соединения с внешнего интерфейса в локальную сеть. При отсутствии подходящего правила для обратной трансляции пакет переходит в цепочку input — то есть пакетов, которые адресованы самому маршрутизатору. Если не найдена подходящая служба на маршрутизаторе, прослушивающая соединения на порту, пакет отбрасывается.
Иногда возникает потребность принимать новые соединения из интернета, на компьютере в локальной сети за NAT. Для этого потребуется правило «обратного NAT», которое сработает в цепочке prerouting и заменит адрес назначения на требуемый.
Как видно из правила, оно сработает на все пакеты, проходящие через роутер, у которых порт назначения 80 или 443 и перепишет их адрес на 192.168.88.5. Но так как работа этого правила распространяется и на пакеты, идущие из локальной сети, то устройства в локальной сети больше не смогут получать доступ к web ресурсам интернета потому что маршрутизатор начнет заменять адрес назначения на 192.168.88.5 на всех пакетах, соответствующих условию. Чтобы такого не произошло, необходимо добавить условия адреса назначения или интерфейса назначения.
Данное правило будет полноценно работать и перенаправлять новые соединения из интернета на устройство в локальной сети.
NAT Loopback / Hairpin NAT
Проблема
С новыми соединениями из интернета разобрались, но что будет, если устройство попытается обратиться на внешний адрес маршрутизатора из локальной сети? В зависимости от условия возможны следующие варианты:
- Если в условии использовался внешний интерфейс, то правило не сработает и пакет будет отброшен маршрутизатором — соединение не состоится.
- Если в условии использовался внешний адрес маршрутизатора, то правило сработает, но соединение не установится. Рассмотрим этот сценарий подробнее.
Пакет будет отброшен инициатором соединения
Запрос успешно дойдет до устройства назначения, однако ответ должен будет вернуться напрямую на устройство, без маршрутизатора. В результате при проверках на устройстве-инициаторе соединения пакет будет отброшен, так как от этого адреса источника он не ждет ответов. Соединение не установится.
Варианты решения
Подмена на уровне DNS
Если приложение использует DNS для определения IP адреса сервиса назначения (например, сайт), то самым правильным способом будет использование в локальной сети DNS-сервера, который будет отдавать внутренний IP адрес для домена. В случае использовании MikroTik DNS-сервера, правило будет выглядеть примерно так:
Таким образом настройка NAT Loopback не потребуется в принципе. Клиент будет напрямую обращаться на сервер назначения по локальной сети без использования маршрутизатора, а сервер назначения, в свою очередь, увидит настоящий адрес источника в локальной сети
Данное решение не будет работать в случае использования DNS-over-HTTPS или аналогов на конечных устройствах или в случае, если приложение не использует доменные имена.
Официальный
Многие ресурсы, включая wiki.mikrotik.com, предлагают примерно одни и те же варианты решения:
Этим правилом задаем, что: всем пакетам, которые идут из локальной сети, на адрес 192.168.88.5, на порты 80 и 443 и выходят с интерфейса LAN мы меняем адрес источника на адрес маршрутизатора в локальной сети.
Таким образом, соединение успешно устанавливается, однако есть несколько ограничений:
- На каждое правило проброса порта потребуется еще одно правило для поддержки NAT Loopback
- Можно легко попасться на граблю, не указав фильтр источника пакетов (src-address=192.168.88.0/24). Все запросы (включая те, что идут из интернета) на сервер назначения будут идти от адреса маршрутизатора, что в итоге может сломать фильтрацию на базе адресов источника на сервере назначения.
- Серверу назначения, которому в итоге придет запрос не будет видно IP адрес источника, так как им будет являться маршрутизатор
Дополненный официальный способ
Официальный способ мне не понравился в первую очередь тем, что потребуется создавать несколько правил для одного проброса портов. Об этом легко забыть или ошибиться в составлении второго правила.
Суть моего решения заключается в том, чтобы на входе в маршрутизатор маркировать пакеты, пришедшие на внешний адрес из локальной сети, а после прохождения процедуры маршрутизации подставлять IP адрес маршрутизатора отдельными правилами, отличными от правил проброса портов.
Первым этапом нужно промаркировать (new-packet-mark=nat-loopback) те пакеты, которые пришли на внешний адрес маршрутизатора (dst-address=203.0.113.5) из локальной сети (in-interface=LAN).
Теперь нужно написать обработчик пакета, который сработает после того как пакет пройдет маршрутизацию и будет на выходе в локальную сеть, в таблице mangle необходимо заменить адрес источника на адрес маршрутизатора.
Далее можно писать правила проброса в классическом виде. Этой схемой мы избавились от двух из трех недостатков предыдущего способа.
Таким образом, появляется возможность писать правила проброса портов в обычном виде по одному на порт или несколько портов. Они будут работать как и в классическом сценарии (при поступлении извне), так и в случае поступления запросов из локальной сети.