Connection refused다. Rocky Linux 9 환경에서 5가지 원인을 직접 재현하고, 각각의 진단 명령어와 해결법을 정리했다.$ ssh root@192.168.1.100 ssh: connect to host 192.168.1.100 port 22: Connection refused
이 메시지는 서버의 22번 포트에 접속할 수 없다는 뜻이다. 서버가 꺼져 있거나, 포트가 막혀 있거나, 아예 다른 포트에서 동작하고 있거나. 원인은 크게 5가지로 나뉜다.
| # | 원인 | 핵심 진단 명령어 |
|---|---|---|
| 1 | sshd 서비스가 중지됨 | systemctl status sshd |
| 2 | SSH 포트가 변경됨 | ss -tlnp | grep sshd |
| 3 | 방화벽이 포트를 차단 | iptables -L INPUT -n |
| 4 | sshd_config 문법 오류 | sshd -t |
| 5 | ListenAddress 잘못 설정 | /usr/sbin/sshd -d |
가장 흔한 원인이다. sshd 데몬이 꺼져 있으면 당연히 접속이 안 된다. 서버를 재부팅했는데 sshd가 자동 시작되지 않도록 설정된 경우에 발생한다. 또는 누군가 실수로 systemctl stop sshd를 실행한 경우다.
$ ps aux | grep sshd | grep -v grep # 아무것도 출력 안 됨 → sshd 프로세스가 없다
$ ss -tlnp | grep :22 # 출력 없음 → 22번 포트를 듣고 있는 프로세스가 없다
$ 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가 나오면 재부팅 후에도 자동으로 올라온다.보안을 위해 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번에서 리스닝 중이다.
$ 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 --reloadsshd는 정상 실행 중인데, 방화벽이 22번 포트를 막고 있는 경우다. 이때는 Connection refused 대신 응답 없이 타임아웃이 발생할 수도 있다. iptables에서 DROP으로 차단하면 타임아웃, REJECT로 차단하면 Connection refused가 뜬다.
$ 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 -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 규칙이 사라짐
$ firewall-cmd --permanent --add-service=ssh success $ firewall-cmd --reload success
설정 파일을 수정하다가 오타나 잘못된 옵션이 들어가면, sshd 재시작에 실패한다. 이전 프로세스가 이미 종료된 상태라면 SSH 접속이 완전히 불가능해진다. 그래서 sshd_config를 수정하기 전에는 반드시 백업을 해야 하고, 수정 후에는 문법 검증을 돌려야 한다.
$ 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
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak — 설정을 망치면 SSH 접속 자체가 불가능해지기 때문에, 복원할 수단이 있어야 한다.이 경우가 가장 까다롭다. sshd가 특정 IP에만 바인딩하도록 ListenAddress를 설정했는데, 해당 IP가 서버에 존재하지 않으면 sshd 기동 자체가 실패한다. 문제는 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이므로 바인딩에 실패한 것이다.
$ 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를 만났을 때, 이 순서대로 확인하면 원인을 빠르게 찾을 수 있다.
| 항목 | 버전 |
|---|---|
| OS | Rocky Linux 9.3 (Blue Onyx) |
| OpenSSH | 8.7 |
Connection refused는 서버가 "이 포트에 아무것도 없다"고 즉시 응답하는 것이다. sshd가 꺼져 있거나 다른 포트에서 동작할 때 발생한다. Connection timed out은 서버가 아예 응답하지 않는 것이다. 방화벽이 패킷을 DROP할 때, 또는 서버 자체가 네트워크에서 도달 불가능할 때 발생한다.systemctl restart sshd를 해도 이미 연결된 세션은 끊기지 않는다. 새 접속만 새 설정이 적용된다. 그래서 sshd_config를 수정한 뒤에는 기존 SSH 세션을 유지한 채로 다른 터미널에서 새 접속을 시도해서 테스트하는 게 안전하다.sshd -t는 설정 파일의 문법만 검증한다 — 오타, 잘못된 옵션명을 잡는다. sshd -d는 실제로 sshd를 포그라운드에서 실행하면서 디버그 로그를 출력한다 — ListenAddress 바인딩 실패처럼 문법은 맞지만 런타임에서 실패하는 문제를 잡는다.ss -tlnp | grep sshd로 sshd가 어떤 포트에서 돌고 있는지 즉시 확인할 수 있다sshd -t로 설정 문법을 검증하고, sshd -d로 런타임 에러를 잡는다