연결 거부 오류의 원인은 무엇입니까?


114

다른 클라이언트를 사용하여 C로 서버 프로그램을 작성하려고합니다. 예를 들어 포트 2080을 통해 연결하려고하면이 오류가 발생합니다.

connection refused

이 오류의 원인은 무엇입니까?


내 웹 사이트를 호스팅하는 서버의 실수로 인해이 오류가 발생했습니다. 서버는 여전히 pinged 될 수 있었고 downforeveryoneorjustme.com 은 그것이 나뿐만 아니라 FTP를 통해 액세스 할 수도 있음을 보여주었습니다. 몇 분 후 실수가 해결되었습니다.
Martin Thoma

2
@moose : ping은 특정 포트에 액세스 할 수 있는지 여부를 알려주지 않고 IP 주소에 도달 할 수 있는지 여부 만 알려줍니다. 그러나 connect()사용할 준비가 된 특정 IP 및 포트에 따라 다릅니다.
Remy Lebeau

Server Fault에는 Connection Refused 에 대한 정식 질문이 있습니다.
Raedwald 2015 년

다음은 Connection Refused에 대한 간략한 설명입니다 .
rbinnun

'localhost'에서 연결을 수신하려고했지만 'localhost'가 내 컴퓨터에서 제대로 구성되지 않았기 때문에 Ubuntu에서 연결이 거부되었습니다. 'localhost'를 ''(Python)로 변경하면 문제가 해결되었습니다.
user1097111

답변:


93

여러 가지 이유가있을 수 있지만 가장 일반적인 이유는 다음과 같습니다.

  1. 대상 컴퓨터에서 포트가 열려 있지 않습니다.

  2. 대상 컴퓨터에서 포트가 열려 있지만 보류중인 연결의 백 로그가 가득 찼습니다.

  3. 클라이언트와 서버 사이의 방화벽이 액세스를 차단하고 있습니다 (로컬 방화벽도 확인).

방화벽을 확인하고 포트가 열려 있는지 확인한 후 텔넷을 사용하여 ip / port에 연결하여 연결을 테스트합니다. 이렇게하면 응용 프로그램에서 잠재적 인 문제가 제거됩니다.


7
방화벽은 일반적으로 연결 (SYN) 패킷이 삭제되기 때문에 시간 초과 오류를 제공합니다. 연결이 거부 된 이유는 서버가 SYN 패킷을 수신 및 거부했기 때문입니다.
RedPandaCurios

15
패킷을 삭제하지 않고 거부하도록 방화벽을 구성 할 수 있으므로 항상 그런 것은 아닙니다.
a'r

클라이언트 프로그램에서 잘못된 서버 IP 주소 및 포트 번호 구성으로 connect ()를 사용하면 errno 111이 발생합니다.
smRaj

또한 https에 액세스해야하지만 http : // ...를 지정한 경우에도이 오류가 발생할 수 있습니다.
Fico

4
@ a'r 백 로그 상태를 어떻게 알 수 있습니까?
Naveen Verma

75

오류는 수신 소켓의 OS가 인바운드 연결 요청을 인식했지만 의도적으로 거부하도록 선택했음을 의미합니다.

중간 방화벽이 방해가되지 않는다고 가정 할 때 OS가 인바운드 연결 요청을 거부하는 이유는 두 가지뿐입니다. 한 가지 이유는 이미 여러 번 언급되었습니다. 연결된 청취 포트가 열려 있지 않습니다.

아직 언급되지 않은 또 다른 이유가 있습니다. 수신 포트가 실제로 열려 있고 활발하게 사용되고 있지만 대기중인 인바운드 연결 요청의 백 로그가 최대 값에 도달했기 때문에 인바운드 연결 요청을 대기 할 공간이 없습니다. 순간. 서버 코드가 새 대기열 항목에 대해 사용 가능한 슬롯을 지우는 데 아직 충분한 시간 동안 accept ()를 호출하지 않았습니다.

잠시 기다렸다가 다시 연결해보십시오. 안타깝게도 "포트가 전혀 열려 있지 않음"과 "포트가 열려 있지만 지금 너무 바쁘다"를 구분할 방법이 없습니다. 둘 다 동일한 일반 오류 코드를 사용합니다.


4
여기에 설명 된 것처럼 하나의 엣지 케이스도 있습니다 : softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… . 기본적으로 클라이언트 / 서버 앱에 스트레스 테스트를하고 있고 3.6에서 언급 한 순진한 접근 방식을 사용하는 경우 "연결 거부"오류가 발생할 수 있으며 위의 두 가지 경우와는 다릅니다.
ernesto 2014

찬성해야합니다. 명백한 원인 (아무것도 듣지 않음)이 해결되면 이것은 실제로 가장 가능성이 높은 설명이며이를 수정하는 것은 복잡한 문제 일 수 있습니다.
Graham Nicholls

대기중인 인바운드 요청의 백 로그가 최대 값에 도달하면 어떻게 해결할 수 있습니까?
ACarter

백 로그가 IP에 의해 대기열에 있습니까? 나는 EC2 인스턴스 텔넷 호출이 내 로컬 컴퓨터에서 작동하는 동안 거부 연결을 제공하는 EC2 인스턴스와 내 로컬 컴퓨터에서 텔넷 email-smtp.eu-west-1.amazonaws.com (25)를 사용하여 시도
dresh

