Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

SSH “kex_exchange_identification: Connection closed”? 인증 전 경계를 먼저 맞추세요

일반 로그인 실패보다 이른 단계입니다. 실제 경로와 클라이언트 중단 지점을 고정하고 같은 시각의 경계 장비와 sshd 로그를 연결해 실제로 소켓을 닫은 곳만 수정합니다.

SSH “kex_exchange_identification: Connection closed”? 인증 전 경계를 먼저 맞추세요
원본 일러스트: 서버 식별 줄과 첫 키 교환 메시지를 찾습니다. SSH banner가 없다면 사용자 키보다 listener와 진입 경로를 먼저 조사합니다. Watch at Ease

kex_exchange_identification: Connection closed by remote host는 개인 키 오류를 입증하지 않습니다. TCP가 어떤 상대에 도달했지만 SSH 식별 또는 초기 키 교환 부근에서 끝났으므로 일반 사용자 인증 진단보다 앞선 문제입니다.

클라이언트, 네트워크 진입점, SSH 데몬의 세 관점으로 타임라인을 만드세요. 같은 메시지도 잘못된 포트, 프록시·방화벽, sshd 시작 제한, 소스 페널티, 명시적 거부에서 나올 수 있습니다.

실제 끝점과 한 번의 실패 시각 고정

호스트, 해석 주소, 포트, 소스, ProxyJump/ProxyCommand, VPN, 호출자를 기록하고 UTC 시각 하나와 전체 ssh -vvv를 저장합니다.

익숙한 이름이 예상 sshd에 도달한다고 가정하지 마세요. LB, NAT, 제어판 포트, 점프 호스트, 오래된 DNS는 TCP를 받은 뒤 인증 전에 닫을 수 있습니다.

클라이언트가 도달한 마지막 프로토콜 경계 표시

서버 식별 줄과 첫 키 교환 메시지를 찾습니다. SSH banner가 없다면 사용자 키보다 listener와 진입 경로를 먼저 조사합니다.

RFC 4253은 연결 뒤 양쪽 식별 문자열을 요구합니다. 여기서 종료는 전송/인증 전 관찰이며 authorized_keys 거부 증거가 아닙니다.

진입점 결정과 sshd 인증 전 로그 연결

같은 시각의 방화벽, NAT, LB, proxy, host security와 sshd journal을 읽고 어느 backend가 소켓을 받았는지 확인합니다.

소스에 적용되는 Match를 포함한 실제 sshd 값을 읽습니다. 무제한 전역 debug 대신 범위가 있는 임시 로그를 쓰고 사용자 정보를 보호합니다.

제한이나 키 변경 전 종료 원인 분류

잘못된 대상, listener 부재, MaxStartups, 소스 제한, penalty, RefuseConnection, LoginGraceTime, 외부 정책을 분리하고 증거로 분기를 고릅니다.

포럼에 MaxStartups가 나온다는 이유만으로 높이지 마세요. 부하만 늘리고 잘못된 경로나 공격, 소스 정책은 고치지 못할 수 있습니다.

최소 수정 하나와 전진 검증

입증된 route, proxy/backend, Match 규칙, 허용된 monitor 예외 또는 용량만 수정합니다.

알려진 소스에서 한 번 재시도해 올바른 SSH 식별, 같은 sshd 기록, 예상 인증 도달을 확인한 뒤 보호를 전역 해제하지 않고 실제 명령 하나를 실행합니다.

SSH “kex_exchange_identification: Connection closed”? 인증 전 경계를 먼저 맞추세요
원본 일러스트: 같은 시각의 방화벽, NAT, LB, proxy, host security와 sshd journal을 읽고 어느 backend가 소켓을 받았는지 확인합니다. Watch at Ease