Настройка NAT: Hairpin

Hairpin NAT — примерно 10% запросов в нашу техподдержку так или иначе связаны с темой этой статьи.

Комментариев: 10Просмотров: 78381
20августа 2015
все статьи

Введение

Примерно 10% запросов в нашу техподдержку таки или иначе связаны с темой этой статьи.

Итак, что такое Hairpin NAT и зачем он нужен.

Данная конфигурация обычно требуется, если Вы опубликовали на внешнем адресе (dst-nat) сервер, и Вам необходимо чтобы он был доступен по внешнему адресу изнутри сети.

Начнем с базовой конфигурации сети.

  1. Вы имеете IP адрес 1.1.1.1/24 на интерфейсе WAN вашего маршрутизатора
  2. Вы имеете IP адрес 192.168.0.1/24 на интерфейсе LAN вашего маршрутизатора.
  3. Вы имеете www-сервер с адресом 192.168.0.10 в LAN сегменте.
  4. Адрес вашего компьютера находится в диапазоне адресов LAN. Для примера пусть это будет 192.168.0.5

Схема

Вам помогла эта статья?

Приглашаем пройти обучение в нашем тренинг-центре и научиться настраивать оборудование MikroTik на профессиональном уровне! Узнайте расписание ближайших курсов и бронируйте место!

 

схема базовой конфигурации сети

Вполне логично? что для того, чтобы опубликовать web-сервер на внешнем интерфейсе, Вы создаете правило dst-nat следующего вида:

/ip firewall nat add action=dst-nat chain=dstnat dst-address=1.1.1.1 dst-port=80 protocol=tcp \ to-addresses=192.168.0.10
 

Обратите внимание, что в правиле не указан in-interface, так как правило должно срабатывать при обращении на 80 порт адреса 1.1.1.1 с любого интерфейса.

Вы это делаете и..
И у вас все замечательно работает снаружи сети (при обращении из Интернет), но обращение с вашего компьютера по адресу http://1.1.1.1 говорит «Нет ответа от сервера». Для того, чтобы понять, что же происходит, рисуем схему прохождения и преобразования пакета:

 схема прохождения и преобразования пакета

Теперь распишем что происходит на каждом этапе.

Этап 1
Компьютер с адреса 192.168.0.5 пытается установить соединение с адресом 1.1.1.1 по 80 порту и отправляет пакет на маршрутизатор.

Этап 2
На маршрутизаторе срабатывает правило dst-nat, в результате чего адрес назначения пакета меняется на 192.168.0.10, и пакет отправляется на www-сервер 192.168.0.10.

Этап 3
Узел 192.168.0.10 получив пакет с адресом источника 192.168.0.5, определяет, что они оба находятся в одной локальной сети и отвечает ему напрямую, минуя маршрутизатор.

Проблема
Компьютер, отправив пакет на адрес 1.1.1.1, вдруг получает ответ с адреса 192.168.0.10. Естественно этот пакет он игнорирует и соединение не устанавливается.

Решение
Чтобы решить эту проблему, необходимо, чтобы www-сервер получил пакет у которого адрес источника будет равен адресу маршрутизатора.
Добавляем к нашей конфигурации правило, которое заменит адрес отправителя, адресом интерфейса маршрутизатора и получаем следующую конфигурацию:

/ip firewall nat

add action=dst-nat chain=dstnat dst-address=1.1.1.1 dst-port=80 protocol=tcp to-addresses=192.168.0.10
add action=masquerade chain=srcnat dst-address=192.168.0.10 dst-port=80 protocol=tcp src-address=192.168.0.0/24
 

Теперь у нас из конфигурация работает правильно. Схема для понимания:

схема

Работа схемы

Этап 1
Компьютер с адреса 192.168.0.5 пытается установить соединение с адресом 1.1.1.1 по 80 порту и отправляет пакет на маршрутизатор.

Этап 2
На маршрутизаторе срабатывает правило dst-nat, в результате чего адрес назначения пакета меняется на 192.168.0.10 и правило src-nat, где адрес источника пакета меняется на адрес интерфейса маршрутизатора (192.168.0.1). После чего пакет отправляется на www-сервер 192.168.0.10.

Этап 3
Узел 192.168.0.10 получив пакет с адресом источника 192.168.0.1 (адрес маршрутизатора), определяет, что они оба находятся в одной локальной сети и отвечает ему. В результате чего пакет попадает на маршрутизатор

Этап 4 
Connection Tracker маршрутизатора получив такой пакет выполняет обратное преобразование адресов. Компьютер получает ожидаемый ответ с адреса 1.1.1.1

Вот такая схема трансляции адресов и является Hairpin NAT.

Нужно отметить что у схемы есть недостаток. Заключается он в том, что публикуемый сервер будет получать запросы от хостов локальной сети с адреса маршрутизатора. Что не всегда хорошо. Например, если Вы так опубликуете прозрачный proxy-сервер, вряд ли у вас получится собрать нормальную статистику.

