A porta parece estar aberta, mas a conexão foi recusada

21

Estou tentando abrir a porta 3000 no Ubuntu 12.04, porque tenho um servidor web ouvindo lá. Estou um pouco fora da minha zona de conforto aqui e passei muitas horas tentando resolver o problema sem sucesso.

A porta parece estar aberta no firewall:

$> sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
3000/tcp                   ALLOW       Anywhere
3000/tcp                   ALLOW       Anywhere (v6)

O servidor está escutando bem nessa porta:

$> netstat -an | grep "LISTEN "
...
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN     
...

E eu posso até wgetficar bem na página de índice:

$> wget localhost:3000
Connecting to localhost (localhost)|127.0.0.1|:3000... connected.
HTTP request sent, awaiting response... 200 OK

E o arquivo recebido contém o que eu espero ("olá mundo" :).

No entanto, ao tentar em outro computador, ou se wget mydomain.com:3000eu receber "connection refused", e o nmap me diz que a porta não está aberta:

$> nmap -A -T4 mydomain.com
Host is up (0.00032s latency).
...
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)
...
Service Info: OS: Linux

Alguma idéia do que devo tentar a seguir ???

EDITAR

Aqui está o que o traceroute fornece:

$> traceroute mydomain.com
traceroute to mydomain.com (176.31.x.x), 30 hops max, 60 byte packets
 1  mydomain.com (176.31.x.x)  0.034 ms  0.013 ms  0.010 ms
sebpiq
fonte
Desative o ufw, tente novamente. Se isso não funcionar, há outro firewall / dispositivo entre o computador remoto e o servidor.
Ish
Eu já tentei .. não resolvê-lo :(
sebpiq
"existe outro firewall / dispositivo entre o computador remoto e o seu servidor." : isso é muito improvável. Eu tentei o segundo wget do servidor para que ele faça uma viagem de ida e volta pela rede.
sebpiq
Hã? Você não pode digitar wget serverseb.com a partir de serverseb e fazer com que ele faça uma viagem de ida e volta sem alguma mágica sofisticada de roteamento de tabelas de ip. Cole a saída do traceroute mydomain.comcomputador remoto. Você pode ** out os dois últimos octetos do último IP (servidor) para privacidade.
Ish
editado com um traceroute
sebpiq 20/07/12

Respostas:

24

Se o servidor estiver escutando apenas na interface do host local, você não poderá acessá-lo em um computador remoto. Esse parece ser o seu principal problema, pois apenas 127.0.0.1:3000 está listado na sua saída netstat.

Você também precisará garantir que "mydomain.com" resolva para o endereço IP correto da sua máquina, para que a conexão a ela resulte em comunicação com a interface externa dessa máquina.

dobey
fonte
Posso ssh na máquina usando seu nome, então acho que a resolução de nomes não é o problema aqui. Como posso fazer para que o servidor escute de qualquer lugar?
sebpiq
1
@sebpiq Esta resolução é específica do programa. Você precisa vincular o ouvinte do programa à interface correta pelo nome { eth0ou algo assim), endereço IP (192.168.1.99 ou algo assim) ou pelo endereço MAC. Isso depende do programa.
Reinstate Monica - ζ--
uugh ... parece insano: S Vou tentar pesquisar no google sobre isso. Meu servidor é node.js, então vou verificar se há informações sobre a qual interface eu preciso me conectar.
sebpiq
Yeepee !!! @ObsessiveFOSS e dobey muito obrigado! Meu servidor node.js estava apenas ouvindo no localhost. Eu não sabia que estava fazendo assim, e nenhum tutorial mencionou isso.
sebpiq
@sebpiq Sem problemas. :-)
Restabelece Monica - ζ--
13

Recentemente, tive um problema com um servidor HTTPS do nodejs, e a solução foi não usar "localhost", "127.0.0.1" ou mesmo o nome de domínio. Era para usar "0.0.0.0"

Eu acredito que isso funciona como um curinga, agora permitindo a resolução pública por meio do nome de domínio e também funciona com "localhost"

Edit: Aqui está um link para uma página de falha do servidor no tópico 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127-0-0-1

Sami Fouad
fonte
Use "0.0.0.0" onde exatamente?
Adaephon
@Adaephon Bem, no meu caso, criei um servidor Web baseado em Nó. Eu tive que mudar: }).listen(3000, '127.0.0.1'); para }).listen(3000, '0.0.0.0'); no meu código.
Sami Fouad
@ Adaephon Então, não tenho certeza de quanta ajuda isso foi, mas onde quer que você esteja definindo o IP / nome do host, tente o 0.0.0.0.
Sami Fouad
você pode visitar meu post? stackoverflow.com/questions/37922804/...
Kar19
1
0.0.0.0 (ou melhor, a representação binária 0) é considerada como ouvindo todos do ponto de vista da interface do soquete. Você pode dar outro IP e ele ouvirá apenas a interface em que você tem esse IP. Por exemplo, se você fornecer 127.0.0.1, poderá receber apenas conexões dos IPs 127. *. *. * (Localhost realmente) ou de outros computadores com tabelas de roteamento seriamente danificadas que acessariam o seu para 127.0.0.1 (para testar isso último caso!)
Paul Stelian
3

Existe alguma chance de você estar usando a AWS ou qualquer outro serviço em nuvem? Nesse caso, a porta deve ser aberta no nível de configuração da instância (SO) ou depois. Em particular na AWS, você deve procurar "Grupos de Segurança", onde deve abrir o acesso à porta 3000

Гдето Якутский
fonte