O problema não está no roteador. O roteador faz o que foi configurado para - ele traduz o destino de tráfego a.b.c.d: portxx para o seu servidor linux. Não funciona, mas para entender, você tem que ver o que acontece na rede. Por exemplo, seu servidor linux é 192.168.1.2 e seu roteador é 192.168.1.1 em sua rede LAN
- Do servidor você envia um pacote
- src 192.168.1.2:1024 dst a.b.c.d: portxx
- no roteador é feita a tradução (de volta ao servidor)
- src 192.168.1.2:1024 dst 192.168.1.2:portxx
- pacote chega ao aplicativo do servidor, ele responde - e envia o pacote de resposta
- src 192.168.1.2:portxx dst 192.168.1.2:1024
- o pacote vem (permanece) no servidor para a aplicação cliente, mas esta conexão não é conhecida, porque você inicia a conexão com a.b.c.d e tem uma resposta de 192.168.1.2 e não de (a.b.c.d) - o pacote é descartado.
Então possível solução:
1) no roteador, se você puder, configure o SNAT do pacote que vem da rede local para o seu ip público NAT. Se você tem um roteador linux, tente algo
iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d a.b.c.d -j SNAT --to-source 192.168.1.1
Você alterou o endereço do pacote de origem para o pacote passando pelo roteador da rede interna, a resposta do aplicativo do servidor de volta para 192.168.1.1 e a regra SNAT ao receber a resposta, mapeou corretamente o pacote para o aplicativo cliente no servidor. Esta solução funciona para todos os computadores da rede interna, mas no servidor você vê todos os pedidos vindos do endereço do roteador 192.168.1.1.
2) No servidor, você pode fazer o tráfego REDIRECT pelo iptables
iptables -t nat -I OUTPUT -d a.b.c.d -p tcp --dport portxx -j REDIRECT --to-ports portxx
Ele redireciona a conexão de saída do seu servidor para a porta local no servidor. Acho que essa pode ser a melhor solução para o seu caso
3) Adicionar o endereço a.b.c.d no servidor pode ser uma solução para alguns casos, mas às vezes o daemon do servidor (e é específico do aplicativo) não escuta em todos os endereços IP ou dá outra resposta para outro endereço.
4) Se você estiver usando nomes de host e não endereço IP, você pode redefinir / etc / hosts no servidor linux - isso é mais fácil e às vezes ajuda (retorno DNS: linuxserver abcd) assim em / etc / hosts você escreve linha
192.168.1.2 linuxserver
E a conexão do servidor linux para o "linuxserver" vai diretamente para 192.168.1.2