понедельник, 21 ноября 2016 г.

Hairpin NAT - доступ через внешний IP на свои ресурсы, находясь внутри сети.

  Допустим мы имеем конфигурацию, когда в вашей офисной или домашней сети есть веб-сервер. На него из-вне проброшен 80 порт. Ваши клиенты могут заходить на ваш домен domain.ru, который имеет внешний IP 1.1.1.1 с переадресацией через Mikrotik на web-сервер 192.168.1.2. Визуально такое правило выглядит так:
/ip firewall nat
add chain=dstnat dst-address=1.1.1.1 protocol=tcp dst-port=80 action=dst-nat to-address=192.168.1.2
  Все запросы с внешнего IP 1.1.1.1 на 80 порт направлять на наш веб-сервер. Второе правило - обычный NAT для нашей внутренный сети:
add chain=srcnat out-interface=WAN action=masquerade
  Когда внешний клиент с WAN-интерфейса совершает подключение к нашему веб-серверу это выглядит так:

  1. Внешний клиент посылает пакет с IP-адресом источника 2.2.2.2 (IP внешнего клиента) на IP-адрес назначения 1.1.1.1 (IP резольва нашего ресурса domain.ru) на порт TCP / 80 для запроса веб-ресурса.
  2. Пакет попадает в NAT маршрутизатора, роутер заменяет IP назначения на 192.168.1.2. Источник IP-адрес остается прежним: 2.2.2.2.
  3. Сервер отвечает на запрос клиента. Пакет имеет IP-адрес источника 192.168.1.2 и IP-адрес назначения 2.2.2.2.
  4. Маршрутизатор определяет, что пакет является частью предыдущего соединения, применяет  NAT (помещает исходный IP-адрес назначения в поле IP-адрес источника). IP-адрес назначения 2.2.2.2, а источник IP-адрес 1.1.1.1.

  Клиент получает ответный пакет который он ожидает - соединение установлено. Такая схема рабочая. Проблемы начинаются тогда, когда клиент (источник пакета) находится внутри вашей сети. Например, на ваш веб-сервер, на домен domain.ru, который разрешается DNS как 1.1.1.1 хочет зайти клиент с адресом 192.168.1.10, который находится в одной подcети с нашим веб-сервером, который имеет IP 192.168.1.2 (подсеть 192.168.1.0/24).

  1. Клиент посылает пакет с IP-источником 192.168.1.10 на IP-адрес назначения 1.1.1.1 на порт TCP / 80 для запроса веб-ресурса.
  2. В NAT маршрутизатор пакет назначения заменяет на 192.168.1.2, IP-адрес источника остается прежним: 192.168.1.10.
  3. Сервер отвечает на запрос клиента. Так как IP-адрес источника запроса находится в той же подсети, что и веб-сервер, веб-сервер не отправляет ответ обратно к маршрутизатору, а отправляет его непосредственно на 192.168.1.10 с исходным IP-адресом в ответе - 192.168.1.2.
  Фактически, клиент получает ответ не от того отправителя, от которого ожидает. Он отправлял пакет на маршрутизатор с IP 1.1.1.1 и должен получить от IP 1.1.1.1, а получил от IP 192.168.1.2. Этот пакет считается недействительным и связь не устанавливается, а страничка domain.ru не открывается.
  Что-бы решить эту проблему нужно добавить еще одно правило в Mikrotik, для того что-бы весь ответ на нужных нам портах проходил через маршрутизатор.
/ip firewall nat
add chain=srcnat src-address=192.168.1.0/24 dst-address=192.168.1.2 protocol=tcp dst-port=80 out-interface=LAN action=masquerade
    Рассмотрим этот вариант.
  1. Клиент посылает пакет с IP-источником 192.168.1.10 на IP-адрес назначения 1.1.1.1 на порт TCP / 80 для запроса веб-ресурса.
  2. В NAT маршрутизатор пакет назначения заменяет на 192.168.1.2. IP-адрес источника заменяет на IP-адрес LAN-порта маршрутизатора: 192.168.1.1.
  3. Веб-сервер отвечает на запрос и отправляет ответ с источником 192.168.1.2 обратно в LAN интерфейс маршрутизатора - на 192.168.1.1.
  4. Маршрутизатор определяет, что пакет является частью предыдущего соединения, разрешает NAT, помещает в источник IP 1.1.1.1 и отправляет пакет на 192.168.1.10.
  Клиент получает ответный пакет тот, который он ожидает - соединение будет установлено. Нужно учитывать, что при такой схеме ваш веб-сервер всегда видит IP-источника 192.168.1.1 при подключении к нему внутренних клиентов из вашей сети.
  Так же, стоит сказать, если вы в Mikrotik в статические записи ДНС добавите правило:
/ip dns static
add address=192.168.1.2 name=
domain.ru
  И ваши клиенты будут использовать роутер как DNS-сервер, то все пакеты, которые будут отправлены на domain.ru сразу зарезольвятся на адрес 192.168.1.2. Таким образом они попадут на веб-сервер минуя маршрутизатор, и ваш веб-сервер ответит напрямую компьютеру из сети, и пакет тоже отлично пройдет, и сайт откроется. Недостатком такого метода можно считать то, что большое количество сайтов добавлять в статический записи неудобно. Плюс при такой схеме обязательно нужно использовать Mikrotik как главный и единственный DNS-сервер.
  В примере приведен образец с WEB-сервером, хотя эту схему можно использовать и для других сервисов и портов (например ftp, ssh и т.д.).

Перевод

Подписаться на новые статьи.

8 комментариев:

  1. Пробовал по статье-не работает
    проще так :
    /ip dns static
    add name domain.ua address=192.168.88.66

    ОтветитьУдалить
    Ответы
    1. очень странно, потому-как этот метод проверенный и не раз.

      Удалить
  2. Дуже дякую за статтю, у мене hairpin NAT чудово запрацював на внутрішній NAS який має зовнішній URL по SSL.

    ОтветитьУдалить
  3. Чем больше настраиваю микротик, тем больше захожу в тупик при казалось бы простых правилах, сначала не мог настроить проброс портов, пока не удалил все дропы на вкладке фильтр, после чего заработало, потом восстановил дропы в том же порядке и все продолжает работать (!), теперь хочу получить доступ к сайту из локалки, делаю правилом как в статье - не работает, что теперь сделать ума не приложу и такая ситуация как я понял у многих.

    ОтветитьУдалить
  4. Здраствуйте. Подскажите пожалуйста, как зайти через инет (через микроти) на расшаренные ресурсы сети??? микротик подключается через ПППоЕ, есть постоянный белый ИП. Буду очень благодарен.

    ОтветитьУдалить
  5. также настоен VPN сервер на ППтП на микротике. Работает, с удаленного ноута, сматрфона.

    ОтветитьУдалить
  6. Всё работает, кроме одного нюанса - на том компе, где установлен веб-сервер, при таких правилах не работает обновление репозитория - команда auso apt update дает вот такую стремную портянку:

    (8) manpage for repository creation and user configuration details.
    E: The repository 'http://ppa.launchpad.net/nilarimogard/webupd8/ubuntu cosmic Release' no longer has a Release file.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    E: The repository 'http://ppa.launchpad.net/ondrej/php/ubuntu cosmic Release' no longer has a Release file.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    E: The repository 'http://ppa.launchpad.net/stebbins/handbrake-releases/ubuntu cosmic Release' no longer has a Release file.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    E: The repository 'http://ppa.launchpad.net/ubuntuhandbook1/avidemux/ubuntu cosmic Release' no longer has a Release file.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.

    ОтветитьУдалить