El puerto parece estar abierto, pero la conexión se ha rechazado.

21

Estoy tratando de abrir el puerto 3000 en Ubuntu 12.04, porque tengo un servidor web escuchando allí. Estoy un poco fuera de mi zona de confort aquí, y pasé muchas horas tratando de resolver el problema sin éxito.

El puerto parece estar abierto en el firewall:

$> sudo ufw status
Status: active

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

El servidor está escuchando bien en ese puerto:

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

E incluso puedo wgetdejar la página de índice:

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

Y el archivo recibido contiene lo que espero ("hola mundo" :).

Sin embargo, cuando intento desde otra computadora, o si wget mydomain.com:3000obtengo "connection refused", y nmap me dice que el puerto no está abierto:

$> 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

¿Alguna idea de lo que debería probar a continuación?

EDITAR

Esto es lo que da traceroute:

$> 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
fuente
Deshabilite ufw, intente nuevamente. Si eso no funciona, hay otro firewall / dispositivo entre la computadora remota y su servidor.
ish
Ya lo intenté ... no lo resolvió :(
sebpiq
"hay otro firewall / dispositivo entre la computadora remota y su servidor". : esto es muy poco probable. Probé el segundo wget del servidor para que haga un viaje de ida y vuelta por la red.
sebpiq
eh? No puede escribir wget serverseb.com desde serverseb y hacer que realice un viaje de ida y vuelta sin un poco de magia de enrutamiento de iptables. Pegue la salida de traceroute mydomain.comla computadora remota. Puede ** eliminar los dos últimos octetos de la última IP (servidor) por privacidad.
ish
editado con un traceroute
sebpiq

Respuestas:

24

Si su servidor está escuchando solo en la interfaz localhost, no podrá acceder desde una computadora remota. Este parece ser su problema principal, ya que solo 127.0.0.1:3000 aparece en su salida de netstat.

También deberá asegurarse de que "mydomain.com" se resuelva en la dirección IP correcta para su máquina, de modo que la conexión a esta resulte en una comunicación con la interfaz externa de esa máquina.

dobey
fuente
Puedo enviar ssh a la máquina usando su nombre, así que supongo que la resolución del nombre no es el problema aquí. ¿Cómo puedo hacer para que el servidor escuche desde cualquier lugar?
sebpiq
1
@sebpiq Esta resolución es específica del programa. Debe vincular el oyente del programa a la interfaz correcta por nombre { eth0, o algo así), dirección IP (192.168.1.99, o algo así), o la dirección MAC. Esto depende del programa.
Restablece a Mónica - ζ--
uugh ... suena loco: S Trataré de buscar en Google sobre eso. Mi servidor es node.js, así que comprobaré si hay información sobre a qué interfaz necesito conectarme.
sebpiq
Yeepee !!! @ObsessiveFOSS y dobey muchas gracias! Mi servidor node.js en realidad solo estaba escuchando en localhost. No sabía que estaba haciendo así, y ninguno de los tutoriales mencionó eso.
sebpiq
@sebpiq No hay problema. :-)
Reinstate Monica - ζ--
13

Recientemente tuve este problema con un servidor HTTPS de nodejs, y la solución fue no usar "localhost", "127.0.0.1" o incluso el nombre de dominio. Fue para usar "0.0.0.0"

Creo que esto actúa como un comodín, ahora permite la resolución pública a través del nombre de dominio y también funciona con "localhost"

Editar: Aquí hay un enlace a una página predeterminada del servidor sobre el tema 0.0.0.0: /server/78048/whats-the-difference-between-ip-address-0-0-0-0-and- 127-0-0-1

Sami Fouad
fuente
Utilice "0.0.0.0" donde exactamente?
Adaephon
@Adaephon Bueno, en mi caso, creé un servidor web basado en Node. Tuve que cambiar: }).listen(3000, '127.0.0.1'); a }).listen(3000, '0.0.0.0'); en mi código.
Sami Fouad el
@Adaephon Entonces, no estoy seguro de cuánta ayuda fue, pero donde sea que esté definiendo la IP / Nombre de host, intente 0.0.0.0.
Sami Fouad
¿puedes visitar mi publicación? stackoverflow.com/questions/37922804/…
Kar19
1
0.0.0.0 (o más bien la representación binaria 0) se considera que escucha a todos desde el punto de vista de la interfaz del socket. Puede dar otra IP y solo escuchará la interfaz donde tiene esa IP. Por ejemplo, si proporciona 127.0.0.1, solo puede recibir conexiones de las 127. *. *. * IP (localhost realmente), o de otras computadoras con tablas de enrutamiento seriamente fallidas que accederían a las suyas para 127.0.0.1 (para probar esto último caso!)
Paul Stelian
3

¿Existe alguna posibilidad de que esté utilizando AWS o algún otro servicio en la nube? En ese caso, el puerto debe abrirse en el nivel de configuración de incance (OS) o posterior. En particular, en AWS debe buscar "Grupos de seguridad" donde debe abrir el acceso al puerto 3000

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