"아무것도 수신하지 않음"은 아마도 컴퓨터가 작동 중이지만 서버 (소프트웨어) (예 : Apache가 실행되지 않음)로 인해 발생합니다.
ttulinsky

24

다른 호스트에 대한 TCP 연결을 열려고 할 때 "연결이 거부되었습니다."라는 오류가 표시되면

  1. TCP SYN 패킷을 다른 호스트로 보냈습니다.
  2. 그런 다음 응답으로 TCP RST 패킷을 받았습니다.

RST는 연결을 재설정해야 함을 나타내는 TCP 패킷의 비트입니다. 일반적으로 다른 호스트가 사용자의 연결 시도를 수신하고 적극적으로 TCP 연결을 거부하고 있음을 의미하지만 때때로 개입 방화벽이 사용자의 TCP SYN 패킷을 차단하고 TCP RST를 사용자에게 다시 보낼 수 있습니다.

https://tools.ietf.org/html/rfc793 69 페이지를 참조 하십시오 .

SYN 수신 상태

RST 비트가 설정된 경우

이 연결이 수동 OPEN (즉, LISTEN 상태에서 온)으로 시작된 경우이 연결을 LISTEN 상태로 되돌리고 반환합니다. 사용자에게 알릴 필요가 없습니다. 이 연결이 활성 OPEN (즉, SYN-SENT 상태에서 온)으로 시작된 경우 연결이 거부 된 것입니다. 사용자에게 "연결 거부"신호를 보냅니다. 두 경우 모두 재전송 큐의 모든 세그먼트를 제거해야합니다. 그리고 활성 OPEN 케이스에서 CLOSED 상태로 들어가 TCB를 삭제하고 돌아갑니다.


11

연결이 거부 됨은 연결하려는 포트가 실제로 열려 있지 않음을 의미합니다.

따라서 잘못된 IP 주소 또는 잘못된 포트에 연결 중이거나 서버가 잘못된 포트에서 수신 중이거나 실제로 실행되고 있지 않습니다.

일반적인 실수는 네트워크 바이트 순서로 바인딩하거나 연결할 때 포트 번호를 지정하지 않는 것입니다.


4
이것은 오류를 일으킬 수있는 몇 가지 가능한 조건 중 하나 일뿐입니다.
Remy Lebeau

1
포트가 열려있을 수 있지만이 오류는 계속 발생할 수 있습니다.
IgorGanapolsky

6

서버 측에서 포트 2080에서 수신 대기 중인지 확인하십시오. 먼저 해당 포트에 텔넷을 발행하여 서버 시스템에서 확인하십시오.

텔넷 로컬 호스트 2080

듣고 있으면 응답 할 수 있습니다.


3

1. 서버 상태를 확인하십시오.

2. 포트 상태를 확인하십시오.

예 : 3306 netstat -nupl|grep 3306.

3. 방화벽을 확인하십시오. 예를 들어 3306을 추가하십시오.

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

netstat -a 도움
Philip

1

귀하의 상황에 해당하지 않는 것 같지만 때로는 연결 거부 오류가 네트워크에 IP 주소 충돌이 있음을 나타낼 수도 있습니다. 다음을 실행하여 가능한 IP 충돌을 검색 할 수 있습니다.

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

arping <ipaddress>

AskUbuntu 질문에는 더 많은 정보가 있습니다.


0

Checkpoint 방화벽의 관점에서 실제로 Reject를 Action으로 선택하면 방화벽의 메시지가 표시되어 공격자에게 서버 앞에 방화벽이 있음을 노출합니다. 방화벽은 정책과 일치하지 않는 모든 연결을 자동으로 삭제합니다. 연결 거부는 거의 항상 서버에서 발생합니다.


0

업무용 컴퓨터에서도 같은 문제가 발생합니다. 문제는 localhost를 입력하면 로컬 주소가 아닌 프록시의 주소로 이동한다는 것입니다.이 단계를 따르십시오.

Chrome => 설정 => 프록시 설정 변경 => LAN 설정 => 로컬 주소에 대해 프록시 서버 우회를 선택합니다.


0

Ubuntu에서 sudo ufw allow <port_number> 서버와 db 모두에 방화벽 액세스를 허용하십시오.


0

포트 매개 변수 "-p"전달을 시도하십시오.

sudo iperf -c 127.0.0.1 -p 443

0

제 경우에는 우리 나라에서 사이트가 차단되고 VPN을 사용하지 않을 때 발생합니다. 예를 들어 차단 된 인도네시아에서 vimeo.com에 액세스하려고 할 때.


-1

나는 완전히 다른 원인으로 동일한 메시지를 가졌습니다 wsock32.dll. ::socket(PF_INET, SOCK_STREAM, 0);호출은 반환 유지 INVALID_SOCKET하지만 이유는 윈속 DLL이로드되지 않았습니다이었다.

결국 나는 Sysinternals의 프로세스 모니터를 시작했고 그것이 '모든 곳에서'dll을 검색했지만 찾지 못했다는 것을 알았습니다.

침묵의 실패는 대단합니다!


1
INVALID_SOCKET은 '연결 거부'와 관련이 없습니다. '자동 실패'는 코드에 필요한 오류 처리가 누락 된 경우에만 발생할 수 있습니다.
Marquis of Lorne

1
dll이로드되었는지 확인 했어야 했어요? 당신이 옳을 것입니다.
xtofl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.