셀 타워를 통해 인터넷 서비스를 제공하는 공급자를 사용할 때 SSH 세션의 연결이 자주 끊어집니다. 그들은 "멈추고" 내가 입력하는 모든 것에 응답하지 않는 것처럼 보이지만 때로는 멈추고 몇 분이 지나야 실제 연결 끊김 메시지가 표시됩니다.
아래에서는 "Q&A 스타일"로 내 자신의 질문에 답변하고 있습니다. 이는 지난 한 해 동안 해결하려고 많은 시간을 소비한 문제이며 지금까지 찾은 모든 솔루션을 통합하고 공유하고 싶었습니다. . (아직 찾지 못한 다른 솔루션이 있다면 여러분의 답변도 자유롭게 추가해 주세요!)
답변1
셀 타워/모바일 핫스팟을 사용하여 인터넷에 액세스할 때 SSH 세션(또는 기타 영구 연결)은 세 가지 주요 이유로 중단될 수 있습니다.
- 귀하의 IP 주소가 변경됩니다. 이것은 일반적으로아니요문제의 원인. 이론적으로 이는 고정 IP 주소를 제공하지 않는 모든 공급자(모바일 또는 기타)에서 발생할 수 있지만 모바일 핫스팟 공급자를 사용하더라도 IP는 (보통) 자주 변경되지 않으며 정기적으로 중단되지 않습니다. 연결. "내 IP 주소는 무엇입니까?"를 사용하여 이러한 일이 발생하는지 확인할 수 있습니다. 사이트를 입력하고 주기적으로 사이트를 다시 로드하여 IP 주소가 변경되는지 확인하세요.
- 제공업체와의 연결이 중단되었습니다(예: 약한 신호). 이것이 문제인 경우 SSH 연결뿐만 아니라 다른 연결 유형(스트리밍 비디오, 웹 검색)에도 영향을 미칠 수 있습니다.
- 귀하의 공급자는 NAT를 사용하며 NAT 테이블에서 "비활성" 연결을 제거하는 데 매우 짧은 시간 제한이 있습니다.다른 용도(웹 탐색, 비디오 스트리밍)에는 인터넷 연결이 양호하지만 1~2분 이상 입력을 중지하면 SSH 세션이 응답하지 않는 경우, 이것이 문제의 원인일 수 있습니다.
문제 #1 및 #2에 대한 해결책:
이러한 문제에 대한 가장 좋은 해결책은 불안정하고 가변적인 연결에 더 적합한 SSH 이외의 다른 것을 사용하는 것입니다. 두 가지 일반적인 옵션은 다음과 같습니다.모쉬그리고영원한 종착지. MOSH는 스크롤링을 지원하지 않으므로(최신 출력 화면만 볼 수 있음) 해당 기능을 추가하려면 screen 또는 tmux와 같은 것을 사용해야 할 수도 있습니다. Eternal Terminal은 롤백을 지원합니다. 때로는 루트 액세스 없이 서버의 일반 사용자 계정으로 MOSH(영구 터미널 아님)를 설치할 수 있습니다.
문제가 일시적인 연결 중단인 경우 TCPKeepAlive를 비활성화하고 "ClientAliveInterval 0"을 설정하여 클라이언트 활동 검사를 비활성화하거나 "ClientAliveCountMax 20"을 설정하여 허용함으로써 ssh를 사용하고 서버의 SSH 구성이 중단을 더 잘 견딜 수 있도록 만들 수도 있습니다. 연결을 종료하기 전에 확인에 실패했습니다.
처음 두 단락의 일부 솔루션을 설정하려면 서버에 대한 루트 액세스가 필요합니다. 루트 액세스 권한이 없으면 웹 호스팅 회사에서 저렴한 VPS(Virtual Private Server)를 구입하고 VPS에 위 옵션 중 하나를 설정할 수 있습니다. 그런 다음 다른 시스템에 연결하려는 경우 먼저 VPS에 연결한 다음 이를 사용하여 중단을 덜 허용하는 다른 시스템에 SSH를 통해 연결할 수 있습니다.
문제 #3에 대한 해결책:
문제 #3에 대한 해결책은 정보가 SSH 연결을 통해 정기적으로 전송되어 인터넷 공급자의 NAT 테이블에서 정보가 시간 초과되지 않도록 하는 것입니다.
첫째, 올바른 문제를 해결하고 있는지 테스트하는 것이 도움이 될 수 있습니다. 다음 스크립트는 서버가 1시간 동안 30초마다 SSH 연결을 통해 출력을 보내도록 합니다. 이 스크립트가 실행되는 동안 SSH 연결이 끊어지지 않고 한 시간 동안 연결되어 있으면 아마도 올바른 방향으로 가고 있는 것입니다. (그렇지 않은 경우 간격을 30초 미만으로 설정하거나 위에서 언급한 SSH 연결 끊김의 다른 잠재적인 원인을 살펴보세요.)
INTERVAL=30
START_TIME=`date +%s`
END_TIME=$(( $START_TIME + 3600 ))
while [ `date +%s` -lt $END_TIME ]
do
date
sleep $INTERVAL
done
echo "Test completed successfully - your ssh connection lasted at least one hour."
위의 스크립트가 SSH 연결이 끊어지는 것을 방지한다고 가정하면 이제 해결책이 있으므로 자동으로 연결되도록 하는 방법만 있으면 됩니다. 이를 수행하는 방법은 ssh가 30초마다 "활성" 검사를 수행하도록 하는 것입니다. 이렇게 하면 30초마다 ssh 연결을 통해 메시지가 전송되고 비활성으로 인해 인터넷 공급자의 NAT 테이블에서 해당 메시지가 지워지는 것을 방지할 수 있습니다. "활성" 검사를 수행하도록 컴퓨터에 서버나 SSH 클라이언트를 구성할 수 있습니다(둘 중 하나라도 괜찮습니다. 둘 다 필요하지 않습니다).
서버 측에서 이를 설정하려면 /etc/ssh/sshd_config를 편집하고 "ClientAliveInterval 30"을 설정하십시오. 이렇게 하면 서버가 30초마다 클라이언트에 메시지를 보내 클라이언트의 응답을 확인하게 됩니다. 서버가 SSH 연결을 닫기 전에(사소한 중단의 경우) 최대 10개의 실패한 검사를 허용하도록 "ClientAliveMaxCount 10"을 설정할 수도 있습니다. 구성 변경 사항을 적용하려면 sshd를 다시 시작해야 합니다.
서버에 대한 루트 액세스 권한이 없는 경우(또는 여러 서버에 연결해야 하는 경우) 컴퓨터에서 이를 설정할 수도 있습니다. 컴퓨터가 30초마다 활동 확인을 보내도록 할 수 있습니다.어느다음 명령을 사용하여 연결하는 서버:
Host *
ServerAliveInterval 30
ServerAliveCountMax 8
Linux 또는 MacOS에서는 이 줄이 ~/.ssh/config에 있습니다. Windows에서 OpenSSH를 사용하는 경우 이 줄은 C:\Users\yourusername\.ssh\config에 있습니다(파일이 없으면 만들 수 있습니다. .txt가 없는지 확인하세요). 확대).
PuTTY를 사용하는 경우 "연결" 섹션 아래의 세션 설정에서 "연결 유지 간격(초)"을 30으로 설정하면 비슷한 동작이 발생합니다. PuTTY를 사용하면 이를 각 서버/연결의 설정에 넣어야 하지만 전역 설정은 없는 것 같습니다.