¿Cuáles pueden ser las razones de los errores de conexión rechazada?

114

Estoy tratando de escribir un programa de servidor en C, usando otro cliente, obtengo este error cuando intento conectarme a través del puerto 2080, por ejemplo.

connection refused

¿Cuáles pueden ser las razones de este error?

Zenet
fuente
Recibí este error debido a un error del servidor donde alojo mi sitio web. El servidor aún podría editarseping , downforeveryoneorjustme.com mostró que no soy solo yo y que también puedo acceder a él a través de FTP. Después de un par de minutos se resolvieron los errores.
Martin Thoma
2
@moose: ping no le dice si un puerto específico es accesible para escuchar anuncios, solo si la dirección IP es accesible. Pero connect()depende de que una IP y un puerto específicos estén listos para su uso.
Remy Lebeau
Server Fault tiene una pregunta canónica sobre Connection Refused .
Raedwald
Aquí hay una explicación sucinta de Conexión rechazada .
rbinnun
Recibí una conexión rechazada en Ubuntu porque estaba tratando de recibir una conexión en 'localhost' pero 'localhost' no estaba configurado correctamente en mi máquina. Cambiar 'localhost' a '' (Python) resolvió el problema.
user1097111

Respuestas:

93

Puede haber muchas razones, pero las más comunes son:

  1. El puerto no está abierto en la máquina de destino.

  2. El puerto está abierto en la máquina de destino, pero su acumulación de conexiones pendientes está llena.

  3. Un firewall entre el cliente y el servidor está bloqueando el acceso (también verifique los firewalls locales).

Después de verificar si hay firewalls y que el puerto está abierto, use telnet para conectarse a la ip / puerto para probar la conectividad. Esto elimina cualquier problema potencial de su aplicación.

Arkansas
fuente
7
Los cortafuegos normalmente darían errores de tiempo de espera, ya que el paquete de conexión (SYN) simplemente se descarta. La conexión rechazada se debe a que el servidor ha recibido y rechazado el paquete SYN.
RedPandaCurios
15
No siempre, ya que los firewalls pueden configurarse para rechazar los paquetes en lugar de descartarlos.
2010
connect () con una configuración incorrecta de la dirección IP del servidor y el número de puerto en el programa cliente también dará como resultado el
error
Además: cuando necesite acceder a https, pero haya especificado http: // ... este error también puede ocurrir.
Fico
4
@ a'r ¿Cómo sabría el estado de la cartera de pedidos?
Naveen Verma
75

El error significa que el sistema operativo del socket de escucha reconoció la solicitud de conexión entrante pero eligió rechazarla intencionalmente.

Suponiendo que un firewall intermedio no se interponga en el camino, solo hay dos razones (que yo conozca) para que el sistema operativo rechace una solicitud de conexión entrante. Ya se ha mencionado varias veces una razón: el puerto de escucha al que está conectado no está abierto.

Hay otra razón que aún no se ha mencionado: el puerto de escucha está realmente abierto y se está utilizando activamente, pero su acumulación de solicitudes de conexión entrante en cola ha alcanzado su máximo, por lo que no hay espacio disponible para que la solicitud de conexión entrante se ponga en cola en ese momento. El código del servidor aún no ha llamado a accept () suficientes veces para terminar de limpiar los espacios disponibles para nuevos elementos de la cola.

Espere un momento y vuelva a intentar la conexión. Desafortunadamente, no hay forma de diferenciar entre "el puerto no está abierto en absoluto" y "el puerto está abierto pero demasiado ocupado en este momento". Ambos usan el mismo código de error genérico.

Remy Lebeau
fuente
4
También hay un caso de borde como se explica aquí: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . Básicamente, si está realizando pruebas de estrés en su aplicación cliente / servidor, y está utilizando el enfoque ingenuo como se menciona en 3.6, puede ocurrir un error de "conexión rechazada", y es un caso diferente de los dos anteriores.
ernesto
Esto necesita ser votado a favor. Una vez que se ha resuelto la causa obvia (nada escuchando), esta es en realidad la explicación más probable, y solucionarlo puede ser un asunto complejo.
Graham Nicholls
Si la acumulación de solicitudes entrantes en cola ha alcanzado su máximo, ¿cómo podemos solucionarlo?
ACarter
¿Hay un backlog en cola por IP? Intenté usar telnet email-smtp.eu-west-1.amazonaws.com 25 desde una instancia EC2 y mi máquina local, la llamada de telnet de la instancia EC2 está dando conexión rechazada mientras que desde mi máquina local funciona
dresh
"No hay nada escuchando" probablemente se deba a que la máquina está funcionando pero el servidor (software), por ejemplo, Apache no se está ejecutando.
ttulinsky
24

