직장에서 SSH 터널을 사용하여 다양한 idotic 방화벽을 돌아 다닙니다 (상사에게 괜찮습니다 :). 문제는 잠시 후 ssh 연결이 일반적으로 중단되고 터널이 손상되었다는 것입니다.
최소한 터널을 자동으로 모니터링 할 수 있다면 터널이 멈췄을 때 터널을 다시 시작할 수 있지만 그 방법을 찾지 못했습니다.
물론 내 ssh 연결이 중단되는 것을 방지하는 방법을 알려주는 사람에게는 보너스 포인트!
직장에서 SSH 터널을 사용하여 다양한 idotic 방화벽을 돌아 다닙니다 (상사에게 괜찮습니다 :). 문제는 잠시 후 ssh 연결이 일반적으로 중단되고 터널이 손상되었다는 것입니다.
최소한 터널을 자동으로 모니터링 할 수 있다면 터널이 멈췄을 때 터널을 다시 시작할 수 있지만 그 방법을 찾지 못했습니다.
물론 내 ssh 연결이 중단되는 것을 방지하는 방법을 알려주는 사람에게는 보너스 포인트!
답변:
autossh 가 필요한 것 같습니다 . ssh 터널을 모니터링하고 필요에 따라 다시 시작합니다. 우리는 몇 년 동안 그것을 사용했으며 잘 작동하는 것 같습니다.
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
-M 매개 변수에 대한 자세한 내용은 여기를 참조하십시오.
autossh
대답에 넣을 수 있습니까?
autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 username@myoutsidebox.com
autossh를 백그라운드에 넣을 수 있도록 원격 터미널을 만들지 않는 -nNT를 사용하여 설정하고 SSH의 .pem 파일을 사용하기위한 -i 옵션을 알 수 있습니다. 항상 연결을 열어 두려면 추가 설정을 수행하는 것이 좋습니다.
-M
매개 변수 를 생략하는 것이 좋습니다 . bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162
모든 상태 저장 방화벽은 일정 시간 동안 해당 연결에 대한 패킷을 보지 못한 후 연결을 잊어 버립니다 (연결을 닫지 않고 양쪽 끝이 종료 된 상태 테이블이 연결로 가득 차는 것을 방지하기 위해). 대부분의 TCP 구현은 상대방의 의견을 듣지 않고 오랜 시간이 지난 후 keepalive 패킷을 보냅니다 (2 시간은 공통 값). 그러나 keepalive 패킷을 보내기 전에 연결을 잊어 버리는 상태 저장 방화벽이 있으면 오래 지속되지만 유휴 연결이 끊어집니다.
이 경우 해결 방법은 연결이 유휴 상태가되는 것을 방지하는 것입니다. OpenSSH에는 ServerAliveInterval 이라는 옵션이 있습니다.이 옵션을 사용하면 연결이 너무 오래 유휴 상태가되는 것을 방지 할 수 있습니다 ( 상대적 으로 연결이 유휴 상태 일 때 피어가 더 빨리 사망 한시기를 감지 함).
자신의 Mac 또는 Linux 시스템에서 ssh를 구성하여 3 분마다 서버 ssh를 활성 상태로 유지하십시오. 터미널을 열고 집에 보이지 않는 .ssh를 입력하십시오.
cd ~/.ssh/
그런 다음 1 줄 구성 파일을 작성하십시오.
echo "ServerAliveInterval 180" >> config
또한 다음을 추가해야합니다.
ServerAliveCountMax xxxx (high number)
기본값은 3이므로 ServerAliveInterval 180은 9 분 (ServerAliveInterval에서 지정한 3 분 간격 중 3 분) 후에 전송을 중지합니다.
ServerAliveInterval 180
우리에게 6 분을 주나요? 직감은 내가 이것을 시도하게합니다 : 180/60 == 3
. 그렇다면 ServerAliveInterval
30 초의 배수로 작동합니까?
다음 Bash 스크립트를 사용하여 이전 터널이 죽을 때 새로운 ssh 터널을 계속 생성했습니다. 스크립트를 사용하면 추가 패키지를 설치하지 않거나 컴파일러를 사용하지 않을 때 편리합니다.
while true
do
ssh <ssh_options> [user@]hostname
sleep 15
done
연결을 자동으로 설정하려면 키 파일이 필요하지만 autossh도 마찬가지입니다.
Systemd는 이상적으로 적합합니다.
다음을 포함하는 서비스 파일 /etc/systemd/system/sshtunnel.service
을 작성하십시오 .
[Unit]
Description=SSH Tunnel
After=network.target
[Service]
Restart=always
RestartSec=20
User=sshtunnel
ExecStart=/bin/ssh -NT -o ServerAliveInterval=60 -L 5900:localhost:5900 user@otherserver
[Install]
WantedBy=multi-user.target
ssh 명령을 수정하십시오.
sshtunnel
되므로 사용자가 먼저 존재하는지 확인하십시오.systemctl enable sshtunnel
부팅시 시작하도록 설정하는 문제systemctl start sshtunnel
즉시 시작하는 문제2018 년 1 월 업데이트 : 일부 배포판 (예 : Fedora 27)은 SELinux 정책을 사용하여 SSH를 사용하여 시스템 초기화를 방지 할 수 있습니다.이 경우 필요한 면제를 제공하기 위해 사용자 정의 정책을 작성해야합니다.
systemd
시스템에 탁월 합니다. 사용하는 경우 Restart=on-failure
SSH 클라이언트를 수동으로 종료하면 SSH 클라이언트로 시스템이 다시 시작되지 않고 종료됩니다.
ExecStart
예를 들어 ssh
인수 목록 을 작성 하기 위해 인수로 제공된 (bash) 스크립트에서 ssh를 시작 하려면 기본 검사 등을 수행 한 다음 스크립트에서 호출하십시오 exec /bin/ssh -N ...
. 내 명령은 다음과 같습니다. exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
위치 TUNNEL_INLET="127.0.0.1:3307"
및TUNNEL_OUTLET="127.0.0.1:3306"
ServerAliveCountMax를 모두 잘못 해석하고 있다고 확신합니다. 문서를 이해하면 연결이 종료되지 않고 응답하지 않을 수있는 서버 활성 메시지의 수입니다. 따라서 여기서 논의하는 것처럼 높은 값으로 설정하면 중단 된 연결이 감지되지 않고 종료되지 않습니다!
방화벽이 연결을 잊어 버린 경우 문제를 해결하려면 ServerAliveInterval을 설정하기 만하면 충분하며 ServerAliveCountMax를 낮게두면 원래 끝에서 오류를 감지하고 연결에 실패하면 종료됩니다.
원하는 것은 1) 정상적인 상황에서 연결이 영구적으로 열려 있고, 2) 연결 실패가 감지되고 시작 측이 실패하면 종료되고, 3) 매번 ssh 명령이 재발행 될 때입니다. 종료 (당신이 그렇게하는 방법은 플랫폼에 따라 다르며, Jawa가 제안한 "진정한"스크립트는 OS XI에서 실제로 시작된 항목을 설정하는 한 가지 방법입니다).
ServerAliveInterval
만료 된 NAT 세션으로 터널 문제가 발생하는 경우 항상 SSH 옵션을 사용하십시오 .
연결이 완전히 다운되는 경우 항상 부활 방법을 사용하십시오. 여기에는 최소한 세 가지 옵션이 있습니다.
while true do ssh ...; sleep 5; done
)는 sleep 명령을 제거하지 않고 ssh
빠르게 실패 할 수 있으며 너무 많은 프로세스를 다시 생성합니다/etc/inittab
, 상자 뒤에 포트를 전달하지 않고 NAT 뒤에있는 다른 국가에 배송 및 설치되는 상자에 액세스하려면 ssh 터널을 다시 생성하도록 구성 할 수 있습니다.
tun1:2345:respawn:/usr/bin/ssh -i /path/to/rsaKey -f -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip 'sleep 365d'
Ubuntu의 upstart 스크립트 ( /etc/inittab
사용할 수없는 위치 ) :
start on net-device-up IFACE=eth0
stop on runlevel [01S6]
respawn
respawn limit 180 900
exec ssh -i /path/to/rsaKey -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip
post-stop script
sleep 5
end script
또는 항상 두 가지 방법을 모두 사용하십시오.
이 문제를 해결했습니다.
편집하다
~/.ssh/config
그리고 추가
ServerAliveInterval 15
ServerAliveCountMax 4
ssh_config 매뉴얼 페이지 에 따르면 :
ServerAliveCountMax
Sets the number of server alive messages (see below) which may be
sent without ssh(1) receiving any messages back from the server.
If this threshold is reached while server alive messages are
being sent, ssh will disconnect from the server, terminating the
session. It is important to note that the use of server alive
messages is very different from TCPKeepAlive (below). The server
alive messages are sent through the encrypted channel and there‐
fore will not be spoofable. The TCP keepalive option enabled by
TCPKeepAlive is spoofable. The server alive mechanism is valu‐
able when the client or server depend on knowing when a connec‐
tion has become inactive.
The default value is 3. If, for example, ServerAliveInterval
(see below) is set to 15 and ServerAliveCountMax is left at the
default, if the server becomes unresponsive, ssh will disconnect
after approximately 45 seconds. This option applies to protocol
version 2 only.
ServerAliveInterval
Sets a timeout interval in seconds after which if no data has
been received from the server, ssh(1) will send a message through
the encrypted channel to request a response from the server. The
default is 0, indicating that these messages will not be sent to
the server. This option applies to protocol version 2 only.
ExitOnForwardFailure yes
다른 제안에 대한 좋은 보조입니다. 연결되었지만 포트 전달을 설정할 수없는 경우 마치 연결되지 않은 것처럼 쓸모가 없습니다.
ssh 세션을 다시 시작하는 데 도움이되는 autossh와 같은 도구가 있지만 실제로 유용한 것은 'screen'명령을 실행하는 것입니다. 연결을 끊은 후에도 ssh 세션을 재개 할 수 있습니다. 연결 상태가 안정적이지 않은 경우 특히 유용합니다.
... k가 도움이된다면 이것이 '정답'이라고 표시하는 것을 잊지 마십시오! ;-)
이전 ISP와 비슷한 문제가있었습니다. 나에게 그것은 tcp 연결, 웹 사이트 방문 또는 메일 전송과 동일합니다.
해결책은 UDP를 통해 VPN 연결을 구성하는 것입니다 (OpenVPN을 사용하고있었습니다). 이 연결은 연결이 끊긴 원인에 대해 더 관대했습니다. 그런 다음이 연결을 통해 모든 서비스를 실행할 수 있습니다.
연결에 여전히 문제가있을 수 있지만 터널은 더 견딜 수 있으므로 모든 ssh 세션은 연결이 끊기는 대신 짧은 보류 상태를 느낄 것입니다.
이렇게하려면 자체 서버에서 설정할 수있는 온라인 VPN 서비스가 필요합니다.
으로 autossh
우리의 요구를 (그것이 첫 번째 시도에서 서버에 연결할 수없는 경우이 오류가 존재)을 만족하지 못하는, 우리는 순수 bash는 응용 프로그램을 작성했습니다 : https://github.com/aktos-io/link- 서버
기본적으로 서버에서 NODE의 sshd 포트 (22)에 대한 역방향 터널을 만듭니다. 추가 포트 전달, 연결시 메일 보내기 등과 같은 다른 작업을 수행해야하는 경우 스크립트 on-connect
와 on-disconnect
폴더를 배치 할 수 있습니다 .
watch
과 같은 명령을 사용하여 더미 명령을 생성하여 "사용"하도록했습니다watch -n1 60 echo "wiiiii"
. 네트워크가 고장 나거나 사용하지 않으면 터널이 죽지 않습니다.