Home Linux AWS Cloud Docker Python AI
클릭하여 터미널 활성화

SSH Connection refused 5가지 원인과 해결법 Rocky Linux 실전 트러블슈팅

// SSH · 트러블슈팅 · Linux · Rocky Linux · 서버 관리
SSH 접속할 때 가장 많이 마주치는 에러가 Connection refused다. Rocky Linux 9 환경에서 5가지 원인을 직접 재현하고, 각각의 진단 명령어와 해결법을 정리했다.
📋 이 글에서 다루는 것
SSH Connection refused가 발생하는 5가지 원인과 각각의 진단 방법
sshd 서비스 중지, 포트 변경, 방화벽 차단, 설정 문법 오류, ListenAddress 오류
원인을 빠르게 찾는 트러블슈팅 플로우차트
각 원인별 실제 재현 결과와 해결 명령어
에러 메시지
terminal
$ ssh root@192.168.1.100
ssh: connect to host 192.168.1.100 port 22: Connection refused

이 메시지는 서버의 22번 포트에 접속할 수 없다는 뜻이다. 서버가 꺼져 있거나, 포트가 막혀 있거나, 아예 다른 포트에서 동작하고 있거나. 원인은 크게 5가지로 나뉜다.

#원인핵심 진단 명령어
1sshd 서비스가 중지됨systemctl status sshd
2SSH 포트가 변경됨ss -tlnp | grep sshd
3방화벽이 포트를 차단iptables -L INPUT -n
4sshd_config 문법 오류sshd -t
5ListenAddress 잘못 설정/usr/sbin/sshd -d

원인 1. sshd 서비스가 중지됨

가장 흔한 원인이다. sshd 데몬이 꺼져 있으면 당연히 접속이 안 된다. 서버를 재부팅했는데 sshd가 자동 시작되지 않도록 설정된 경우에 발생한다. 또는 누군가 실수로 systemctl stop sshd를 실행한 경우다.

진단
sshd 프로세스 확인
$ ps aux | grep sshd | grep -v grep

# 아무것도 출력 안 됨 → sshd 프로세스가 없다
22번 포트 리스닝 확인
$ ss -tlnp | grep :22

# 출력 없음 → 22번 포트를 듣고 있는 프로세스가 없다
해결
sshd 시작 + 자동 시작 설정
$ systemctl start sshd
$ systemctl enable sshd
Created symlink ... → /usr/lib/systemd/system/sshd.service.

$ ss -tlnp | grep :22
LISTEN  0  128  0.0.0.0:22  0.0.0.0:*  users:(("sshd",pid=1234,fd=3))
LISTEN  0  128     [::]:22     [::]:*  users:(("sshd",pid=1234,fd=4))
💡 팁systemctl is-enabled sshd로 부팅 시 자동 시작 설정 여부를 확인할 수 있다. enabled가 나오면 재부팅 후에도 자동으로 올라온다.

원인 2. SSH 포트가 변경됨

보안을 위해 SSH 포트를 22번에서 다른 포트로 변경하는 경우가 있다. 이전 관리자가 바꿔놓고 인수인계를 안 한 경우에 자주 발생한다. 기본 22번 포트로 접속하면 당연히 Connection refused가 뜬다 — 22번 포트에는 아무것도 없으니까.

진단
리스닝 포트 확인
$ ss -tlnp | grep sshd
LISTEN  0  128  0.0.0.0:2200  0.0.0.0:*  users:(("sshd",pid=69,fd=3))
LISTEN  0  128     [::]:2200     [::]:*  users:(("sshd",pid=69,fd=4))

22번이 아니라 2200번에서 리스닝 중이다.

sshd_config 확인
$ grep -i "^Port" /etc/ssh/sshd_config
Port 2200
해결

방법 A — 변경된 포트로 접속하면 된다. 가장 빠른 방법이다.

변경된 포트로 접속
$ ssh -p 2200 root@192.168.1.100

방법 B — 포트를 22번으로 되돌린다. 서버에 콘솔 접근이 가능할 때.

포트 복원
$ vi /etc/ssh/sshd_config
# Port 2200 → Port 22 로 변경

