Quali possono essere i motivi degli errori di connessione rifiutata?


114

Sto cercando di scrivere un programma server in C, utilizzando un altro client, ottengo questo errore quando provo a connettermi tramite la porta 2080, ad esempio.

connection refused

Quali possono essere le ragioni di questo errore?


Ho appena ricevuto questo errore, a causa di un errore del server su cui ospito il mio sito web. Il server potrebbe ancora essere modificato ping, downforeveryoneorjustme.com ha mostrato che non sono solo io e potrei anche accedervi tramite FTP. Dopo un paio di minuti gli errori sono stati risolti.
Martin Thoma

2
@moose: ping non ti dice se una porta specifica è accessibile in ascolto dell'annuncio, ma solo se l'indirizzo IP è raggiungibile. Ma connect()dipende da un IP e una porta specifici pronti per l'uso.
Remy Lebeau

Server Fault ha una domanda canonica sulla connessione rifiutata .
Raedwald

Ecco una breve spiegazione di Connessione rifiutata .
rbinnun

Ho ricevuto una connessione rifiutata su Ubuntu perché stavo cercando di ricevere la connessione su "localhost" ma "localhost" non era configurato correttamente sulla mia macchina. Cambiare "localhost" in "" (Python) ha risolto il problema.
user1097111

Risposte:


93

Le ragioni potrebbero essere molte, ma le più comuni sono:

  1. La porta non è aperta sulla macchina di destinazione.

  2. La porta è aperta sulla macchina di destinazione, ma il suo backlog di connessioni in sospeso è pieno.

  3. Un firewall tra il client e il server sta bloccando l'accesso (controlla anche i firewall locali).

Dopo aver verificato la presenza di firewall e che la porta sia aperta, utilizzare telnet per connettersi all'ip / porta per testare la connettività. Ciò rimuove eventuali problemi potenziali dall'applicazione.


7
I firewall normalmente darebbero errori di timeout, poiché il pacchetto di connessione (SYN) viene semplicemente scartato. La connessione rifiutata è perché il server ha ricevuto e rifiutato il pacchetto SYN.
RedPandaCurios

15
Non sempre, poiché i firewall possono essere configurati per rifiutare piuttosto che eliminare i pacchetti.
2010

connect () con un indirizzo IP del server e una configurazione del numero di porta errati nel programma client risulterà anche in errno 111.
smRaj

Inoltre: quando è necessario accedere a https, ma è stato specificato http: // ... anche questo errore può verificarsi.
Fico

4
@ a'r Come sapresti lo stato del backlog?
Naveen Verma

75

L'errore indica che il sistema operativo del socket in ascolto ha riconosciuto la richiesta di connessione in ingresso ma ha scelto di rifiutarla intenzionalmente.

Supponendo che un firewall intermedio non si intrometta, ci sono solo due ragioni (che io sappia) per cui il sistema operativo rifiuta una richiesta di connessione in entrata. Un motivo è già stato menzionato più volte: la porta di ascolto a cui è collegata non è aperta.

C'è un altro motivo che non è stato ancora menzionato: la porta di ascolto è effettivamente aperta e utilizzata attivamente, ma il suo backlog di richieste di connessione in entrata in coda ha raggiunto il suo massimo, quindi non c'è spazio disponibile per la richiesta di connessione in entrata da mettere in coda in quel momento momento. Il codice del server non ha ancora chiamato accept () abbastanza volte per completare la cancellazione degli slot disponibili per i nuovi elementi della coda.

Aspetta qualche istante e riprova la connessione. Sfortunatamente, non c'è modo di distinguere tra "la porta non è affatto aperta" e "la porta è aperta ma al momento troppo occupata". Entrambi utilizzano lo stesso codice di errore generico.


4
C'è anche un caso limite come spiegato qui: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . fondamentalmente se stai sottoponendo a stress la tua app client / server e stai usando l'approccio ingenuo come menzionato in 3.6, potrebbe verificarsi un errore di "connessione rifiutata", ed è un caso diverso dai due precedenti.
ernesto

Questo deve essere votato. Una volta risolta la causa ovvia (niente ascolto), questa è in realtà la spiegazione più probabile e risolverla può essere una questione complessa.
Graham Nicholls

se il backlog di richieste in entrata in coda ha raggiunto il suo massimo, come possiamo risolvere questo problema?
ACarter

è un backlog accodato da IP? Ho provato a utilizzare telnet email-smtp.eu-west-1.amazonaws.com 25 da un'istanza EC2 e la mia macchina locale, la chiamata telnet dell'istanza EC2 sta dando la connessione rifiutata mentre dalla mia macchina locale funziona
dresh

"niente è in ascolto" è probabilmente causato dal fatto che la macchina è in funzione ma il server (software), ad esempio, Apache non è in esecuzione.
ttulinsky

