ssh에서 tcp-keepalive는 어떻게 작동합니까?


84

"하트 비트"를 위해 ssh 연결을 사용하는 쉘 스크립트를 코딩하려고합니다. 특정 시간 초과 후 (연결이 끊어진 후) 해당 연결의 클라이언트 및 서버 측을 종료하고 싶습니다.

내가 지금까지 찾은 것 :

  • sshsshd에 대한 TCPKeepAlive 예 / 아니요
  • sshd에 대한 ClientAliveCountMax
  • sshd에 대한 ClientAliveInterval
  • ServerAliveCountMax 에 대한 SSH
  • ssh에 대한 ServerAliveInterval

"ClientAliveCountMax"를 변경하려면 각 대상 시스템에서 sshd_config를 수정해야합니다 (이 옵션은 기본적으로 비활성화되어 있습니다).

그래서 내 질문은-내 목적으로 "TCPKeepAlive"를 사용할 수 있습니까 (소스 / 대상 컴퓨터에서 다른 것을 변경하지 않고)?

대상 운영 체제는 SLES11 SP2이지만 여기서는 관련이 없다고 생각합니다.


이러한 매개 변수는 모두 연결을 따라 방화벽 또는 중개 장치가 연결을 종료하는 상황을 의미합니다. 이러한 매개 변수는 연결을 유지하기 위해 정기적 인 데이터를 전송하고 X 개의 미해결 응답이있을 때 연결을 종료하기위한 것입니다. 당신의 행동에 대해 좀 더 자세히 설명해 주시겠습니까? ControlMaster옵션 을 사용하고 있고 슬레이브 연결 을 사용하고 있습니까?
Patrick

다른 물리적 노드가있는 여러 개의 ssh 네트워크 연결을 사용하여 다른 노드가 "작동 중지"되었는지 확인하는 방법을 만들고 싶습니다. 나는 ssh-session을 열어서 끝없이 반복합니다. 연결이 끊어지면 해당 세션이 종료되기를 원합니다. TCPKeepalive의 간격 / 개수가 무엇인지 궁금합니다.
Nils

답변:


103

이를 위해 ServerAlive 설정을 사용하고 싶을 것입니다. 서버에서 구성 할 필요가 없으며 원하는 경우 명령 행에서 설정할 수 있습니다.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

이렇게하면 5 초마다 ssh keepalive 메시지가 전송되고 다른 keepalive를 보낼 시간이되었지만 마지막에 대한 응답을받지 못한 경우 연결이 종료됩니다.

사이의 중요한 차이점 ServerAliveIntervalTCPKeepAlive그들이 작동하는 층이다.

  • TCPKeepAliveTCP 계층에서 작동합니다. 빈 TCP ACK 패킷을 보냅니다. 이러한 패킷을 무시하도록 방화벽을 구성 할 수 있으므로 유휴 연결을 끊는 방화벽을 통과하면 연결이 유지되지 않을 수 있습니다.
  • ServerAliveIntervalssh 레이어에서 작동합니다. 실제로는 ssh를 통해 데이터를 전송하므로 TCP 패킷이 데이터를 암호화했으며 방화벽이 keepalive 또는 합법적 인 패킷인지 알 수 없으므로 방화벽이 더 잘 작동합니다.

1
이것이 올바른 방향이라고 생각합니다. 초기 테스트에서 이것이 작동하는 것으로 나타났습니다. 연결이 끊어진 후 5 초 후에 ssh / sshd 서브 프로세스 전송 및 수신이 종료됩니다. TCPKeepalive는 단순히 TCP-stack-defaults를 사용하므로 구성하기가 더 어렵다고 생각합니다.
Nils

이것은 또한 유령 사용자 문제를 해결합니다. 나는이도 수행 할 수 있습니다 생각 퍼티 설정 변경 Seconds between keepalives| 설정 아래 1800 연결.
Bob Stein

7

TCPKeepAlive옵션은 실제로 ClientAlive 유사 또는 ServerAlive 유사 옵션에서 연결을 유지하는 매우 다른 방법입니다.

BSD SSH 매뉴얼 페이지 당 다음을 읽을 수 있습니다.

클라이언트 활성 메시지는 암호화 된 채널을 통해 전송되므로 스푸핑 할 수 없습니다. 에 의해 활성화 된 TCP keepalive 옵션 TCPKeepAlive은 스푸핑 가능합니다. 클라이언트 작동 메커니즘은 클라이언트 또는 서버가 연결이 비활성화 된시기를 아는 것에 의존 할 때 유용합니다.

TCPKeepAlive시스템이 다른쪽으로 TCP의 킵 얼라이브 메시지를 전송해야하는지 여부를 확인합니다. 기본 옵션은 항상 활성화되어 있습니다.

을 사용하는 ClientAliveInterval경우을 비활성화 할 수 있습니다 TCPKeepAlive. 이 옵션은 클라이언트에서 응답을 요청하기 위해 암호화 된 채널을 통해 메시지를 전송하고 (기본값은 0이므로 클라이언트에 메시지가 전송되지 않음) ClientAliveCountMaxsshd가 클라이언트 연결을 끊기 전에 클라이언트 활성 메시지 수를 설정합니다. 세션.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.