sshd_config의`ServerAliveInterval` 및`ClientAliveInterval` 옵션은 정확히 무엇입니까?


161

나는 발견 이 질문을 하지만, 내가 아주 두 변수의 설정을 이해하지 못하는 죄송 ServerAliveInterval하고 ClientAliveInterval허용 응답 언급했다. 로컬 서버가 시간 초과되는 경우이 값을 0으로 설정해야합니까? 그런 다음 시간이 초과되지 않습니까? 대신 300 초로 설정해야합니까?

내 질문은 간단하게 응답 Write failed: Broken pipe과 함께 랩톱을 일시 중단 및 일시 중단 해제하면 일부 연결이 시간 초과 되고 일부는 응답 하지 않습니다. 부러진 파이프로 실패하지 않도록 로컬 sshd를 올바르게 구성하려면 어떻게해야합니까?

답변:


202

ServerAliveInterval : 클라이언트 가 널 패킷을 서버에 보내기 전에 연결이 지속되도록 대기 하는 시간 (초 )입니다.

ClientAliveInterval : 연결을 유지하기 위해 서버 가 클라이언트에 null 패킷을 보내기 전에 대기 하는 시간 (초 )입니다.

값을 0 (기본값)으로 설정하면 이러한 기능이 비활성화되어 너무 오랫동안 유휴 상태 인 경우 연결이 끊어 질 수 있습니다.

ServerAliveInterval은 연결을 유지하는 가장 일반적인 전략 인 것 같습니다. 깨진 파이프 문제를 방지하기 위해 다음은 .ssh / config 파일에서 사용하는 ssh 구성입니다.

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

위의 설정은 다음과 같은 방식으로 작동합니다.

  1. 클라이언트는 60 초 동안 유휴 대기하고 (ServerAliveInterval 시간) "no-op null packet"을 서버에 보내고 응답을 기대합니다. 응답이 없으면 10 (ServerAliveCountMax) 번 (600 초)까지 위의 프로세스를 계속 시도합니다. 서버가 여전히 응답하지 않으면 클라이언트는 ssh 연결을 끊습니다.

서버 측의 ClientAliveCountMax도 도움이 될 수 있습니다. 클라이언트가 연결을 끊기 전에 응답하지 않는 시간의 한계입니다. 세 개의 ClientAliveInterval에서와 같이 기본값은 3입니다.


좋아, 그래서 나는 "생존하지 말라"는 것을 의미하기 위해 0 초를 해석 할 것이므로 이것이 클라이언트 / 서버를 폴링하지 않는 이유는 무엇입니까?
M. Tibbits

3
yup 0 = 널 패킷을 보내지 않습니다. 또 다른 차이점은 ServerAliveInterval이 클라이언트 구성에 설정되어 있고 ClientAliveInternal이 서버 구성에 설정되어 있다는 것입니다.
Barthelemy

8
이것은 시간 초과로 인한 유휴를 방지하는 좋은 조언처럼 보이지만 클라이언트가 일시 중단 될 때 파이프가 끊어지지 않도록하는 OP 질문과 어떻게 관련이 있는지 이해하지 못합니다. 잠들 때 클라이언트는 널 패킷을 보낼 수 없으므로이 설정이 확실하지 않습니까?
Sparhawk

확실히 ServerAlive 부분입니다. ClientAliveInterval / ClientAliveCountMax가 여기에 도움이됩니다.
javawizard

1
이 오래된 대답을 되돌아 보면 두 번째 단락의 질문이 아닌 제목의 질문에 응답했기 때문에 ServerAliveInternal에 대한 의견은 일시 중단에 도움이되지 않으므로 동의합니다. 일시 중단 된 클라이언트가 서버에 응답하지 않고 ClientAliveCountMax 이후에 서버가 결국 클라이언트의 연결을 끊기 때문에 @JonasWielicki ClientAliveInterval은 일시 중단의 경우에 나쁠 수 있습니다.
Barthelemy

18

이것은 sshd_config매뉴얼 ( man sshd_config)에 설명되어 있습니다 :

ClientAliveInterval

클라이언트로부터 데이터가 수신되지 않은 경우 sshd가 암호화 된 채널을 통해 메시지를 보내 클라이언트로부터 응답을 요청하는 시간 초과 간격을 초 단위로 설정합니다. 기본값은 0이며 이러한 메시지가 클라이언트로 전송되지 않음을 나타냅니다. 이 옵션은 프로토콜 버전 2에만 적용됩니다.

ClientAliveCountMax

기본값은 3입니다 ClientAliveInterval(아래 참조)가 15로 설정되어 ClientAliveCountMax있고 기본값을 그대로두면 약 45 초 후에 응답하지 않는 SSH 클라이언트의 연결이 끊어집니다. 이 옵션은 프로토콜 버전 2에만 적용됩니다.

클라이언트 옵션에 대해서는 다음의 설명을 참조하십시오 man ssh_config.

ServerAliveInterval

서버에서 데이터가 수신되지 않은 경우 서버에서 ssh응답을 요청하기 위해 암호화 된 채널을 통해 메시지를 보내는 시간 초과 간격 (초)을 설정 합니다. 기본값은 0이며 이러한 메시지가 서버로 전송되지 않음을 나타냅니다. 이 옵션은 프로토콜 버전 2에만 적용됩니다.

