Faça com que o servidor Linux roteie pacotes destinados ao seu ip externo para localhost

Faça com que o servidor Linux roteie pacotes destinados ao seu ip externo para localhost

Eu tenho um roteador com um determinado ip estático a.b.c.dconectado a um servidor Linux de um lado e à internet do outro.

Acessar um software instalado no servidor Linux de fora usando o endereço IP a.b.c.d:portxxfunciona bem.

Porém, se um navegador aberto por alguém do próprio servidor tentar acessar o mesmo software, a.b.c.d:portxxele falhará. Tentar localhost:portxxnovamente funciona bem.

Então meu diagnóstico é que o roteador DSL está sendo burro e não percebendo que a.b.c.dé ele mesmo.

Existe uma maneira de consertar isso, de preferência sem alterar nada no roteador? ou seja, Through /etc/hostsou algum outro mecanismo no servidor, algum pacote pode a.b.c.dser redirecionado localhost?

É provável que isso quebre mais alguma coisa?

Responder1

O problema não está no roteador. O roteador faz o que foi configurado - traduz o destino do tráfego abcd:portxx para o seu servidor Linux. Não funciona, mas para entender é preciso ver o que acontece na rede. Por exemplo, seu servidor Linux é 192.168.1.2 e seu roteador é 192.168.1.1 na sua rede LAN

  • Do servidor você envia pacotes
  • src 192.168.1.2:1024 dst abcd: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 (fica) na aplicação servidor para cliente, mas essa conexão não é conhecida, pois você inicia a conexão com o abcd e tem uma resposta de 192.168.1.2 e não de (abcd) - o pacote é descartado.

Solução tão possível:

1) no roteador, se puder, defina o SNAT do pacote vindo da rede local para o seu ip público NAT. Se você possui 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 passar 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, mapeie corretamente o pacote de volta para o seu aplicativo cliente no servidor. Esta solução funciona para todos os computadores da rede interna, mas no servidor você vê todas as solicitações provenientes do endereço do roteador 192.168.1.1.

2) No servidor, você pode fazer REDIRECT tráfego 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 do servidor.Eu acho que esta poderia ser a melhor solução para o seu caso

3) Adicionar o endereço abcd no servidor pode ser a solução para alguns casos, mas às vezes o daemon do servidor (e é específico da aplicação) não escuta 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 de DNS: linuxserver abcd) então em /etc/hosts você escreve a linha

192.168.1.2 linuxserver

E a conexão do servidor Linux para "linuxserver" vai diretamente para 192.168.1.2

informação relacionada