Si intenta abrir una conexión TCP a otro host y ve el error "Conexión rechazada", significa que

  1. Envió un paquete TCP SYN al otro host.
  2. Luego recibió un paquete TCP RST en respuesta.

RST es un bit en el paquete TCP que indica que la conexión debe restablecerse. Por lo general, significa que el otro host ha recibido su intento de conexión y está rechazando activamente su conexión TCP, pero a veces un cortafuegos intermedio puede bloquear su paquete TCP SYN y enviarle un TCP RST.

Consulte https://tools.ietf.org/html/rfc793 página 69:

ESTADO SYN-RECIBIDO

Si el bit RST está establecido

Si esta conexión se inició con un OPEN pasivo (es decir, vino del estado LISTEN), regrese esta conexión al estado LISTEN y regrese. No es necesario informar al usuario. Si esta conexión se inició con un OPEN activo (es decir, provenía del estado SYN-SENT), la conexión fue rechazada, indique al usuario "conexión rechazada". En cualquier caso, deben eliminarse todos los segmentos de la cola de retransmisión. Y en el caso ABIERTO activo, ingrese al estado CERRADO y elimine el TCB, y regrese.

James Brock
fuente
11

Conexión rechazada significa que el puerto al que está intentando conectarse no está realmente abierto.

Entonces, o se está conectando a la dirección IP incorrecta o al puerto incorrecto, o el servidor está escuchando en el puerto incorrecto, o no se está ejecutando.

Un error común es no especificar el número de puerto al enlazar o conectar en orden de bytes de red ...

RedPandaCurios
fuente
4
Esta es solo una de las posibles condiciones que pueden causar el error.
Remy Lebeau
1
El puerto podría estar abierto, pero este error aún podría ocurrir.
IgorGanapolsky
6

Verifique en el lado del servidor que esté escuchando en el puerto 2080. Primero intente confirmarlo en la máquina del servidor emitiendo telnet a ese puerto:

telnet localhost 2080

Si está escuchando, puede responder.

Adil
fuente
3

1. Verifique el estado de su servidor.

2.Compruebe el estado del puerto.

Por ejemplo 3306 netstat -nupl|grep 3306 .

3. Verifique sus firewalls. Por ejemplo, agregue 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
Jack Sun
fuente
netstat -a ayudó
Philip
1

Aunque no parece ser el caso para su situación, a veces un error de conexión rechazada también puede indicar que hay un conflicto de dirección IP en su red. Puede buscar posibles conflictos de IP ejecutando:

 arp-scan -I eth0 -l | grep <ipaddress>

y

arping <ipaddress>

Esta pregunta de AskUbuntu también tiene más información.

Instantánea
fuente
0

Desde el punto de vista de un cortafuegos de Checkpoint, verá un mensaje del cortafuegos si realmente elige Rechazar como una acción, exponiendo así a un posible atacante la presencia de un cortafuegos delante del servidor. El firewall eliminará silenciosamente todas las conexiones que no coincidan con la política. La conexión rechazada casi siempre proviene del servidor

Julio Nalundasan
fuente
0

Tengo el mismo problema con la computadora de mi trabajo. El problema es que cuando ingresa localhost, va a la dirección del proxy, no a la dirección local, debe omitirlo, siga estos pasos

Chrome => Configuración => Cambiar configuración de proxy => Configuración de LAN => marque Omitir servidor proxy para direcciones locales.

İbrahim Özbölük
fuente
0

En Ubuntu, intente sudo ufw allow <port_number> permitir el acceso del firewall tanto a su servidor como a su base de datos.

rajeeva9
fuente
0

Intente pasar el parámetro de puerto "-p":

sudo iperf -c 127.0.0.1 -p 443
Wellington 1993
fuente
0

En mi caso, sucede cuando el sitio está bloqueado en mi país y no uso VPN. Por ejemplo, cuando intento acceder a vimeo.com desde Indonesia, que está bloqueado.

Aminah Nuraini
fuente
-1

Recibí el mismo mensaje con una causa totalmente diferente: wsock32.dllno se encontró. La ::socket(PF_INET, SOCK_STREAM, 0);llamada seguía devolviendo un INVALID_SOCKETpero la razón era que la dll de winsock no estaba cargada.

Al final, lancé el monitor de proceso de Sysinternals y noté que buscaba el dll 'en todas partes' pero no lo encontraba.

¡Los fallos silenciosos son geniales!

xtofl
fuente
1
INVALID_SOCKET no tiene nada que ver con 'conexión rechazada'. Las 'fallas silenciosas' solo pueden ocurrir si a su código le falta el manejo de errores requerido.
Marqués de Lorne
1
¿Quiere decir que debería haber comprobado que se cargó el dll? probablemente tengas razón.
xtofl