Альтернативой такой схемы могут служить.
1. Вынос публикуемых, или вообще всех серверов в отдельную подсеть. 2. Использование так называемого split-dns. Когда компьютер находясь снаружи сети на запрос www.mydomain.com получит адрес 1.1.1.1, а находясь внутри сети на этот же запрос получит адрес 192.168.0.10.

На этом я заканчиваю цикл статей про NAT на MikroTik. Надеюсь, что сумел описать все основные моменты работы NAT на маршрутизаторах MikroTik. Буду рад комментариям!

Статья написана сертифицированным тренером MikroTik Князевым И.Н., технический директор.

поделиться материалом:

Читайте также

комментарии — 10
AlexBob04 декабря 2020 в 11:53
Лучшее объяснение!
Андрей30 июня 2020 в 14:42
Спасибо, помогло
Максим21 июня 2020 в 17:51
А что делать когда IP адрес динамический? Я прочитал, что можно "dst-address" вообще не писать, или можно ddns указать.
Эти советы я взял отсюда https://qna.habr.com/q/271690
Подскажите пожалуйста что мне делать.
Андрей08 мая 2021 в 20:22
Если есть внешнее доменное имя, которое ссылается на ваш микротик (например ********bfd.sn.mynetname.net) то можно его добавить в адрес лист, микротик в современных прошивках будет сам его резолвить до айпишника, затем в нужном правиле ничего не указывать в поле dst-address, но при этом на вкладке "Advanced" данного правила в поле Dst. Address List указываете свой созданный адрес лист и всё. У меня так работает доступ к нексткауду извне, причём в качестве внешнего адреса используется dns адрес который даёт мне Cloud микротика (IP>Cloud>DDNS Enabled) (этот бесплатный ddns сервис вроде есть во всех микротиках с новыми прошивками)
Денис23 июля 2019 в 22:59
Дмитрий28 сентября 2018 в 15:54
Респектос за комментарий! Помог разобраться.
Дмитрий28 сентября 2018 в 15:54
после того как отработает правило
ip firewall nat add action=dst-nat chain=dstnat dst-address=1.1.1.1 dst-port=80 protocol=tcp to-addresses=192.168.0.10
айпи адрес назначения поменяется.
поэтому в следующем правиле надо указывать в качестве dst-address айпи нашего сервера в локалке
add action=masquerade chain=srcnat dst-address=192.168.0.10 dst-port=80 protocol=tcp src-address=192.168.0.0/24
Семен13 ноября 2018 в 17:00
+1 Статью бы поправить
rkomo06 октября 2017 в 19:33
Не совсем согласен со сценарием в статье когда NAT loopback (hairpinning) используется в качестве аналога splitdns. К NAT loopback стоит прибегать в последнюю очередь, когда нет возможности настроить тот же splitDNS, как вариант модификация hosts на клиентах, нет возможности обращения по локальному адресу/другому доменному имени и пр. Нагружать роутер локальным трафиком, при добавляя дополнительную точку отказа, не самая хорошая идея, если есть возможность не гнать этот трафик на шлюз.
Edvard11 декабря 2017 в 09:47
SplitNAT ne vsegda ty smozhesh nastroit, dopustim u menia 1 IP adress ot provaidera, a za nim ja priaciu 5 raznyh vnutrinneh IP i delaju port forward.
1. port 25 idiot na ip1
2. port 80/443 na ip 2
3. port xxx na ip 3
tut nikak s splitDNS ne vykrutishsia.

Hairpin NAT mozhno nastroit namnogo prosche, chem pokazana v etoj statje. eto vygliadit prosto tak:
/ip firewall nat
add action=masquerade chain=srcnat out-interface=wan
add action=masquerade chain=srcnat dst-address=192.168.10.0/24 out-interface=vlan0-bridge src-address=192.168.10.0/24

interface=wan smotri na naruzhu
interface=vlan0-bridge vnutrennij LAN
192.169.10.0/24 ip subnet na vlan0-bridge

vot i vsio. porty mozhno forwardit seichas takim sposobom:

add action=dst-nat chain=dstnat dst-address=!192.168.10.254 dst-address-type=local dst-port=80 protocol=tcp to-addresses=192.168.10.10 to-ports=80
add action=dst-nat chain=dstnat dst-address=!192.168.10.254 dst-address-type=local dst-port=443 protocol=tcp to-addresses=192.168.10.11 to-ports=443

192.168.10.254 v etom sluchaje default gateway, a .10 i .11 vnutrennije resursy
Евгений06 июня 2020 в 23:45
Эдвард, с альтернативным хаирпином понятно, указанный ниже порт форвардинг нужно использовать вместо обычного? Или можно оставить как есть?