SSH ClientAliveCountMax 설정이 작동하지 않는 것 같고 사용자 연결이 끊어집니다.

SSH ClientAliveCountMax 설정이 작동하지 않는 것 같고 사용자 연결이 끊어집니다.

내 Ubuntu Linux 서버 파일 구성 /etc/ssh/sshd_config은 다음과 같습니다.

ClientAliveInterval 60
ClientAliveCountMax 60

나는 연결을 유지하기 위해 서버가 60초 간격으로 60개의 빈 패킷을 보낸다고 가정합니다. 연결은 활성 상태로 유지되지만 무한한 시간 동안 유지되며 한 시간 정도 후에도 연결이 끊어지지 않습니다.

1시간 20분 동안 활동이 없는 후에 시도해 보았지만(아무 것도 입력하지 않고 SSH 터미널을 열어 두었습니다) 여전히 남아 있습니다.

무엇이 문제일까요?

답변1

'1시간 20분 동안 활동이 없음'을 의미하는 경우

  • 사용자가 1시간 20분 동안 셸에 입력하지 않았습니다.
  • 아니면 사용자가 ssh -N …1시간 20분 전에 사용했는지
  • 일반 상황: 데이터 전송 없이 1시간 20분

이 메커니즘의 경우 비활성 상태는 중요하지 않습니다 ClientAlive*.


이를 이해하기 위해 ClientAlive*견고한 관점에서 이미 존재하는 연결에 어떤 일이 발생할 수 있는지 분석해 보겠습니다 sshd.

  1. 클라이언트는 정상적으로 연결을 끊을 수 있습니다. 이 경우 서버는 연결이 종료된 것으로 ssh판단합니다 .sshd
  2. 실행 파일은 ssh어떤 이유로든(예: 강제 종료) 예기치 않게 종료될 수 있으므로 연결 끊기 의도를 전달하지 못합니다. 아직클라이언트 운영 체제는 TCP 연결을 정상적으로 닫을 수 있습니다., 따라서 sshd연결이 더 이상 존재하지 않음을 인식합니다.
  3. 어떤 이유로(예: 네트워크 케이블 분리로 인해) 전체 클라이언트 컴퓨터가 종료되거나 사라집니다. sshd전송할 데이터가 없기 때문에 클라이언트가 침묵하는지, 아니면 더 이상 존재하지 않기 때문에 클라이언트가 침묵하는지 지금은 알 수 있는 방법이 없습니다.

ClientAlive*메커니즘은 마지막 사례를 감지합니다. 서버는 클라이언트 활동 메시지를 보내고 클라이언트는 응답합니다(클라이언트가 있는 경우). 가끔은 이런데자동으로SSH 프로토콜에서. SSH를 전송 수단으로 사용하는 애플리케이션은 영향을 받거나 방해받지 않습니다.

ClientAliveInterval사용하는 설정은 ClientAliveCountMax서버가 요청하는 빈도와 연결이 종료된 것으로 간주하기 전에 응답하지 않는 시도 횟수를 구성합니다.

ServerAliveInterval및 의 도움으로 클라이언트는 비슷한 방식으로 끊어진 연결을 감지할 수 있습니다 ServerAliveCountMax.

TCP 연결을 위한 보다 일반적인 메커니즘(SSH에만 국한되지 않음)도 있습니다: TCP keepalives. 비교하다내 대답.

모든 종류의 Keepalive 패킷을 사용하면 연결 끝점에서 연결이 만료되었는지 여부를 감지할 수 있습니다. 또한 그들 사이의 연결을 "업데이트"합니다. 예를 들어, NAT를 사용하는 홈 라우터는 오랫동안 해당 연결에 속한 패킷을 볼 수 없으면 연결이 끊어진 것으로 인식할 수 있습니다. 이런 일이 발생하면 NAT 항목이 잊혀지고 결국 연결이 활성화되면 라우터가 이를 올바르게 처리할 수 없게 됩니다. 비교하다이 답변.


ssh아무것도 입력하지 않고 SSH 터미널을 열면 서버에서 생성된 클라이언트 활동 메시지에 대한 응답이 차단되지 않습니다 . 고객이 있으면 고객이 응답합니다.

한동안 셸과 상호 작용하지 않은 사용자를 로그아웃하려면 TMOUTshell: 또는 유사한 변수(셸에 따라)의 도움이 필요합니다. 하지만 사용자는 재구성할 수 있습니다.그들의껍데기.

ClientAlive*이 메커니즘을 대안으로 고려 하는 일부 가이드가 인터넷에 있습니다 TMOUT. 이제 여러분은 이것이 서로 다른 것임을 알고 있습니다.


OS가 사용자 "비활성"(예: 새 프로세스가 생성되지 않았거나 sshd실행 중이 거나 bash해당 지점을 통과하는 데이터가 없음)을 감지하는 방법이 있을 수 있습니다. 내가 그 사실을 알고 있더라도 SSH 연결을 종료하는 데 사용하지 않을 것입니다.바라보다비활성.

사용자가 SSH를 통해 포트 전달을 요청하면 어떻게 되나요? 전달된 포트에 대한 연결은 언제든지 들어올 수 있습니다. 포트를 사용하려는 애플리케이션은 전달이 포함된다는 사실을 알지 못한 채 무엇이든 될 수 있습니다. 사용자는 SSH를 사용하여 연결이 발생할 때까지 자동으로 기다리기를 원할 수 있습니다. 트래픽이 없다는 이유로 SSH 연결을 종료하는 IMO는 좋은 습관이 아닙니다. 클라이언트가 클라이언트 활동 메시지에 응답하는 동안 연결은 유지되어야 합니다.

귀하의 예에서는 고객이 응답했습니다.


고쳐 쓰다

2023에는 OpenSSH ChannelTimeoutUnusedConnectionTimeout사용할 수 있는 옵션이 도입되었습니다 sshd_config. 이러한 옵션이 바로 여러분에게 필요한 것입니다. 바라보다내 다른 답변더 알아보기.

관련 정보