Задать вопрос
4k4
@4k4

Как настроить NAT loopback на Mikrotik без конкретного указания внешнего адреса?

Недавно заменил старый dd-wrt роутер на Mikrotik. Настроил на нем DDNS (www.mysite.xyz), а также NAT для веб-сервера, расположенного в локальной сети (www.mysite.xyz:80 -> 192.168.1.10:8080).

Router WAN IP: Dynamic. DDNS: mysite.xyz
Router LAN IP: 192.168.1.1
Web Server IP (Port): 192.168.1.10:8080

;;; default configuration
chain=srcnat action=masquerade out-interface=WAN log=no log-prefix=""
;;; www
chain=dstnat action=dst-nat to-addresses=192.168.1.10 to-ports=8080 protocol=tcp
in-interface=WAN dst-port=80 log=no log-prefix=""

Теперь возникло желание ходить на этот веб сервер из локальной сети, но через внешний адрес/IP (чтоб отрабатывали правила Firewall, NAT и все остальное). В dd-wrt желаемая логика работы была прямо из коробки, без каких-либо настроек.

Главный вопрос: Как это организовать на Mikrotik?

---------------------
В интернете нашел похожий вопрос и, на первый взгляд, решение - wiki.mikrotik.com/wiki/Hairpin_NAT.
Но вся проблема в том, что WAN IP у меня не постоянный, и такие правила не подходят.

Пробовал указывать для "адреса" mysite.xyz конкретный IP (IP - DNS - Static: mysite.xyz -> 192.168.1.10) , но такой вариант не подошел т.к. в этом случае отваливается скрипт обновления DDNS и требуется дополнительная донастройка DNS на машинах, под управлением Windows 7.

В продвинутой настройке фильтров/маршрутизации, к сожалению, не силен.
  • Вопрос задан
  • 15178 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 5
@Stealth13
А я опытом поделиться хотел.
Задачка была, наверное, банальная: надо было сделать проброс портов на Микротике на внутренние ресурсы сети, но так, чтобы на эти внутренние ресурсы сети можно было заходить по интернетовскому доменному имени Микротика как из интернета, так и внутри сети. Обычный проброс портов "в лоб" работает только для обращений из интернета. При обращении внутри локальной сети по внешнему доменному имени получаем обломс. В интернетах нашлось 2 решения: одно - прописать на DNS Микротика "Static DNS" domain.name -> Внутренний_IP_адрес_ресурса, и тогда все обращения по доменному имени внутри сети будут направляться на этот внутренний ресурс. Но это не подходит, когда внутренних ресурсов несколько, а не один, ведь "Static DNS" мы можем написать только для одного ресурса. Второе решение - Hairpin NAT, описанное в Wiki wiki.mikrotik.com/wiki/Hairpin_NAT . Однако с ним тоже проблемы, если внешний IP адрес является динамическим и часто меняется (с доменным именем от dyndns, например). В Hairpin NAT, описанном в Wiki, в правилах NAT необходимо указывать внешний IP, что неприемлемо, когда он часто меняется. Поразмыслив, я придумал следующее "идеальное" решение, объединившее оба способа в один:

/ip dns static
add address=192.168.88.1 name=myname.dyndns.org

/ip firewall nat
add action=masquerade chain=srcnat comment="defconf: masquerade" out-interface=ether1-gateway (это стандартный маскарадинг, обычно присутствующий в конфигурации по умолчанию)

add action=dst-nat chain=dstnat comment=RDP dst-address-type=local dst-port=3389 protocol=tcp to-addresses=192.168.88.2
add action=masquerade chain=srcnat dst-address=192.168.88.2 dst-port=3389 out-interface=bridge-local protocol=tcp src-address=192.168.88.0/24
(по 2 таких строчки на каждый порт-форвардинг)

Т.е. прописываем в статический DNS сопоставление доменному имени внутреннего IP адреса роутера (а не внутреннего ресурса!). Любой клиент внутри сети будет попадать на роутер по доменному имени.
Прописываем по 2 правила для каждого форвардинга - одно для маппинга, второе для маскарадинга. Таким образом мы избавляемся от необходимости непременно указывать внешний IP адрес в правилах NAT, который у нас часто меняется.

Такой подход проверен и успешно работает в моей сети. Он более универсален, чем описанные ранее, поэтому я решил поделиться опытом, может кому пригодится.
Ответ написан
sizaik
@sizaik
сисадмин, Витебск
На самом деле с DNS самый простой вариант, я не понимаю, почему он вам не подходит.
Скрипт (если вы пользуете первый вариант) никак не связан с локальным DNS - он только проверяет, изменился ли внешний IP и отправляет его на DynDNS, если поменялся.
Второй вариант может не работать потому что использует команду resolve без аргументов - значит, по умолчанию пытается разрешить имя на том же роутере, а роутер выдает внутренний адрес 192.168.1.10. Чтобы избежать этого, надо применять resolve с явным указанием внешнего DNS-сервера. Это делается вот так:
:resolve "www.mikrotik.com" server=77.88.8.8
Что касается дополнительной донастройки DNS на машинах в локальной сети - ну так вы можете раздавать их через DHCP. И вообще не очень понятно, какая дополнительная донастройка нужна, если у вас роутер прописан в качестве DNS-сервера.
Ответ написан
@LionG
Задался этим же вопросом и нашел решение на правилах без скриптов и тп...

add action=masquerade chain=srcnat out-interface=wan
add action=masquerade chain=srcnat dst-address=192.168.10.0/24 out-interface=local-bridge src-address=192.168.10.0/24


Проброс порта:
add action=dst-nat chain=dstnat dst-address=!192.168.10.1 dst-address-type=local dst-port=80 protocol=tcp to-addresses=192.168.10.10 to-ports=80


wan - внешний интерфейс
local-bridge - мост локалки
192.168.10.0/24 - локалка
192.168.10.10 - локальный адрес сервера
192.168.10.1 - default gateway
Ответ написан
Комментировать
@bukass
add action=dst-nat chain=dstnat dst-port=8080 in-interface=ether1-gateway protocol=tcp \
    to-addresses=192.168.88.247 to-ports=80


Просто не указывай адрес - только порт, протокол, интерфейс.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы