it-swarm-ko.tech

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

이 질문 을 찾았지만, 허용 된 응답에서 언급 된 두 변수 ServerAliveIntervalClientAliveInterval에 대한 설정을 이해하지 못해서 죄송합니다. 로컬 서버가 시간 초과되는 경우이 값을 0으로 설정해야합니까? 그런 다음 시간이 초과되지 않습니까? 대신 300 초로 설정해야합니까?

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

177
M. Tibbits

ServerAliveInterval : client 서버에 null 패킷을 보내기 전에 대기하는 시간 (초) .

ClientAliveInterval : server 가 클라이언트에 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입니다.

227
Barthelemy

이것은 sshd_config manual (man sshd_config) :

ClientAliveInterval

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

ClientAliveCountMax

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

클라이언트 옵션에 대해서는 man ssh_config :

ServerAliveInterval

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

ServerAliveCountMax

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

위를 기준으로 0은 비활성화되어 있음을 의미합니다. 따라서 Broken pipe 오류를 피하기 위해이 값을 충분히 높게 설정해야합니다.

29
kenorb

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

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

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

20
3h4x

일단 수신 된 패킷에 대한 ACK 전송을 중지하면 SSH 연결 (TCP)이 계속 유지된다고 보장 할 수 없으므로 개인적으로 http://www.harding.motd.ca/autossh/ = 일시 중단하지 않는 즉시 모든 SSH 연결을 다시 시작합니다.

GNU 서버 쪽에서 화면이 사용되므로 다시 연결하면 이전 위치로 이동합니다.

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

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

16
grifferz

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

예 :.

$ Nohup tar -xzf some_huge.tar.gz &

&는 꼭 필요한 것은 아니지만 프로세스가 백그라운드에서 실행되므로 다른 작업을 수행 할 수 있으므로 편리합니다.

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

5
Buttle Butkus

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

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

1
user180529