$ systemctl restart sshd
$ ss -tlnp | grep sshd
LISTEN  0  128  0.0.0.0:22  0.0.0.0:*  users:(("sshd",pid=89,fd=3))
⚠️ 주의 — 포트를 변경했다면 방화벽도 같이 열어줘야 한다. firewall-cmd --add-port=2200/tcp --permanent && firewall-cmd --reload

원인 3. 방화벽이 포트를 차단

sshd는 정상 실행 중인데, 방화벽이 22번 포트를 막고 있는 경우다. 이때는 Connection refused 대신 응답 없이 타임아웃이 발생할 수도 있다. iptables에서 DROP으로 차단하면 타임아웃, REJECT로 차단하면 Connection refused가 뜬다.

진단
iptables 규칙 확인
$ iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target  prot opt source       destination
1    DROP    tcp  --  0.0.0.0/0    0.0.0.0/0    tcp dpt:22

22번 포트로 들어오는 트래픽이 DROP되고 있다.

해결 — iptables인 경우
DROP 규칙 제거
$ iptables -D INPUT -p tcp --dport 22 -j DROP

$ iptables -L INPUT -n --line-numbers
Chain INPUT (policy ACCEPT)
num  target  prot opt source  destination
# DROP 규칙이 사라짐
해결 — firewalld인 경우
firewalld SSH 허용
$ firewall-cmd --permanent --add-service=ssh
success
$ firewall-cmd --reload
success
💡 클라우드 환경이라면 — AWS 보안 그룹, GCP VPC 방화벽 같은 클라우드 레벨 방화벽도 별도로 확인해야 한다. OS 방화벽에서 열어도 클라우드 방화벽에서 막혀 있으면 접속이 안 된다. 둘은 완전히 별개다.

원인 4. sshd_config 문법 오류

설정 파일을 수정하다가 오타나 잘못된 옵션이 들어가면, sshd 재시작에 실패한다. 이전 프로세스가 이미 종료된 상태라면 SSH 접속이 완전히 불가능해진다. 그래서 sshd_config를 수정하기 전에는 반드시 백업을 해야 하고, 수정 후에는 문법 검증을 돌려야 한다.

진단
sshd 설정 검증
$ sshd -t
/etc/ssh/sshd_config: line 131: Bad configuration option: InvalidOption
/etc/ssh/sshd_config: terminating, 1 bad configuration options

sshd -t문제가 있는 줄 번호와 옵션명을 정확히 알려준다. 이 명령어만 기억해도 대부분의 설정 오류를 잡을 수 있다.

해결
문제 줄 확인 → 수정 → 재검증
# 131번째 줄 확인
$ sed -n '131p' /etc/ssh/sshd_config
InvalidOption yes

# 수정
$ vi /etc/ssh/sshd_config
# 131번째 줄 삭제 또는 올바른 값으로 변경

# 재검증 — 출력 없으면 문법 OK
$ sshd -t
$ systemctl restart sshd
⚠️ 필수 — sshd_config 수정 전에 반드시 백업하라. cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak — 설정을 망치면 SSH 접속 자체가 불가능해지기 때문에, 복원할 수단이 있어야 한다.

원인 5. ListenAddress 잘못 설정

이 경우가 가장 까다롭다. sshd가 특정 IP에만 바인딩하도록 ListenAddress를 설정했는데, 해당 IP가 서버에 존재하지 않으면 sshd 기동 자체가 실패한다. 문제는 sshd -t로 잡히지 않는다는 것이다 — 문법 검증은 통과하지만 실제 실행하면 실패한다.

진단
sshd -t는 통과하지만...
$ sshd -t
$ echo $?
0         # 문법 검증 통과

문법은 맞으니까 sshd -t를 통과한다. 하지만 실제로 실행하면 실패한다. 이때는 디버그 모드로 실행해야 원인이 보인다.

디버그 모드 — 진짜 원인 확인
$ /usr/sbin/sshd -d
debug1: sshd version OpenSSH_8.7, OpenSSL 3.5.1 1 Jul 2025
error: Bind to address 10.99.99.99 port 22: Cannot assign requested address

10.99.99.99는 이 서버에 없는 IP이므로 바인딩에 실패한 것이다.

해결
ListenAddress 수정
$ grep -i "ListenAddress" /etc/ssh/sshd_config
ListenAddress 10.99.99.99

$ vi /etc/ssh/sshd_config
# ListenAddress 10.99.99.99 → 삭제 또는 올바른 IP로 변경

