Eu tenho um roteador com um determinado ip estático a.b.c.d
conectado 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:portxx
funciona bem.
Porém, se um navegador aberto por alguém do próprio servidor tentar acessar o mesmo software, a.b.c.d:portxx
ele falhará. Tentar localhost:portxx
novamente 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/hosts
ou algum outro mecanismo no servidor, algum pacote pode a.b.c.d
ser 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