Linux Connection refused 오류가 발생하는 원인과 해결 방법

Linux 서버를 운영하다 보면 SSH, 웹 서버, 데이터베이스 등에 접속할 때 Connection refused라는 오류를 자주 만나게 됩니다. 이 오류는 서버가 네트워크상에서 응답은 하고 있지만 요청한 포트에서 서비스를 제공하지 않을 때 발생하는 대표적인 네트워크 오류입니다.

많은 사람들이 방화벽 문제라고 생각하지만 실제로는 서비스가 실행되지 않았거나, 포트 설정 오류, 잘못된 Listen 주소, 보안 정책 등 다양한 원인으로 발생합니다.

이번 글에서는 Connection refused 오류가 발생하는 원인과 실무에서 해결하는 방법을 알아보겠습니다.

Connection refused란 무엇인가?

Connection refused는 대상 서버까지는 통신이 되었지만 해당 포트에서 연결 요청을 거부했다는 의미입니다.

대표적인 오류 예시는 다음과 같습니다.

ssh: connect to host 192.168.0.10 port 22: Connection refused

또는

curl: (7) Failed to connect: Connection refused

또는

telnet: Unable to connect to remote host: Connection refused

즉, 네트워크는 연결되지만 해당 서비스가 연결을 받아주지 않는 상태입니다.

Connection refused가 발생하는 대표적인 원인

다음과 같은 경우에 자주 발생합니다.

  • 서비스가 실행되지 않음
  • 잘못된 포트 번호
  • Listen 설정 오류
  • 방화벽 차단
  • SELinux 정책
  • Docker 포트 미노출
  • 서버 프로그램 비정상 종료
  • 잘못된 IP 주소
  • systemd 서비스 실패
  • 네트워크 설정 오류

실무에서는 서비스 상태부터 확인하는 것이 가장 중요합니다.

1. 서비스 실행 여부 확인하기

서비스가 정상 실행 중인지 확인합니다.

예시(SSH)

systemctl status sshd

예시(Nginx)

systemctl status nginx

예시(MySQL)

systemctl status mysqld

서비스가 inactive 또는 failed 상태라면 먼저 실행해야 합니다.

2. 포트가 열려 있는지 확인하기

현재 서비스가 어떤 포트를 사용하는지 확인합니다.

ss -tlnp

또는

netstat -tlnp

출력 결과에 원하는 포트가 LISTEN 상태인지 확인합니다.

예시

LISTEN 0 128 0.0.0.0:80

3. 특정 포트 확인하기

특정 포트만 확인합니다.

ss -tlnp | grep 22

또는

ss -tlnp | grep 80

원하는 포트가 없다면 서비스가 제대로 실행되지 않은 것입니다.

4. 방화벽 확인하기

Firewalld

firewall-cmd --list-all

UFW

ufw status

필요한 포트가 허용되어 있는지 확인합니다.

5. 서비스 설정 확인하기

설정 파일의 Listen 주소를 확인합니다.

Nginx 예시

grep listen /etc/nginx/nginx.conf

SSH 예시

grep Port /etc/ssh/sshd_config

Listen 주소가 127.0.0.1로 설정되어 있으면 외부에서는 접속할 수 없습니다.

6. 로그 확인하기

서비스 로그를 확인합니다.

journalctl -u nginx

또는

journalctl -u sshd

실행 실패 원인을 확인할 수 있습니다.

7. SELinux 확인하기

현재 SELinux 상태를 확인합니다.

getenforce

차단 로그도 함께 확인합니다.

ausearch -m avc

8. 로컬 접속 테스트

서버 내부에서 먼저 접속을 시도합니다.

curl localhost

또는

telnet localhost 80

내부에서는 접속되지만 외부에서는 안 된다면 방화벽이나 네트워크 설정을 의심해야 합니다.

9. Docker 환경 확인하기

Docker를 사용하는 경우 포트가 제대로 노출되었는지 확인합니다.

docker ps

포트 매핑을 확인합니다.

docker port 컨테이너명

10. 네트워크 연결 확인하기

서버까지 통신이 가능한지 확인합니다.

ping 서버IP

또는

traceroute 서버IP

네트워크 자체에 문제가 없는지 확인합니다.

Connection refused 문제를 확인하는 순서

실무에서는 다음 순서대로 확인하는 것이 가장 효율적입니다.

  1. systemctl status 확인
  2. ss -tlnp 확인
  3. 포트 번호 확인
  4. 방화벽 확인
  5. Listen 설정 확인
  6. 서비스 로그 확인
  7. SELinux 확인
  8. localhost 테스트
  9. Docker 포트 확인
  10. 네트워크 확인

이 순서대로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다.

오류를 해결할 때 주의할 점

Connection refused는 서버가 꺼져 있다는 의미와는 다릅니다.

서버는 정상적으로 실행 중이지만 해당 포트에서 서비스를 제공하지 않거나 연결을 거부하는 상태일 수 있습니다.

따라서 무조건 방화벽만 확인하기보다는 서비스 실행 상태와 포트 개방 여부를 먼저 확인하는 것이 중요합니다.

자주 묻는 질문

Connection timed out과 Connection refused의 차이는 무엇인가요?

Connection refused는 서버까지는 도달했지만 서비스가 연결을 거부한 경우입니다. 반면 Connection timed out은 서버까지의 네트워크 연결 자체가 실패했거나 중간에서 차단된 경우입니다.

Ping은 되는데 Connection refused가 발생합니다.

네트워크는 정상이며 서비스가 실행되지 않았거나 포트 설정에 문제가 있을 가능성이 높습니다.

서비스는 실행 중인데 Connection refused가 발생합니다.

Listen 주소, 포트 설정, Docker 포트 매핑, SELinux 정책 등을 함께 확인해야 합니다.

마무리

Connection refused는 Linux 서버에서 가장 자주 발생하는 네트워크 오류 중 하나입니다. systemctl, ss, journalctl, firewall-cmd, getenforce 등을 활용하여 서비스 실행 상태와 포트 개방 여부를 차례대로 확인하면 대부분의 문제를 빠르게 해결할 수 있습니다.

댓글 남기기