ServerAliveCountMax

기본값은 3입니다. 예를 들어, ServerAliveInterval15로 설정되어 ServerAliveCountMax있고 기본값으로 남아 있으면 서버가 응답하지 않으면 ssh약 45 초 후에 연결이 끊어 집니다 . 이 옵션은 프로토콜 버전 2에만 적용됩니다.

위를 기준으로 0은 비활성화되었음을 의미합니다. 따라서 파이프 오류가 발생 하지 않도록이 값을 충분히 높게 설정해야 합니다.


유용한 게시물. 그러나 나는 이것에 너무 좌절합니다. 나는 사방에 큰 간격을 설정하고 있으며 몇 분 후에도 연결이 여전히 끊어집니다. (우분투에서 openssh를 사용하여 관련이 있는지 확실하지 않음)
Sridhar Sarnobat

1
@ user7000 클라이언트 (ssh)와 서버 (sshd)를 모두 구성하십시오. 도움이 될 수 있습니다 . '원격으로 SSH 연결이 예기치 않게 종료되었습니다'문제를 해결하는 방법 .
kenorb

어딘가에 가고 있다고 생각합니다. ServerAliveInterval구성 파일에 공백을 두지 않았을 수 있습니다 .
Sridhar Sarnobat

15

Barthelemy의 답변은 훌륭하지만 실제로 문제의 근원에 도달하지는 않습니다. 컴퓨터를 일시 중단하고 컴퓨터를 부팅 할 때 SSH 세션이 계속 활성화되기를 원합니다.

연결을 그대로 유지하는 ssh에는 그러한 구성이 없습니다. SSH는 TCP를 사용하므로 시작하려면 3 방향 핸드 셰이크가 필요하며 유휴 시간이 지난 후에도 계속 유지됩니다. 종료 / 최대 절전 모드에서 모든 TCP 연결은 FIN으로 닫힙니다. 그것을 극복 할 방법이 없습니다.

더러운 해결 방법은 VPS 또는 화면이있는 다른 온라인 상자를 사용하여 연결을 유지할 수 있습니다. 내 조언은 보안상의 이유로 그렇게하지 않습니다.


1
이것은 실제로 질문에 대한 유일한 답변입니다.
Calimo

1
이것은 실제로 끔찍한 보안 솔루션입니다. 절대 그렇게하지 마십시오.
jahrichie

14

일단 수신 된 패킷에 대한 ACK 전송을 중지하면 SSH 연결 (TCP)이 활성 상태로 유지된다고 보장 할 수 없으므로 개인적으로 http://www.harding.motd.ca/autossh/ 를 사용 하여 모든 SSH 연결을 다시 시작합니다. 내가 중단을 멈추자 마자

GNU Screen은 서버 측에서 사용되기 때문에 다시 연결하면 이전 위치로 이동합니다.

추가 포트에서 수신 대기하여 연결이 여전히 활성 상태인지 지속적으로 확인할 수는 있지만 개인적으로 사용하지 않도록 설정하고 SSH 자체 ServerAliveInterval/ 에 의존하는 것으로 충분 ServerAliveCountMax합니다.

또 다른 옵션은 http://mosh.mit.edu/ 입니다. UDP는 UDP를 사용하며 장기적인 연결 부족으로부터 완벽하게 복구합니다.


5

nohupSSH 연결에 관계없이 명령을 실행하려면 명령을 실행할 수도 있습니다 .

예 :

$ nohup tar -xzf some_huge.tar.gz &

&IS, 내가 필요하지 생각하지만, 다른 물건을 할 수 있도록 백그라운드에서 프로세스를 실행하게하기 때문에 편리합니다.

나는 항상 시간이 걸리는 프로세스에 nohup을 사용하므로 어떤 이유로 든 연결이 끊어지면 다시 시작할 필요가 없습니다. 정전 (호스트가 아닌 원격 위치에서), 네트워크 중단 등 무엇이든.


zsh의 nohup이 제대로 작동하지 않습니다!
Sridhar Sarnobat

@ user7000 부적절한 점은 무엇입니까?
Buttle Butkus

기억이 안납니다. 기본적으로 클라이언트 연결이 끊긴 후에 프로세스가 계속 실행되지 않았다고 생각합니다. 몇 년 전에 나는 nohup 사용을 중단하고 대신 disown을 사용했습니다.
Sridhar Sarnobat 님이

2
그때 이후로 문제가 해결되지 않으면 zsh사용자가 disown -h대신에 붙어 있어야한다고 생각 합니다 nohup.
Buttle Butkus

0

장기 실행 세션을 화면에 넣습니다. 자세한 내용은 screen -h를 참조하십시오.

그렇게하면 ssh를 사용하여 컴퓨터에 다시 연결하고 화면 세션에 다시 연결할 수 있습니다


화면을 제안하는 사람들 중 몇 퍼센트가 실제로 화면을 사용하는지 궁금합니다.
Sridhar Sarnobat

tmux가 더 나은 제안이라고 생각합니다. 코드 수정 날짜 github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.