Quais podem ser as razões de erros de conexão recusada?

114

Estou tentando escrever um programa de servidor em C, usando outro cliente, recebo este erro quando tento conectar pela porta 2080 por exemplo.

connection refused

Quais podem ser as razões desse erro?

Zenet
fonte
Acabei de receber este erro, por causa de um erro do servidor onde hospedo meu site. O servidor ainda pôde ser pingeditado, downforeveryoneorjustme.com mostrou que não sou só eu e ainda posso acessá-lo via FTP. Depois de alguns minutos, os erros foram resolvidos.
Martin Thoma
2
@moose: ping não informa se uma porta específica está acessível e escuta, apenas se o endereço IP está acessível. Mas connect()depende de um IP e porta específicos estarem prontos para uso.
Remy Lebeau
Falha do servidor tem uma pergunta canônica sobre conexão recusada .
Raedwald
Aqui está uma explicação sucinta de Conexão recusada .
rbinnun
Recebi uma conexão recusada no Ubuntu porque estava tentando receber uma conexão em 'localhost', mas 'localhost' não estava configurado corretamente em minha máquina. Alterar 'localhost' para '' (Python) resolveu o problema.
user1097111

Respostas:

93

Pode haver muitos motivos, mas os mais comuns são:

  1. A porta não está aberta na máquina de destino.

  2. A porta está aberta na máquina de destino, mas seu backlog de conexões pendentes está cheio.

  3. Um firewall entre o cliente e o servidor está bloqueando o acesso (verifique também os firewalls locais).

Após verificar se há firewalls e se a porta está aberta, use telnet para se conectar ao ip / porta para testar a conectividade. Isso remove qualquer problema potencial de seu aplicativo.

a'r
fonte
7
Os firewalls normalmente forneceriam erros de tempo limite, já que o pacote de conexão (SYN) acabou de ser descartado. A conexão foi recusada porque o servidor recebeu e rejeitou o pacote SYN.
RedPandaCurios
15
Nem sempre, pois os firewalls podem ser configurados para rejeitar em vez de descartar os pacotes.
2010
connect () com endereço IP de servidor incorreto e configuração de número de porta no programa cliente também resultará em errno 111.
smRaj
Além disso: quando você precisa acessar https, mas especificou http: // ... este erro também pode ocorrer.
Fico,
4
@ a'r Como você saberia o status do backlog?
Naveen Verma
75

O erro significa que o SO do soquete de escuta reconheceu a solicitação de conexão de entrada, mas optou por rejeitá-la intencionalmente.

Supondo que um firewall intermediário não esteja atrapalhando, há apenas dois motivos (que eu conheço) para o SO rejeitar uma solicitação de conexão de entrada. Uma razão já foi mencionada várias vezes - a porta de escuta que está sendo conectada não está aberta.

Há outro motivo que ainda não foi mencionado - a porta de escuta está realmente aberta e sendo usada ativamente, mas seu acúmulo de solicitações de conexão de entrada enfileiradas atingiu seu máximo, então não há espaço disponível para a solicitação de conexão de entrada ser enfileirada naquele momento. O código do servidor ainda não chamou accept () vezes suficientes para terminar de limpar os slots disponíveis para novos itens da fila.

Espere um pouco e tente a conexão novamente. Infelizmente, não há como diferenciar entre "a porta não está aberta" e "a porta está aberta, mas muito ocupada no momento". Ambos usam o mesmo código de erro genérico.

Remy Lebeau
fonte
4
Há também um caso extremo, conforme explicado aqui: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . basicamente, se você estiver fazendo um teste de estresse em seu aplicativo cliente / servidor e estiver usando a abordagem ingênua mencionada em 3.6, o erro de "conexão recusada" pode ocorrer e é um caso diferente dos dois anteriores.
Ernesto,
Isso precisa ser votado positivamente. Depois que a causa óbvia (nada ouvindo) for resolvida, esta é realmente a explicação mais provável, e consertá-la pode ser uma questão complexa.
Graham Nicholls
se o acúmulo de solicitações de entrada na fila atingiu seu máximo, como podemos corrigir isso?
ACarter
é uma lista de pendências enfileirada por IP? Eu tentei usar telnet email-smtp.eu-west-1.amazonaws.com 25 de uma instância EC2 e minha máquina local, a chamada telnet da instância EC2 está dando conexão recusada enquanto da minha máquina local funciona
dresh
"nada está ouvindo" é provavelmente causado pela máquina estar ligada, mas o servidor (software), por exemplo, o Apache não está funcionando.
ttulinsky
24

