SSH 접속 안될 때 확인해야 할 것들 (Connection refused, timed out 해결)
리눅스 서버를 사용하다 보면 한 번쯤은 SSH 접속 안될 때 어디부터 봐야 할지 막막한 상황을 겪게 된다. 평소에는 잘 접속되던 서버인데 어느 날 갑자기 접속이 되지 않으면 생각보다 당황스럽다. 특히 서버 작업을 하다가 연결이 끊긴 뒤 다시 접속이 되지 않는 경우라면 더 그렇다. 필자도 서버를 관리하면서 이런 상황을 꽤 여러 번 겪어 봤다.
SSH 접속이 되지 않는 원인은 생각보다 다양하지만 대부분은 몇 가지 기본적인 문제에서 발생한다. 이 글에서는 실제로 겪었던 경험을 기준으로 SSH 접속 안될 때 확인해 볼 것들을 에러 메시지 → 서버 → 클라이언트 순서로 정리해 보았다.

SSH 접속 안될 때 에러 메시지부터 확인하자
무작정 이것저것 건드리기 전에 터미널에 찍힌 에러 메시지부터 보자. 메시지만 봐도 문제가 서버에 있는지, 네트워크에 있는지, 인증에 있는지 대략 범위를 좁힐 수 있다.
| 에러 메시지 | 의미 | 먼저 볼 곳 |
|---|---|---|
Connection refused | 서버까지는 도달했지만 그 포트에서 SSH가 응답하지 않음 | sshd 실행 여부, 포트 번호 |
Connection timed out | 요청이 서버까지 가지 못하거나 응답이 오지 않음 | 방화벽, 클라우드 보안 그룹, IP 주소 |
No route to host | 서버로 가는 경로가 없거나 방화벽이 거부함 | 네트워크, 방화벽 |
Permission denied (publickey) | 서버에는 붙었지만 인증에 실패함 | 키 파일, 키 권한, 사용자 이름 |
Host key verification failed | 저장해 둔 서버 지문과 현재 서버 지문이 다름 | known_hosts |
Connection closed by ... | 서버가 접속을 받은 뒤 바로 끊음 | fail2ban 차단, sshd 설정 |
메시지만으로 감이 오지 않는다면 -v 옵션을 붙여서 접속해 보자. 어느 단계까지 진행되다가 멈추는지 자세히 보여 준다. v를 2~3개 붙이면 더 자세히 나온다.
ssh -v user@server-ipSSH 접속 안될 때 서버에서 확인할 것
서버 쪽 점검은 서버에 들어갈 수 있어야 가능하다. SSH가 안 되는 상황이라면 클라우드 서비스의 웹 콘솔(브라우저 SSH, 시리얼 콘솔)이나 서버에 직접 연결한 모니터로 들어가서 확인하자.
1. SSH 서비스가 실행 중인지 확인
가장 먼저 확인해야 할 것은 SSH 서비스가 정상적으로 실행 중인지 여부다. Ubuntu 계열은 서비스 이름이 ssh, CentOS·RHEL 계열은 sshd다.
sudo systemctl status sshsudo systemctl status sshd
만약 서비스가 실행 중이 아니라면 다음 명령어로 다시 시작할 수 있다. systemctl 사용법은 리눅스 서비스 관리(systemctl) 글에 정리해 두었다.
sudo systemctl start ssh
여기서 해결이 된다면 다행이다. SSH 서비스가 중지되어 있다면 당연히 외부에서 접속이 되지 않는다. 의외로 이렇게 단순한 이유로 접속이 안 되는 경우가 종종 있다. 재부팅 후에도 자동으로 올라오게 하려면 sudo systemctl enable ssh도 함께 해 두자.
2. SSH 포트가 열려 있는지 확인
첫 번째 방법으로 해결되지 않았다면 포트를 확인할 차례다. SSH는 기본적으로 22번 포트를 사용한다. 서버에서 sshd가 실제로 어떤 포트를 듣고 있는지 확인해 보자. 포트를 바꿔서 쓰고 있다면 그 포트가 보여야 정상이다.
sudo ss -tlnp | grep ssh
예전 시스템이라면 netstat으로도 같은 정보를 볼 수 있다. 두 명령어의 차이는 리눅스 네트워크 확인 명령어(netstat/ss) 글을 참고하자. 만약 sshd가 생각한 포트를 듣고 있지 않다면 설정 파일을 확인해야 한다.
sudo netstat -tlnp | grep ssh
참고로 Ubuntu 22.10 이후 버전(24.04 포함)은 SSH가 소켓 방식으로 동작해서, 설정 파일의 Port만 바꾸고 ssh만 재시작하면 포트가 바뀌지 않을 수 있다. 이때는 아래처럼 소켓까지 다시 읽어 줘야 한다. 포트 변경 과정은 리눅스 SSH 포트 변경 방법 글에 자세히 적어 두었다.
sudo systemctl daemon-reloadsudo systemctl restart ssh.socket3. SSH 설정 파일 확인
SSH 설정 파일이 변경된 경우에도 접속이 되지 않을 수 있다. 설정 파일은 보통 다음 경로에 있다.
sudo vi /etc/ssh/sshd_config
여기서 다음 항목들을 확인해 보는 것이 좋다.
- Port: 접속하려는 포트와 같은지
- PermitRootLogin: root로 접속하려는데 no로 막혀 있지 않은지
- PasswordAuthentication: 비밀번호로 접속하려는데 no로 꺼져 있지 않은지
- AllowUsers: 이 항목이 있다면 접속하려는 사용자가 목록에 들어 있는지
주의할 점은 /etc/ssh/sshd_config.d/ 폴더 안의 설정 파일이 본 설정을 덮어쓸 수 있다는 것이다. 클라우드 이미지로 만든 Ubuntu 서버는 이 폴더에 PasswordAuthentication 설정이 따로 들어 있는 경우가 많다. 본 파일을 고쳤는데도 그대로라면 이 폴더도 열어 보자.
그리고 설정을 바꾼 뒤에는 재시작하기 전에 반드시 문법 검사부터 하자. 아무것도 출력되지 않으면 정상이고, 오타가 있으면 몇 번째 줄이 잘못됐는지 알려 준다. 오타가 있는 채로 재시작하면 sshd가 아예 올라오지 않아서 접속이 완전히 끊길 수 있다.
sudo sshd -tsudo systemctl restart ssh4. 방화벽 설정 확인
SSH 서비스가 실행 중인데도 접속이 되지 않는다면 방화벽 설정을 확인해야 한다. Ubuntu 서버라면 ufw, CentOS·RHEL 계열이라면 firewalld를 확인하자.
sudo ufw status
확인 시 SSH 포트가 허용되어 있지 않다면 다음과 같이 추가할 수 있다. 포트를 바꿨다면 22 대신 바꾼 포트 번호를 넣어야 한다.
sudo ufw allow 22/tcpsudo firewall-cmd --list-all
당연하지만 방화벽이 SSH 포트를 막고 있으면 외부에서는 서버에 접속할 수 없다. 그리고 AWS, Lightsail, 오라클 클라우드 같은 클라우드 서버는 OS 방화벽 말고도 콘솔에서 관리하는 보안 그룹(네트워킹 규칙)이 따로 있다. 서버 안에서 열어도 여기서 막혀 있으면 Connection timed out이 난다. 방화벽 설정 방법은 리눅스 방화벽 설정 방법(ufw/firewalld) 글에 정리해 두었다.
5. 인증 로그 확인
여기까지 이상이 없는데 접속이 안 된다면 서버의 인증 로그를 보는 것이 가장 빠르다. 접속을 시도하는 동안 로그를 띄워 두면 왜 거부됐는지 그대로 찍힌다. Ubuntu는 auth.log, CentOS·RHEL 계열은 secure 파일이다.
sudo tail -f /var/log/auth.logsudo tail -f /var/log/secure
로그 파일이 없거나 비어 있다면 journalctl로 SSH 서비스 로그만 골라 볼 수 있다. tail -f와 journalctl 사용법도 함께 참고하자.
sudo journalctl -u ssh -f6. fail2ban에 차단되지 않았는지 확인
fail2ban을 쓰고 있다면 비밀번호를 몇 번 틀린 내 IP가 차단됐을 수도 있다. 접속하자마자 끊기거나 timed out이 난다면 의심해 볼 만하다. 차단 목록을 확인하고, 내 IP가 있다면 풀어 주면 된다.
sudo fail2ban-client status sshdsudo fail2ban-client set sshd unbanip 203.0.113.10SSH 접속 안될 때 클라이언트에서 확인할 것
서버 IP 주소 확인
서버 쪽에 이상이 없다? 그러면 혹시나 하는 마음으로 아이피를 확인해 보자. 의외로 자주 발생하는 문제 중 하나가 IP 주소 변경이다. 특히 클라우드 서버는 고정 IP를 붙이지 않은 상태에서 서버를 껐다 켜면 공인 IP가 바뀐다. 접속하려는 서버의 IP와 사용자 이름이 맞는지 다시 한번 확인해 보는 것이 좋다.
ssh user@server-ip
IP 주소가 바뀌었다면 당연히 기존 주소로는 접속이 되지 않는다. 그래도 여기서 확인이 되었다면 Lucky다.
네트워크와 포트 연결 확인
서버가 정상적으로 실행 중이더라도 네트워크가 차단되어 있다면 SSH 접속이 되지 않는다. 간단하게 ping으로 서버 연결 상태를 확인할 수 있다.
ping server-ip
다만 클라우드 서버는 ping(ICMP)을 기본으로 막아 두는 경우가 많아서, ping이 안 된다고 무조건 네트워크 문제는 아니다. 이럴 때는 nc로 SSH 포트에 직접 연결이 되는지 보는 것이 더 정확하다. succeeded가 나오면 포트까지는 열려 있다는 뜻이다.
nc -zv server-ip 22키 파일과 권한 확인
Permission denied (publickey)가 난다면 키 문제다. 우선 접속할 때 올바른 키 파일을 지정했는지 확인하자. 그리고 개인 키 파일 권한이 너무 열려 있으면 SSH가 아예 키를 쓰지 않는다. UNPROTECTED PRIVATE KEY FILE 경고가 보인다면 권한을 600으로 바꾸면 된다.
ssh -i ~/.ssh/my-key.pem user@server-ipchmod 600 ~/.ssh/my-key.pem
서버 쪽에서도 ~/.ssh 폴더는 700, authorized_keys 파일은 600이어야 한다. 권한 숫자가 헷갈린다면 리눅스 파일 권한(chmod/chown) 글을 참고하자.
Host key verification failed가 뜬다면
서버를 다시 설치했거나 같은 IP를 다른 서버가 쓰게 되면, 내 PC에 저장된 서버 지문(known_hosts)과 달라서 접속을 막는다. 서버를 재설치한 게 확실하다면 저장된 지문을 지우고 다시 접속하면 된다. 반대로 서버를 건드린 적이 없는데 이 메시지가 떴다면 함부로 지우지 말고 원인을 먼저 확인해야 한다.
ssh-keygen -R server-ip마무리하며
필자의 경험으로 보면 SSH 접속 안될 때 대부분은 다음 문제에서 발생한다.
- SSH 서비스 중지
- 방화벽 또는 클라우드 보안 그룹 차단
- 포트 설정 문제
- 서버 IP 변경
- SSH 설정 오류
- 키 파일 권한이나 인증 문제
그중에서도 서비스 상태나 방화벽 설정 문제인 경우가 가장 많았다. 솔직히 여기까지 봤는데 특이사항이 없다면 본인이 어딘가 설정 파일에 오타를 입력했을 확률도 상당히 높다. sshd -t로 설정 파일을 다시 한번 점검해 보자. 각 설정 항목의 정확한 의미는 OpenSSH sshd_config 공식 문서에서 확인할 수 있다.
SSH 접속이 되지 않을 때는 당황하기보다는 위에서 정리한 항목들을 하나씩 확인해 보면 의외로 쉽게 해결되는 경우가 많다. 접속은 되는데 자꾸 끊긴다면 리눅스 서버 세션 타임아웃 방지 글을, 아이패드에서 접속하고 싶다면 아이패드에서 SSH 접속하는 방법 글을 참고하자. 당황하지 말고 차근차근 확인해 보자.
한 줄 정리
SSH 접속 안될 때는 에러 메시지 → 서비스 상태 → 포트 → 방화벽 → 인증 로그 → IP·키 순서로 확인하면 대부분 해결된다.
첫 댓글을 남겨보세요