$ systemctl restart sshd
$ ss -tlnp | grep sshd
LISTEN  0  128  0.0.0.0:22  0.0.0.0:*  users:(("sshd",pid=213,fd=3))
💡 팁ListenAddress를 생략하면 모든 인터페이스(0.0.0.0)에서 리스닝한다. 특별히 특정 NIC에만 바인딩해야 하는 이유가 없다면 생략하는 게 안전하다.

트러블슈팅 플로우차트

SSH Connection refused를 만났을 때, 이 순서대로 확인하면 원인을 빠르게 찾을 수 있다.

SSH Connection refused 발생 │ ├─ 1. sshd 실행 중인가? │ $ systemctl status sshd$ ss -tlnp | grep :22 │ → 안 돌고 있으면 systemctl start sshd │ ├─ 2. 포트가 22번 맞는가? │ $ grep "^Port" /etc/ssh/sshd_config$ ss -tlnp | grep sshd │ → 다른 포트면 ssh -p [포트] 또는 설정 복원 │ ├─ 3. 방화벽이 막고 있나? │ $ iptables -L INPUT -n$ firewall-cmd --list-all │ → DROP/REJECT 있으면 규칙 제거 또는 허용 │ ├─ 4. sshd_config에 문법 오류? │ $ sshd -t │ → Bad configuration option이면 해당 줄 수정 │ └─ 5. ListenAddress가 잘못됐나? $ /usr/sbin/sshd -d → Cannot assign requested address면 IP 수정

테스트 환경
항목버전
OSRocky Linux 9.3 (Blue Onyx)
OpenSSH8.7

자주 묻는 질문 (FAQ)
Q. Connection refused와 Connection timed out의 차이는?
Connection refused는 서버가 "이 포트에 아무것도 없다"고 즉시 응답하는 것이다. sshd가 꺼져 있거나 다른 포트에서 동작할 때 발생한다. Connection timed out은 서버가 아예 응답하지 않는 것이다. 방화벽이 패킷을 DROP할 때, 또는 서버 자체가 네트워크에서 도달 불가능할 때 발생한다.
Q. 서버에 콘솔 접근이 안 되는데 SSH도 안 되면?
클라우드라면 웹 콘솔(AWS EC2 Instance Connect, GCP Serial Console)을 사용한다. 물리 서버라면 IPMI/iLO/iDRAC 같은 원격 관리 인터페이스로 접근한다. 그것도 없으면 데이터센터에 가서 직접 모니터와 키보드를 연결해야 한다.
Q. sshd_config를 수정할 때 SSH 접속이 끊기지 않나?
systemctl restart sshd를 해도 이미 연결된 세션은 끊기지 않는다. 새 접속만 새 설정이 적용된다. 그래서 sshd_config를 수정한 뒤에는 기존 SSH 세션을 유지한 채로 다른 터미널에서 새 접속을 시도해서 테스트하는 게 안전하다.
Q. SSH 포트를 변경하면 보안이 좋아지나?
포트 변경은 보안 강화가 아니라 소음 감소에 가깝다. 자동 스캐너가 22번 포트를 타겟으로 무차별 대입 공격을 하는 것을 줄여줄 뿐이다. 진짜 보안은 키 인증 전환, 루트 로그인 차단, Fail2ban 같은 조치가 필요하다.
Q. sshd -t와 sshd -d의 차이는?
sshd -t는 설정 파일의 문법만 검증한다 — 오타, 잘못된 옵션명을 잡는다. sshd -d실제로 sshd를 포그라운드에서 실행하면서 디버그 로그를 출력한다 — ListenAddress 바인딩 실패처럼 문법은 맞지만 런타임에서 실패하는 문제를 잡는다.

📌 이 글 핵심 요약
SSH Connection refused는 sshd 중지, 포트 변경, 방화벽 차단, 설정 오류, ListenAddress 오류 5가지가 주요 원인이다
ss -tlnp | grep sshd로 sshd가 어떤 포트에서 돌고 있는지 즉시 확인할 수 있다
sshd -t로 설정 문법을 검증하고, sshd -d로 런타임 에러를 잡는다
sshd_config 수정 전에는 반드시 백업하고, 기존 세션을 유지한 채 새 접속으로 테스트한다