У меня уже возникали подобные проблемы с другими роутерами, что приводило к сложностям при хостинге Warcraft III игр на нашем локальном сервере PvPGN. В итоге я написал патч для сервера PvPGN, где хостеры игры могут указать свой LAN IP-адрес, чтобы не приходилось использовать маскировку, когда к серверу подключаются игроки из той же локальной сети. Конечно, патч работал только в том случае, если игроки использовали один и тот же WAN-интерфейс для подключения к серверу. Вот моя версия решения hairpin NAT от pragmat, с несколькими добавленными преимуществами:
/ip firewall mangle
0 ;;; Mark new hairpin connections
chain=prerouting action=mark-connection new-connection-mark=hairpin
passthrough=no connection-state=new src-address=192.168.10.0/24
dst-address=!192.168.10.0/24 dst-address-type=local
/ip firewall nat
0 ;;; NAT - WAN 1
chain=srcnat action=masquerade src-address=192.168.10.0/24
out-interface=WAN-1
1 ;;; NAT - WAN 2
chain=srcnat action=masquerade src-address=192.168.10.0/24
out-interface=WAN-2
2 ;;; NAT - Hairpin
chain=srcnat action=masquerade connection-mark=hairpin
3 ;;; Jump to Port-forward chain with incoming connections from WAN 1
chain=dstnat action=jump jump-target=Port-forward
in-interface=WAN-1
4 ;;; Jump to Port-forward chain with incoming connections from WAN 2
chain=dstnat action=jump jump-target=Port-forward
in-interface=WAN-2
5 ;;; Jump to Port-forward chain with hairpin connections
chain=dstnat action=jump jump-target=Port-forward
connection-mark=hairpin
6 ;;; Port Forward - FTP, HTTP & HTTPS Server
chain=Port-forward action=dst-nat to-addresses=192.168.10.10
protocol=tcp dst-port=21,80,443
7 ;;; Port Forward - PvPGN Server
chain=Port-forward action=dst-nat to-addresses=192.168.10.11
protocol=tcp dst-port=6112
Основные отличия между моим и решением pragmat:
* Мой вариант не будет осуществлять NAT для трафика в локальной сети, если адрес назначения не является локальным адресом.
* Мой вариант требует только одной записи для переадресации портов, а не одной для hairpin NAT и одной для переадресации портов из WAN в локальную сеть.
Я добавил 2 WAN-интерфейса, и оба используют общие записи dst-nat.
Заметки:
Я не уверен, будет ли моя маркировка соединения работать и для UDP-соединений. Буду признателен, если кто-нибудь подскажет, будет ли она работать или нет!
Как несколькоi mentioned ранее: маскировка локальных IP-адресов к локальному серверу может нарушить отслеживание локальных пользователей. Предпочтительное решение — использовать DNS, где ваш внутренний DNS-сервер отвечает локальным клиентам локальным IP-адресом, но в некоторых случаях (например, как выше, с сервером PvPGN), когда это не работает с DNS-записями, вам нужно использовать решение hairpin NAT ИЛИ патчить приложение.
@TheMG, не могли бы вы, возможно, сказать, почему вы хотите ограничить переадресацию портов до определенного WAN-порта? Также, вы говорите об ограничении hairpin NAT до определенного WAN-порта или о переадресации портов из интернета на определенный WAN-порт?
Если вам просто нужно ограничить переадресацию портов до одного WAN-порта из интернета и вы используете мое решение, то просто удалите правило №3 или №4 в моем примере.
Было бы довольно сложно ограничить hairpin NAT до определенного WAN-интерфейса, если WAN-интерфейс имеет динамический IP-адрес! Тогда вам, вероятно, придется написать скрипт для обновления правил, как скрипты, используемые для обновления DynDNS.