SSH가 키 입력마다 100개의 패킷을 보내는 이유

2 weeks ago 11

  • SSH 세션에서 단일 키 입력 시 수백 개의 패킷이 전송되는 현상이 발견되어 원인을 추적한 사례
  • tcpdump 분석 결과, 대부분의 패킷이 36바이트 크기의 반복 메시지로 구성되어 있었으며, 약 20ms 간격으로 발생
  • 원인은 2023년 SSH에 추가된 ‘키 입력 타이밍 난독화(keystroke timing obfuscation)’ 기능으로, 사용자의 입력 타이밍을 숨기기 위해 다수의 ‘chaff’ 패킷(SSH2_MSG_PING) 을 전송함
  • 이 기능을 비활성화하거나 서버가 [email protected] 확장을 광고하지 않도록 수정하면 CPU 사용률과 대역폭이 절반 이하로 감소
  • SSH의 보안 기능이 실시간 성능이 중요한 애플리케이션(예: 게임) 에서는 큰 부하로 작용할 수 있음을 보여주는 사례

문제 발견

  • SSH를 통해 실행되는 고성능 게임의 TUI를 테스트하던 중, 단일 키 입력에도 270개의 패킷이 발생하는 현상 확인
    • tcpdump 결과, 66%가 36바이트 메시지, 33%가 TCP ACK, 나머지는 소량의 기타 데이터
    • 평균 90패킷/초, 약 11ms 간격으로 데이터 전송
  • 테스트 중 서버가 “your screen is too small” 메시지만 보내도록 잘못 설정되었는데, 이때 CPU와 대역폭 사용량이 절반으로 감소
    • 게임 데이터가 전송되지 않아야 CPU 사용이 0%에 가까워야 하지만, 여전히 50% 수준 유지
    • 이로 인해 SSH 자체의 통신 오버헤드 가능성 제기

조사 과정

  • tcpdump를 이용해 정상 동작과 오류 상태의 SSH 트래픽을 비교
    • 오류 상태에서도 36바이트 패킷이 20ms 간격으로 지속 발생
    • MacOS 기본 SSH 클라이언트에서도 동일한 패턴 확인
  • Claude Code를 이용해 pcap 파일을 분석한 결과
    • 전체 413,703개 패킷 중 66%가 36바이트, 34%가 0바이트 ACK
    • SSH 클라이언트가 주도적으로 패킷을 생성하고 있었음

근본 원인

  • SSH 디버그 로그(ssh -vvv)에서 다음 메시지 확인 obfuscate_keystroke_timing: starting: interval ~20ms obfuscate_keystroke_timing: stopping: chaff time expired (101 chaff packets sent)
    • 20ms 간격수십~백여 개의 chaff 패킷이 실제 관찰된 패턴과 일치
  • 2023년 SSH에 추가된 키 입력 타이밍 난독화 기능이 원인
    • 사용자의 타이핑 속도 패턴이 노출되는 것을 막기 위해 무작위 ‘chaff’ 패킷을 전송
    • 보안에는 유용하지만, 지연(latency) 이 중요한 환경에서는 과도한 부하 발생

해결 방법

  • 클라이언트 측에서 ObscureKeystrokeTiming=no 옵션으로 기능 비활성화 가능
    • 적용 후 CPU 사용률과 대역폭이 크게 감소, 데이터 전송 정상 유지
  • 서버 측 대응을 위해 Go의 SSH 라이브러리에서 [email protected] 확장 광고를 제거
    • 관련 커밋을 되돌린 후 테스트한 결과
      • CPU 사용률 29.9% → 11.6% ,
        시스템 호출 3.10s → 0.66s,
        암호화 연산 1.6s → 0.11s,
        대역폭 6.5Mbit/s → 3Mbit/s
    • 성능이 50% 이상 향상

LLM을 활용한 디버깅 경험

  • Claude Code를 이용해 tcpdump, tshark 분석을 자동화하며 문제 원인을 빠르게 좁힘
    • 명령 실행 과정을 실시간으로 관찰하며 정신적 모델 유지 가능
  • ChatGPT는 SSH의 동작을 “정상”이라 잘못 판단하는 등 모델 간 차이도 경험
  • LLM이 문제 해결의 전 과정을 대체하지는 않지만, 보조 분석 도구로서 높은 효율성을 보임
  • 인간의 추론과 LLM의 분석을 결합해 복잡한 네트워크 성능 문제를 해결한 사례

Read Entire Article