Hairpin NAT на MikroTik: доступ к локальному серверу по внешнему IP
В чем заключается парадокс «доступа изнутри»?
Вы настроили проброс портов (dstnat) на сервер видеонаблюдения или 1С. Когда вы находитесь дома или в дороге и заходите через мобильный интернет по внешнему IP или домену (например, cam.mycompany.ru:8080), всё отлично открывается. Но стоит подключиться к офисному Wi-Fi — сайт или камеры перестают загружаться. Роутер получает пакет из локальной сети, отправленный на его собственный внешний адрес, и не знает, как вернуть ответ обратно клиенту. Эта проблема решается настройкой Hairpin NAT (петлевой NAT).
Схема движения пакетов без Hairpin NAT
| Шаг пакета | От кого | Кому | Что ломается |
|---|---|---|---|
| 1. Запрос клиента | 192.168.88.10 (ПК) | 203.0.113.5 (Внешний IP) | Роутер делает dst-nat на сервер 192.168.88.50 |
| 2. Ответ сервера | 192.168.88.50 (Сервер) | 192.168.88.10 (ПК напрямую) | ПК ждал ответ от 203.0.113.5, а получил от 192.168.88.50 и сбрасывает пакет! |
Настройка Hairpin NAT в RouterOS (Winbox)
Чтобы сервер отвечал не напрямую компьютеру, а возвращал трафик через роутер, нужно добавить одно специальное правило srcnat для локальной подсети.
- Открываем меню NAT:
Зайдите в Winbox, перейдите в раздел IP > Firewall > вкладка NAT и нажмите +.
- Заполняем вкладку General:
- Chain: выберите
srcnat. - Src. Address: укажите вашу локальную подсеть —
192.168.88.0/24. - Dst. Address: укажите ту же самую локальную подсеть —
192.168.88.0/24. - Protocol: выберите
6 (tcp).
- Chain: выберите
- Заполняем вкладку Action:
- Action: выберите
masquerade.
- Action: выберите
- Сохраняем правило:
Нажмите Apply и OK.
Универсальная консольная команда для терминала:
/ip firewall nat add chain=srcnat action=masquerade protocol=tcp \
src-address=192.168.88.0/24 dst-address=192.168.88.0/24 comment="Hairpin NAT Loopback"Важное примечание для dst-nat: Убедитесь, что в вашем основном правиле проброса портов (dstnat) в поле Dst. Address указан ваш точный внешний IP (или поле Dst. Address Type = local), а НЕ привязка к входящему порту In. Interface = ether1, иначе роутер не распознает запросы, пришедшие из локальной сети.
Частые вопросы (FAQ)
Почему эта технология называется Hairpin (шпилька для волос)?
Название связано с траекторией пакета: пакет от локального ПК заходит в роутер и, разворачиваясь на 180 градусов как заколка-шпилька, возвращается обратно в тот же самый локальный интерфейс.
Создает ли Hairpin NAT высокую нагрузку на роутер?
Для небольших офисов нагрузка незаметна. Однако для тяжелых локальных бэкапов лучше обращаться к серверам напрямую по их локальному IP-адресу.
Как решить эту проблему без Hairpin NAT через локальный DNS?
Можно использовать технологию Split-DNS: в меню IP > DNS > Static прописать запись cam.mycompany.ru = 192.168.88.50. Тогда внутри офиса компьютеры будут сразу обращаться к локальному IP.
Будет ли работать Hairpin NAT для UDP-протоколов (например, DNS или видеопотоков)?
Да, для этого в правиле Hairpin NAT измените параметр Protocol на udp или оставьте поле Protocol пустым для всех типов трафика.