Сравнение Закладки
Бесплатно по России:
8 800 700 97 66
Санкт-Петербург:
8 812 385 40 55
Перезвонить вам?

Hairpin NAT. Часть 5

Примерно 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

Схема

Вполне логично? что для того, чтобы опубликовать 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=1.1.1.1 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 Князевым И.Н., технический директор.

Первая часть настройки NAT

Вторая часть настройки NAT

Третья часть настройки NAT

Четвертая часть настройки NAT

13699
Комментарии (17)

Стас04.09.2016

Полностью поддерживаю предыдущих ораторов..
Не работает.. проверял - перепроверял.
Выглядит вроде красиво, но толку нет.

ответить
Сменить картинку

Андрей23.07.2016

А как изменить правило если сервер публикуется на непарном адресе. Например сервер на 80 а опубликован 10080 порт

ответить
Сменить картинку

Сергей Шеянов16.06.2016

Ничего не работает.. и почитав комментарии, я понял, что не у меня одного..Статья вроде написана хорошо, только вот не работает ничего :)Солидарен с zzz, если уж пишите такое, то хоть проверяйте свои правила.. А то выглядите тупыми просто

ответить
Сменить картинку

Юрий Дулебо07.04.2016

Согласен с Gregory, Ваша конфигурация Hairpin_NAT не будет работать.
Причина в том, что для пакета 192.168.0.5=>1.1.1.1:80 сначала сработает правило
/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
когда он дойдет до цепочки src-nat, его вид будет 192.168.0.5=>192.168.0.10:80 и второе правило на него не сработает. Работать будет такой вариант второго правила
/ip firewall nat add action=masquerade chain=srcnat dst-address=192.168.0.10 dst-port=80 protocol=tcp \
src-address=192.168.0.0/24

ответить
Сменить картинку

Олег14.11.2016

Спасибо!!! Вот это работает!

ответить
Сменить картинку

Кирилл07.12.2016

Наконец-то рабочее решение, сасибо огромное!!!

ответить
Сменить картинку

Дмитрий05.01.2016

Илья огромное спасибо за статью.
Подскажите планируется ли написание статей по дуалВАНу?
И еще вы не планируете перейти с интернета на бумагу? Мне кажется книга бы пользовалась популярностью - по микромиру на русском насколько я знаю пока ничего нет.

ответить
Сменить картинку

Илья Князев22.01.2016

Спасибо за теплый отзыв. По Dual-WAN писал презентацию на MUM. Посмотрите в архивах MUM, который проходил в сентябре 2015г в Москве. Там и презентация и видео.
http://mum.mikrotik.com/2015/RU/agenda/EN

ответить
Сменить картинку

Сергей21.11.2015

Илья, спасибо за ваши статьи. Однако. я столкнулся с проблемой, которую пока не могу решить. Суть заключается в следующем. Внутри локальной сети есть DNS-сервер. Он используется всеми пользователями как основной. Понятно, что для того, чтобы пользователи могли работать с ресурсами, находящимися за NAT внутренний DNS-сервер должен взаимодействовать с forwarders и забирать информацию с них о хостах, которые находятся за пределами LAN. Проблема заключается в том, что я не могу правильно сконфигурировать firewall (скорее, не понимаю, как это нужно сделать), чтобы он позволял общаться внутреннему DNS-серверу и forwarders, к которым он передаёт запросы. Необходимые правила в NAT прописал и поставил правила в ip firewall filter (открыл 53 порт, разрешил new, active и related tcp/udp соединения), однако нужного результата не добился. Подскажите пожалуйста в каком направлении копать. Всё это я проделывал на MikroTik CRS125-24G-1S-IN, который работает в режиме роутера. Спасибо!

ответить
Сменить картинку

Сергей24.11.2015

Разобрался. Проблема била в том, что NAT ничего не «натировал» из локальной сети в WAN. Как толко включил всё мгновенно заработало. Вот такой вот странный NAT у CRS125-24G-1S-IN из коробки.

ответить
Сменить картинку

Александр29.10.2015

Так как у меня не получается, созрел такой вопрос: в вики правило для srcnat отличается от вашего, а именно в пункте dst-address указывается адрес сервера. И еще там указывается out-interface, можете пояснить для чего, или почему его не нужно указывать?

ответить
Сменить картинку

Илья Князев10.11.2015

Потому что здесь всего два интерфейса. И мы ограничили применимость правила через src-address

ответить
Сменить картинку

Gregory26.02.2016

кажется у вас ошибка.
/ip firewall nat
add chain=srcnat src-address=192.168.0.0/24 \
dst-address=192.168.0.10 protocol=tcp dst-port=80 \
out-interface=LAN action=masquerade

http://wiki.mikrotik.com/wiki/Hairpin_NAT

проверил у себя именно ваш не рабочий вариант

ответить
Сменить картинку

Gregory26.02.2016

немного не туда написал :)

ответить
Сменить картинку

zzz15.03.2016

Пиши правильно ДИБИЛ, люди то учаться у таких муд..в

ответить
Сменить картинку

grammarnazy26.04.2016

А теперь правильный вариант:"Пиши правильно дебил, люди-то учатся у таких муд..в!".

ответить
Сменить картинку

_18.07.2016

Почему в Вашем "правильном" варианте обращение не обособляется?

ответить
Сменить картинку
Комментировать
Сменить картинку
все события