Quelles peuvent être les raisons des erreurs de connexion refusées?

114

J'essaie d'écrire un programme serveur en C, en utilisant un autre client, j'obtiens cette erreur lorsque j'essaye de me connecter via le port 2080 par exemple.

connection refused

Quelles peuvent être les raisons de cette erreur?

Zenet
la source
Je viens de recevoir cette erreur, à cause d'une erreur du serveur sur lequel j'héberge mon site Web. Le serveur pouvait encore être pingédité, downforeveryoneorjustme.com a montré que ce n'est pas seulement moi et que je pourrais aussi y accéder via FTP. Après quelques minutes, les erreurs ont été résolues.
Martin Thoma
2
@moose: ping ne vous dit pas si un port spécifique est accessible en écoute publicitaire, mais uniquement si l'adresse IP est accessible. Mais cela connect()dépend d'une adresse IP et d'un port spécifiques prêts à être utilisés.
Remy Lebeau
Server Fault a une question canonique sur la connexion refusée .
Raedwald
Voici une explication succincte de Connection Refused .
rbinnun
J'ai eu une connexion refusée sur Ubuntu parce que j'essayais de recevoir une connexion sur 'localhost' mais 'localhost' n'était pas correctement configuré sur ma machine. Changer 'localhost' en '' (Python) a résolu le problème.
user1097111

Réponses:

93

Il peut y avoir de nombreuses raisons, mais les plus courantes sont:

  1. Le port n'est pas ouvert sur la machine de destination.

  2. Le port est ouvert sur la machine de destination, mais son arriéré de connexions en attente est plein.

  3. Un pare-feu entre le client et le serveur bloque l'accès (vérifiez également les pare-feu locaux).

Après avoir vérifié les pare-feu et que le port est ouvert, utilisez telnet pour vous connecter à l'ip / port pour tester la connectivité. Cela supprime tous les problèmes potentiels de votre application.

a'r
la source
7
Les pare-feu donneraient normalement des erreurs de temporisation, car le paquet de connexion (SYN) est simplement rejeté. La connexion refusée est due au fait que le serveur a reçu et rejeté le paquet SYN.
RedPandaCurios
15
Pas toujours, car les pare-feu peuvent être configurés pour rejeter plutôt que pour abandonner les paquets.
a'r
connect () avec une adresse IP de serveur et une configuration de numéro de port incorrectes dans le programme client entraînera également un
numéro d'erreur
De plus: lorsque vous devez accéder à https, mais que vous avez spécifié http: // ... cette erreur peut également survenir.
Fico
4
@ a'r Comment sauriez-vous l'état de l'arriéré?
Naveen Verma
75

L'erreur signifie que le système d'exploitation du socket d'écoute a reconnu la demande de connexion entrante mais a choisi de la rejeter intentionnellement.

En supposant qu'un pare-feu intermédiaire ne gêne pas, il n'y a que deux raisons (à ma connaissance) pour que le système d'exploitation rejette une demande de connexion entrante. Une raison a déjà été mentionnée à plusieurs reprises: le port d'écoute auquel vous êtes connecté n'est pas ouvert.

Il y a une autre raison qui n'a pas encore été mentionnée - le port d'écoute est en fait ouvert et activement utilisé, mais son arriéré de demandes de connexion entrante en file d'attente a atteint son maximum, il n'y a donc pas de place disponible pour la demande de connexion entrante à mettre en file d'attente à ce moment. Le code du serveur n'a pas encore appelé accept () suffisamment de fois pour finir de vider les emplacements disponibles pour les nouveaux éléments de file d'attente.

Attendez quelques instants et réessayez la connexion. Malheureusement, il n'y a aucun moyen de faire la différence entre «le port n'est pas du tout ouvert» et «le port est ouvert mais trop occupé en ce moment». Ils utilisent tous les deux le même code d'erreur générique.

