Como fazer um ServerSocket funcionar através de um Roteador?

2 respostas
tiagomac

Olá Pessoal,

Eu pesquisei sobre o assunto antes, pois não acredito que ninguém tenha passado por esse problema, já que muita gente acessa a internet através de um roteador. Aqui no GUJ eu encontri esse post: http://www.guj.com.br/posts/list/106049.java, entendi o problema do snoop, mas é diferente do meu…

Então, eu criei um programa de chat que funciona perfeitamente em loopback (127.0.0.1), pois o mesmo não chega a acessar a placa de rede etc… é tudo local. mas quando eu tento acessar do client pelo IP Externo (o ip do roteador) ele não vai de jeito nenhum…

O ServerSocket está “pegando” a porta 33333, que já configurei no roteador para encaminhar para minha máquina (10.1.1.11)… até ai tudo bem, ele deveria encaminhar… mas eu sinto que a aplicação java, o server socket não está conseguindo abrir essa porta (consumir esse serviço)… tipo, fiz a regra NAT usando RDR, e pesquisando eu descobri que o RDR não mantém a porta o tempo todo aberta, ele apenas abre quando um serviço solicita… no caso esse serviço seria meu servidor escrito em Java… ai vem a parte engraçada, qdo eu dou um serverSocket.accept() normal, ele pega a porta e abre na máquina local… mas no roteador não… então para quem tá de fora e tenta acessar pelo IP externo, essa porta está fechada :shock: …

Obs. também tentei configurar o NAT em BIMAP (redirecionando todas as portas) e também não funcionou.
Obs2. Firewall do windows está desligado, sem antivírus ou qualquer outro bloqueio…
Obs3. Tentei realizar um Bind no ServerSocket através do InetAddress externo: InetAddress add = InetAddress.getByName("189.176.54.164"); serverSocket.bind(new InetSocketAddress(add, 33333)); e também não foi… ele me retorna um: java.net.BindException: Cannot assign requested address: JVM_Bind

Não sei se ficou meio confuso, caso tenha ficado me avisem q tento detalhar mais…
se alguém conseguio fazer um serverSocket funcionar através de um roteador, porfavor, me socorre *rs!

Abraços.

2 Respostas

T

a) Você não precisa fazer esse “bind” que você forçou com esse IP.
b) Pode ser que a porta 33333 (por exemplo) esteja fechada no seu provedor. Para confirmar que portas estão fechadas, vá para o site http://www.grc.com , e vá para a parte do “Shields Up”. (Deixe o seu programa atendendo na 33333 também).
O link é https://www.grc.com/x/ne.dll?bh0bkyd2 (mas não sei se ele vai mudar esse link).
Clique em Proceed, e então escolha uma opção (pode ser “All service ports”, que vai lhe mostrar que portas o site www.grc.com consegue acessar na sua máquina entre 0 e 1055, ou então “user specified custom probe”, que vai testar só as portas que você quer.

tiagomac

Então thingol,

Fui no site que você mencionou e mandei testar a porta que a aplicação está rodando (33333) e o resultado foi esse:

33333 Stealth Unknown Protocol for this port Unknown Application for this port

Sendo que abre o ServerSocket com o serverSocket.accept(33333); sem utilizar bind ou setar ip, como você falou…

então, localmente a porta está aberta, em loopback, funciona… o modem está redirecionando as chamadas nessa porta para o meu ip local (10.1.1.11)… então pq não consigo acessar pelo ip externo???

abraços!

Criado 27 de janeiro de 2009
Ultima resposta 28 de jan. de 2009
Respostas 2
Participantes 2