A chave para o problema é que dstnat
é processado antes de srcnat
. Se um dado passou por dstnat
, então, e somente então, as regras srcnat funcionarão.
Aqui está a configuração que faz o NAT Hairpin funcionar:
/ip firewall nat> print
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; Hairpin NAT
chain=srcnat action=masquerade protocol=tcp src-address=192.168.0.0/24
dst-address=192.168.0.0/24 out-interface=bridge-local log=no log-prefix=""
1 ;;; NAT masquerade for outgoing connections
chain=srcnat action=masquerade out-interface=ether1-gateway log=no log-prefix=""
2 ;;; HTTP
chain=dstnat action=netmap to-addresses=192.168.0.150 to-ports=80 protocol=tcp
dst-address=76.35.222.205 dst-address-type=local dst-port=81 log=no log-prefix=""
76.35.222.205
é um endereço falso que representa meu endereço IP externo. Eu tentei trabalhar sem ele, mas experimente vários segundos de atraso ao usar o Hairpin NAT.
- A regra 0 garante que a resposta seja retornada para a máquina interna que enviou uma solicitação.
- A regra 1 é um masquerade NAT convencional usado com ou sem NAT Hairpin
- A regra 2 é o encaminhamento de porta, independentemente de onde a conexão foi iniciada.
Ao solicitar um servidor HTTP local de dentro, a regra 2 funciona primeiro, depois a regra 0.
Também pode ser que algo esteja errado nas regras do filtro.