24

Se provi ad aprire una connessione TCP a un altro host e vedi l'errore "Connessione rifiutata", significa che

  1. Hai inviato un pacchetto TCP SYN all'altro host.
  2. Quindi hai ricevuto un pacchetto TCP RST in risposta.

RST è un po 'sul pacchetto TCP che indica che la connessione deve essere ripristinata. Di solito significa che l'altro host ha ricevuto il tuo tentativo di connessione e sta rifiutando attivamente la tua connessione TCP, ma a volte un firewall che interviene può bloccare il tuo pacchetto TCP SYN e inviarti un TCP RST.

Vedere https://tools.ietf.org/html/rfc793 pagina 69:

STATO RICEVUTO SYN

Se il bit RST è impostato

Se questa connessione è stata avviata con un OPEN passivo (cioè proveniva dallo stato LISTEN), riportare questa connessione allo stato LISTEN e tornare. L'utente non ha bisogno di essere informato. Se questa connessione è stata avviata con un OPEN attivo (cioè proveniva dallo stato SYN-SENT), la connessione è stata rifiutata, segnalare all'utente "connessione rifiutata". In entrambi i casi, tutti i segmenti sulla coda di ritrasmissione dovrebbero essere rimossi. E nel caso APERTO attivo, entrare nello stato CHIUSO ed eliminare il TCB e tornare.


11

Connessione rifiutata significa che la porta a cui stai tentando di connetterti non è effettivamente aperta.

Quindi o ti stai connettendo all'indirizzo IP sbagliato, o alla porta sbagliata, o il server è in ascolto sulla porta sbagliata, o non è effettivamente in esecuzione.

Un errore comune è non specificare il numero di porta durante l'associazione o la connessione in ordine di byte di rete ...


4
Questa è solo una delle numerose possibili condizioni che possono causare l'errore.
Remy Lebeau

1
La porta potrebbe essere aperta, ma questo errore potrebbe comunque verificarsi.
IgorGanapolsky

6

Verificare sul lato server che sia in ascolto sulla porta 2080. Prima prova a confermarlo sulla macchina server inviando telnet a quella porta:

telnet localhost 2080

Se sta ascoltando, è in grado di rispondere.


3

1.Controlla lo stato del tuo server.

2.Controllare lo stato della porta.

Ad esempio 3306 netstat -nupl|grep 3306.

3. Controlla i tuoi firewall. Ad esempio, aggiungi 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

netstat -a ha aiutato
Philip

1

Sebbene non sembri essere il caso della tua situazione, a volte un errore di connessione rifiutata può anche indicare che c'è un conflitto di indirizzi IP sulla tua rete. Puoi cercare possibili conflitti di ip eseguendo:

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

e

arping <ipaddress>

Questa domanda AskUbuntu contiene anche qualche informazione in più.


0

Dal punto di vista di un firewall Checkpoint, vedrai un messaggio dal firewall se scegli effettivamente Rifiuta come Azione, esponendo così a un aggressore propizio la presenza di un firewall davanti al server. Il firewall interromperà silenziosamente tutte le connessioni che non corrispondono alla policy. La connessione rifiutata proviene quasi sempre dal server


0

Ho lo stesso problema con il mio computer di lavoro. Il problema è che quando inserisci localhost va all'indirizzo del proxy non all'indirizzo locale, dovresti bypassarlo seguendo questi passaggi

Chrome => Impostazioni => Modifica impostazioni proxy => Impostazioni LAN => seleziona Ignora server proxy per indirizzi locali.


0

In Ubuntu, prova sudo ufw allow <port_number> a consentire l'accesso del firewall sia al tuo server che a db.


0

Prova a passare il parametro della porta "-p":

sudo iperf -c 127.0.0.1 -p 443

0

Nel mio caso, succede quando il sito è bloccato nel mio paese e non utilizzo la VPN. Ad esempio quando provo ad accedere a vimeo.com dall'Indonesia che è bloccato.


-1

Ho ricevuto lo stesso messaggio con una causa completamente diversa: wsock32.dllnon è stato trovato. La ::socket(PF_INET, SOCK_STREAM, 0);chiamata continuava a restituire un messaggio INVALID_SOCKETma il motivo era che la dll winsock non era stata caricata.

Alla fine ho lanciato il monitor di processo di Sysinternals e ho notato che cercava la dll "ovunque" ma non la trovava.

I fallimenti silenziosi sono fantastici!


1
INVALID_SOCKET non ha nulla a che fare con "connessione rifiutata". Gli "errori silenziosi" possono verificarsi solo se nel codice manca la gestione degli errori richiesta.
Marchese di Lorne

1
vuoi dire che avrei dovuto controllare che la dll fosse caricata? Probabilmente hai ragione.
xtofl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.