Se você tentar abrir uma conexão TCP para outro host e vir o erro "Conexão recusada", significa que

  1. Você enviou um pacote TCP SYN para outro host.
  2. Em seguida, você recebeu um pacote TCP RST em resposta.

RST é um bit no pacote TCP que indica que a conexão deve ser reiniciada. Normalmente isso significa que o outro host recebeu sua tentativa de conexão e está recusando ativamente sua conexão TCP, mas às vezes um firewall intermediário pode bloquear seu pacote TCP SYN e enviar um TCP RST de volta para você.

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

ESTADO RECEBIDO POR SYN

Se o bit RST estiver definido

Se esta conexão foi iniciada com um OPEN passivo (ou seja, veio do estado LISTEN), então retorne esta conexão ao estado LISTEN e retorne. O usuário não precisa ser informado. Se esta conexão foi iniciada com um OPEN ativo (ou seja, veio do estado SYN-SENT), então a conexão foi recusada, sinalize ao usuário "conexão recusada". Em qualquer um dos casos, todos os segmentos da fila de retransmissão devem ser removidos. E no caso OPEN ativo, entre no estado CLOSED e exclua o TCB, e retorne.

James Brock
fonte
11

Conexão recusada significa que a porta à qual você está tentando se conectar não está realmente aberta.

Portanto, ou você está se conectando ao endereço IP errado, ou à porta errada, ou o servidor está escutando na porta errada ou não está realmente funcionando.

Um erro comum é não especificar o número da porta ao vincular ou conectar na ordem de bytes da rede ...

RedPandaCurios
fonte
4
Esta é apenas uma das várias condições possíveis que podem causar o erro.
Remy Lebeau
1
A porta pode estar aberta, mas esse erro ainda pode ocorrer.
IgorGanapolsky
6

Verifique no lado do servidor se ele está escutando na porta 2080. Primeiro, tente confirmar na máquina do servidor emitindo telnet para essa porta:

telnet localhost 2080

Se estiver ouvindo, é capaz de responder.

Adil
fonte
3

1. Verifique o status do seu servidor.

2. Verifique o status da porta.

Por exemplo, 3306 netstat -nupl|grep 3306.

3. Verifique seus firewalls. Por exemplo, adicione 3306

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

Embora não pareça ser o caso em sua situação, às vezes um erro de conexão recusada também pode indicar que há um conflito de endereço IP em sua rede. Você pode pesquisar possíveis conflitos de ip executando:

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

e

arping <ipaddress>

Esta questão AskUbuntu tem mais algumas informações também.

Instantâneo
fonte
0

Do ponto de vista de um firewall de Checkpoint, você verá uma mensagem do firewall se realmente escolher Rejeitar como uma Ação, expondo assim a um invasor potencial a presença de um firewall na frente do servidor. O firewall descartará silenciosamente todas as conexões que não correspondam à política. A conexão recusada quase sempre vem do servidor

Julio Nalundasan
fonte
0

Tenho o mesmo problema com meu computador de trabalho. O problema é que quando você insere localhost ele vai para o endereço do proxy e não para o endereço local, você deve ignorá-lo, siga estas etapas

Chrome => Configurações => Alterar configurações de proxy => Configurações de LAN => marque Ignorar servidor proxy para endereços locais.

İbrahim Özbölük
fonte
0

No Ubuntu, tente sudo ufw allow <port_number> permitir o acesso do firewall ao servidor e ao banco de dados.

Rajeeva9
fonte
0

Tente passar o parâmetro de porta "-p":

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

No meu caso, acontece quando o site está bloqueado no meu país e não uso VPN. Por exemplo, quando tento acessar o vimeo.com da Indonésia, que está bloqueado.

Aminah Nuraini
fonte
-1

Eu tive a mesma mensagem com uma causa totalmente diferente: o wsock32.dllnão foi encontrado. A ::socket(PF_INET, SOCK_STREAM, 0);chamada continuava retornando um, INVALID_SOCKETmas o motivo era que a DLL do Winsock não estava carregada.

No final, lancei o monitor de processos do Sysinternals e percebi que ele procurou a dll 'em todos os lugares', mas não a encontrei.

Falhas silenciosas são ótimas!

xtofl
fonte
1
INVALID_SOCKET não tem nada a ver com 'conexão recusada'. 'Falhas silenciosas' só podem ocorrer se o seu código não tiver o tratamento de erros necessário.
Marquês de Lorne
1
você quer dizer que eu deveria ter verificado se a dll foi carregada? você provavelmente está certo.
xtofl