SSH 'Connection closed by remote host' & 'reset by peer' 5분 진단·복구
"비밀번호도 안 물어보고 끊겼다" — 인증 전 끊김이 보내는 신호
급한 마음에 서버에 접속하려는데 화면이 이렇게 뜹니다.
ssh_exchange_identification: Connection closed by remote host
# 또는
kex_exchange_identification: read: Connection reset by peer여기서 가장 중요한 사실 하나. 이건 우리가 흔히 보는 Permission denied (publickey)나 Too many authentication failures와 완전히 다른 단계의 에러입니다.
| 에러 메시지 | 끊긴 단계 | 의미 |
|---|---|---|
Permission denied (publickey) | 인증 단계 | 연결은 됐고 키/비번이 틀림 |
Too many authentication failures | 인증 단계 | 키를 너무 많이 시도함 |
ssh_exchange_identification: Connection closed | 연결 핸드셰이크 단계 | 인증 시도 전에 서버/네트워크가 끊음 |
Connection reset by peer | 핸드셰이크/배너 교환 단계 | 상대가 TCP 세션을 강제로 끊음 |
즉 이 두 에러는 **"내가 인증을 시도하기도 전에 서버 혹은 중간 네트워크가 세션을 끊어버렸다"**는 신호입니다. 비밀번호 프롬프트조차 못 봤다면 키 문제를 아무리 뒤져도 답이 안 나옵니다. 방향을 차단·과부하·데몬·방화벽 쪽으로 돌려야 합니다.
공통 진단 도구: ssh -vvv 로그 한 줄로 방향 잡기
가장 먼저 verbose 로그를 찍어 어디서 멈췄는지 확인합니다.
ssh -vvv user@host판독 포인트는 단 하나, 어느 줄 직후에 끊기느냐입니다.
debug1: Connecting to host [IP] port 22.직후 멈춤 → TCP 연결 자체가 거부/리셋 (방화벽·hosts.deny·fail2ban ban 의심)debug1: Connection established.까지는 가는데 배너(Remote protocol version) 전에 끊김 → MaxStartups 드롭, SYN flood 보호, sshd 과부하 의심- 배너는 받았는데
SSH2_MSG_KEXINIT전후로 끊김 → AllowUsers/DenyUsers 미스매치, sshd 비정상 의심
6가지 원인 진단 분기 표
증상 / -vvv 로그 위치 | 의심 원인 | 서버 측 검증 명령어 | 복구 명령어 |
|---|---|---|---|
Connecting to... 직후 reset, 특정 IP만 | ① fail2ban ban | fail2ban-client status sshd | fail2ban-client set sshd unbanip <IP> |
Connecting to... 직후 closed | ② TCP Wrappers 거부 | grep -nE 'ssh|sshd' /etc/hosts.deny /etc/hosts.allow | hosts.deny에서 해당 줄 삭제/수정 |
| 동시 접속 폭주 시에만 closed | ③ MaxStartups 초과 | sshd -T | grep -i maxstartups | MaxStartups 값 상향 후 reload |
| 배너 받은 뒤 closed, 특정 계정만 | ④ Allow/Deny 미스매치 | sshd -T | grep -iE 'allowusers|denyusers|allowgroups' | sshd_config 수정 후 reload |
| 간헐적/재부팅 후 잠깐만 동작 | ⑤ sshd 데몬 비정상 | systemctl status sshd / journalctl -u sshd -n 50 | systemctl restart sshd |
| 특정 망에서만 timeout/reset | ⑥ 방화벽·보안그룹·SYN flood | iptables -L -n --line-numbers | grep 22 | 포트 22 허용 / 보안그룹 IP 추가 |
클라이언트에서 못 풀면 미루지 말고 클라우드 콘솔의 시리얼 접속으로 넘어가세요. SSH가 막힌 상태에서 SSH로 들어가려는 무한 루프를 피하는 게 핵심입니다.
원인 1~3: 차단·과부하 계열
① fail2ban / sshd 자동 차단으로 내 IP가 ban
클라우드 서버에 fail2ban이 기본 적용되는 경우가 늘면서, 정상 사용자가 키 몇 번 잘못 넣고 스스로 차단되는 사례가 급증했습니다.
fail2ban-client status sshd
iptables -L -n --line-numbers | grep <IP>
fail2ban-client set sshd unbanip <IP>Banned IP list에 내 공인 IP가 있으면 정답입니다. (fail2ban이 동작 자체를 안 하는 별도 이슈는 'fail2ban 차단 안 됨' 트러블슈팅 글을 참고하세요.)
② TCP Wrappers 거부 (hosts.deny)
오래된 운영 서버나 보안 템플릿에서 자주 나옵니다.
grep -nE 'ssh|sshd' /etc/hosts.deny /etc/hosts.allow/etc/hosts.deny에 sshd: ALL 또는 특정 대역이 있으면 해당 줄을 주석 처리하거나, /etc/hosts.allow에 내 IP를 먼저 등록합니다(allow가 deny보다 우선).
③ MaxStartups·MaxSessions 초과로 드롭
IaC·CI/CD·Ansible 환경에서 동시 SSH 연결이 폭주하면 인증 전 세션이 무작위로 드롭됩니다. 이게 요즘 부쩍 늘어난 케이스입니다.
sshd -T | grep -i maxstartups
# 예: maxstartups 10:30:100 (10개 넘으면 30% 확률 드롭, 100개에서 전부 거부)동시 작업이 많다면 sshd_config에 MaxStartups 30:50:200 처럼 상향하고 systemctl reload sshd.
원인 4~6: 설정·데몬·방화벽 계열
④ AllowUsers / DenyUsers / AllowGroups 미스매치
배너까지는 받는데 특정 계정만 끊긴다면 접근 제어 설정을 봅니다.
sshd -T | grep -iE 'allowusers|denyusers|allowgroups'내 계정이 AllowUsers에 빠져 있거나 DenyUsers/그룹에 걸렸다면 수정 후 reload 합니다.
⑤ sshd 데몬 비정상
설정 오타로 reload가 실패했거나 데몬이 죽기 직전이면 간헐적으로 끊깁니다.
systemctl status sshd
journalctl -u sshd -n 50 --no-pager
sshd -t # 설정 문법 검사
systemctl restart sshdsshd -t로 문법을 먼저 검사한 뒤 재시작하는 습관을 들이면 self-lockout을 크게 줄일 수 있습니다.
⑥ 방화벽 / 보안그룹 / SYN flood 보호
"로컬에선 되는데 회사망에서만 안 된다"면 거의 IP 기반 차단입니다.
iptables -L -n --line-numbers | grep 22
ufw status numberedAWS는 보안 그룹 인바운드 22번에 현재 공인 IP가 있는지, GCP는 VPC 방화벽 규칙을 확인합니다. 커널 SYN flood 보호(net.ipv4.tcp_syncookies)나 클라우드 DDoS 보호가 정상 트래픽을 일시 차단하는 경우도 있습니다.
자기 잠금(self-lockout) 복구 — 콘솔 시리얼 접속
이제 콘솔 시리얼 접속은 사실상 표준 복구 수단입니다. SSH가 완전히 막혔어도 들어갈 수 있습니다.
AWS EC2 Serial Console
- EC2 콘솔 → 인스턴스 선택 → Connect → EC2 Serial Console
- (사전: 계정 설정에서 Serial Console 활성화 + 인스턴스에 OS 로그인 비밀번호 설정 필요, Nitro 기반)
- 접속 후 OS 계정으로 로그인 → 위 명령으로 fail2ban unban / hosts.deny 수정 / 방화벽 해제
GCP Serial Console
- Compute Engine → VM 인스턴스 → 연결 → 직렬 콘솔에 연결
- 메타데이터에
serial-port-enable=true설정 및 직렬 콘솔 비밀번호 로그인 활성화 - 로그인 후 차단 규칙 해제
실무 한 마디
직접 겪은 일인데, Ansible로 50대 서버에 동시 배포를 돌리다 점프 호스트가 Connection reset by peer를 뱉기 시작한 적이 있습니다. 원인은 fail2ban도 방화벽도 아닌 MaxStartups 10:30:100이었죠. 동시 핸드셰이크가 10개를 넘자 30% 확률로 조용히 드롭된 겁니다. 로그에 에러가 거의 안 남아 한참 헤맸는데, **"인증 전 끊김 = 차단 또는 과부하"**라는 원칙으로 접근하자 5분 만에 잡혔습니다. 자동화 환경이라면 MaxStartups 점검을 체크리스트 1순위에 두세요.
5분 체크리스트
ssh -vvv user@host→ 어디서 멈추는지 확인Connecting...직후 reset →fail2ban-client status sshd→ unban- closed면
grep -nE 'ssh|sshd' /etc/hosts.deny /etc/hosts.allow - 동시 접속 시에만 →
sshd -T | grep -i maxstartups - 특정 계정만 →
sshd -T | grep -iE 'allowusers|denyusers|allowgroups' - 간헐적 →
journalctl -u sshd -n 50 --no-pager→systemctl restart sshd - 특정 망만 → 방화벽·보안그룹 22번 IP 확인
- 다 막혔으면 → 콘솔 시리얼 접속으로 복구
재발 방지: fail2ban ignoreip에 관리 IP를 등록하고, 설정 변경 시 반드시 별도 SSH 세션을 하나 더 열어둔 채 작업하세요. 새 세션으로 접속 확인 전까지 기존 세션을 닫지 않는 게 self-lockout 최고의 예방책입니다.
자주 묻는 질문 (FAQ)
Q1. ping은 되는데 SSH만 끊깁니다. 네트워크 문제인가요?
A. 아닙니다. ping(ICMP)이 된다는 건 호스트가 살아있다는 뜻일 뿐입니다. SSH만 끊기면 22번 포트에 대한 차단(fail2ban, hosts.deny, 방화벽/보안그룹) 또는 sshd 자체 문제입니다. ssh -vvv로 끊기는 지점부터 확인하세요.
Q2. 평소엔 되는데 동시에 여러 접속을 할 때만 끊깁니다.
A. MaxStartups 드롭이 유력합니다. sshd -T | grep -i maxstartups로 임계값을 확인하고, CI/CD나 Ansible처럼 동시 연결이 많다면 값을 상향(MaxStartups 30:50:200)한 뒤 systemctl reload sshd 하세요.
Q3. 재부팅하면 잠깐 접속되다가 다시 끊깁니다.
A. fail2ban이 부팅 후 로그를 다시 읽고 재차 ban하는 패턴입니다. fail2ban-client status sshd로 ban 여부를 확인하고, ignoreip에 관리 IP를 등록해 근본적으로 막으세요.
Q4. 집/모바일에선 되는데 회사망에서만 끊깁니다.
A. IP 기반 차단입니다. 회사 공인 IP가 hosts.deny에 있거나, fail2ban에 ban됐거나, 클라우드 보안그룹/방화벽 22번 인바운드에서 빠진 경우입니다. 회사 공인 IP를 확인해 allow 목록·보안그룹에 추가하세요.
이 글은 AI 에이전트가 1차 초안을 작성한 뒤, 사람 편집자가 사실관계·출처·톤과 맥락을 검토하여 발행했습니다. 오류나 부정확한 내용이 확인되면 24시간 이내에 정정합니다.
댓글
불러오는 중...