Remy Lebeau
la source
4
Il y a aussi un cas de bord comme expliqué ici: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . fondamentalement, si vous testez votre application client / serveur sous tension, et que vous utilisez l'approche naïve comme mentionné dans 3.6, une erreur «connexion refusée» peut se produire, et c'est un cas différent des deux ci-dessus.
ernesto
Cela doit être voté pour. Une fois que la cause évidente (rien d'écoute) a été résolue, alors c'est en fait l'explication la plus probable, et la réparer peut être une question complexe.
Graham Nicholls
si l'arriéré de demandes entrantes en file d'attente a atteint son maximum, comment pouvons-nous résoudre ce problème?
ACarter
un backlog est-il mis en file d'attente par IP? J'ai essayé d'utiliser telnet email-smtp.eu-west-1.amazonaws.com 25 à partir d'une instance EC2 et de ma machine locale, l'appel telnet de l'instance EC2 donne une connexion refusée alors que depuis ma machine locale cela fonctionne
dresh
"rien n'écoute" est probablement dû au fait que la machine est en marche mais que le serveur (logiciel), par exemple Apache, ne fonctionne pas.
ttulinsky
24

Si vous essayez d'ouvrir une connexion TCP vers un autre hôte et que vous voyez l'erreur «Connexion refusée», cela signifie que

  1. Vous avez envoyé un paquet TCP SYN à l'autre hôte.
  2. Ensuite, vous avez reçu un paquet TCP RST en réponse.

RST est un bit sur le paquet TCP qui indique que la connexion doit être réinitialisée. Habituellement, cela signifie que l'autre hôte a reçu votre tentative de connexion et refuse activement votre connexion TCP, mais parfois un pare-feu peut bloquer votre paquet TCP SYN et vous renvoyer un TCP RST.

Voir https://tools.ietf.org/html/rfc793 page 69:

ÉTAT DE RÉCEPTION SYN

Si le bit RST est défini

Si cette connexion a été initiée avec un OPEN passif (c'est-à-dire provenait de l'état LISTEN), remettez cette connexion à l'état LISTEN et revenez. L'utilisateur n'a pas besoin d'être informé. Si cette connexion a été initiée avec un OPEN actif (c'est-à-dire provenant de l'état SYN-SENT) alors la connexion a été refusée, signalez à l'utilisateur "connexion refusée". Dans les deux cas, tous les segments de la file d'attente de retransmission doivent être supprimés. Et dans le cas OPEN actif, entrez dans l'état CLOSED et supprimez le TCB, puis revenez.

James Brock
la source
11

Connexion refusée signifie que le port auquel vous essayez de vous connecter n'est pas réellement ouvert.

Donc, soit vous vous connectez à la mauvaise adresse IP, soit au mauvais port, soit le serveur écoute sur le mauvais port, soit ne fonctionne pas réellement.

Une erreur courante consiste à ne pas spécifier le numéro de port lors de la liaison ou de la connexion dans l'ordre des octets du réseau ...

RougePandaCurios
la source
4
Il ne s'agit que de l'une des nombreuses conditions possibles pouvant provoquer l'erreur.
Remy Lebeau
1
Le port est peut-être ouvert, mais cette erreur peut toujours se produire.
IgorGanapolsky
6

Vérifiez côté serveur qu'il écoute sur le port 2080. Essayez d'abord de le confirmer sur la machine serveur en émettant telnet sur ce port:

telnet localhost 2080

S'il écoute, il est capable de répondre.

Adil
la source
3

1.Vérifiez l'état de votre serveur.

2.Vérifiez l'état du port.

Par exemple 3306 netstat -nupl|grep 3306.

3.Vérifiez vos pare-feu. Par exemple, ajoutez 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
Jack Sun
la source
netstat -a a aidé
Philip
1

Bien que cela ne semble pas être le cas pour votre situation, parfois une erreur de refus de connexion peut également indiquer qu'il y a un conflit d'adresse IP sur votre réseau. Vous pouvez rechercher d'éventuels conflits IP en exécutant:

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

et

arping <ipaddress>

Cette question AskUbuntu contient également plus d'informations.

Instantané
la source
0

Du point de vue d'un pare-feu Checkpoint, vous verrez un message du pare-feu si vous choisissez effectivement Rejeter en tant qu'action, exposant ainsi à un attaquant propice la présence d'un pare-feu devant le serveur. Le pare-feu supprimera silencieusement toutes les connexions qui ne correspondent pas à la stratégie. La connexion refusée provient presque toujours du serveur

Julio Nalundasan
la source
0

J'ai le même problème avec mon ordinateur de travail. Le problème est que lorsque vous entrez localhost, il va à l'adresse du proxy et non à l'adresse locale, vous devez le contourner, suivez ces étapes

Chrome => Paramètres => Modifier les paramètres proxy => Paramètres LAN => cochez Contourner le serveur proxy pour les adresses locales.

İbrahim Özbölük
la source
0

Dans Ubuntu, essayez sudo ufw allow <port_number> d'autoriser l'accès du pare-feu à la fois à votre serveur et à votre base de données.

rajeeva9
la source
0

Essayez de transmettre le paramètre de port "-p":

sudo iperf -c 127.0.0.1 -p 443
Wellington1993
la source
0

Dans mon cas, cela se produit lorsque le site est bloqué dans mon pays et que je n'utilise pas de VPN. Par exemple, lorsque j'essaye d'accéder à vimeo.com depuis l'Indonésie qui est bloqué.

Aminah Nuraini
la source
-1

J'ai eu le même message avec une cause totalement différente: le wsock32.dlln'a pas été trouvé. L' ::socket(PF_INET, SOCK_STREAM, 0);appel a continué à renvoyer un INVALID_SOCKETmais la raison était que la DLL winsock n'était pas chargée.

À la fin, j'ai lancé le moniteur de processus de Sysinternals et j'ai remarqué qu'il cherchait la dll «partout» mais ne la trouvait pas.

Les échecs silencieux sont super!

xtofl
la source
1
INVALID_SOCKET n'a rien à voir avec «connexion refusée». Les «échecs silencieux» ne peuvent se produire que si votre code ne contient pas la gestion des erreurs requise.
Marquis of Lorne
1
vous voulez dire que j'aurais dû avoir une vérification que la DLL était chargée? vous avez probablement raison.
xtofl