웹 개발
SSH가 갑자기 안 될 때 확인하는 체크리스트
서버 접속이 끊어지는 문제는 네트워크, 포트, 권한이 복합적으로 얽혀있다. 체계적인 확인 순서가 필요하다.
SSH 접속 실패의 세 가지 원인
- 네트워크: 도메인/IP가 맞는가, 포트는 열려있는가
- 서비스: SSH 프로세스가 실제로 실행 중인가
- 인증: 키 파일 권한, 계정 정보가 정확한가
가장 흔한 실수는 여러 원인을 동시에 의심하는 것이다. 한 가지씩 확인해야 한다.
네트워크부터 확인
# 1. 도메인 해석이 되는가
nslookup example.com
# 2. 포트가 열려있는가 (로컬에서)
nc -zv example.com 22
# 3. 방화벽이 차단하는 건 아닌가
sudo iptables -L | grep 22
도메인 이름이 해석되지 않으면 DNS 문제다. IP는 맞는데 포트가 닫혀있으면 방화벽이나 라우터 설정을 확인해야 한다.
서버 쪽 SSH 프로세스 확인
서버에 직접 접속할 수 있다면 (또는 이전에 다른 세션이 열려있다면):
# SSH 서비스 상태
sudo systemctl status ssh
# 포트 바인딩 확인
sudo ss -lntp | grep 22
# SSH 설정 확인
sudo sshd -t # 설정 문법 검사
# 최근 로그
sudo journalctl -u ssh -n 50
특히 설정 파일(/etc/ssh/sshd_config)을 수정한 후 재시작하지 않으면 변경사항이 적용되지 않는다.
키 파일 권한 확인
# 홈 디렉토리
ls -la ~/.ssh/
# 권한은 drwx------ (700) 이어야 함
# 개인키 파일
ls -la ~/.ssh/id_rsa
# 권한은 -rw------- (600) 이어야 함
권한이 너무 풀려있으면 SSH는 보안상 그 키를 거부한다. 특히 authorized_keys는 600 권한이어야 한다.
실제 디버깅
# 상세 로그를 보면서 시도
ssh -vvv [email protected]
# 어디서 막히는지 명확하게 보인다
# "Permission denied (publickey)" - 인증 실패
# "Connection refused" - 포트가 닫혀있거나 서비스 중단
# "Connection timed out" - 네트워크 문제
각 경우의 해결책이 다르므로 정확한 에러 메시지를 파악하는 게 중요하다. 문제를 해결한 후 어떤 원인이었는지, 다음에는 어떻게 할지 기록해두면 반복을 줄일 수 있다.