역방향 터널을 만들기위한 영구 백그라운드 ssh 연결 : 올바른 방법은 무엇입니까?


41

관련 질문 : 서버에서 클라이언트로 SSH 연결 시작

거기에서 대답하면 많은 도움이되었습니다.이 명령은 내가 필요한 것을 수행합니다.

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

그래서 나는 항상 다시 연결하는 스크립트를 작성했습니다.

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

그리고에 추가했습니다 /etc/crontab. 그러나 쉘에서 "수동으로"만 실행하면 작동하지만 cron에서 호출하면 ssh가 연결되고 즉시 완료됩니다. (따라서 위의 스크립트는 항상 다시 연결됩니다)

에서 man ssh백그라운드 연결의 경우 -n키로 호출해야 하지만 도움이되지 않는다는 것을 알았습니다. 그런 다음 비슷한 스크립트를 둘러 보았고 tail -f something"예를 들어"neverending "명령을 호출하면 작동한다는 것을 알았 으므로 빈 파일을 만들었으므로 /tmp/dummy_file이제 ssh 명령은 다음과 같습니다.

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

지금 작동합니다! 그러나이 솔루션은 약간 추한 것처럼 보이며 실제로 해당 동작의 이유를 이해하지 못합니다. 우연히, bash대신 전화 를 시도했지만 tail -f( bash나도 "절대로"명령하는 것처럼 보이지만) 작동하지 않습니다.

그렇다면 누구나이 동작을 설명 할 수 있습니까? 역 ssh 터널을 유지하기 위해 백그라운드 ssh 연결을 만드는 올바른 방법은 무엇입니까?


&ssh 명령 끝에서 사용하는 것은 어떻 ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

그러나 while루프가 반복해서 실행되어 ssh5 초마다 새로운 백그라운드 연결이 시작 됩니다. 이것은 내가 필요한 것이 아닙니다.
Dmitry Frank

답변:


37

-Nssh 옵션을 원하는 것처럼 들립니다 .

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

나는 당신이 고려하는 것이 좋습니다 autossh. 연결 유실이 근본적인 이유인지 판별하고 재 연결 시도 빈도를 낮추는 특정 휴리스틱이 있습니다. 또한 추가 터널을 사용하여 연결을 모니터링하므로 요청한 것과 같은 시나리오에 매우 유용합니다.

예를 들어 autossh upstartUbuntu를 사용하는 경우 터널을 지속적으로 유지하도록 Ubuntu를 구성하는 방법에 대한 유용한 예를 찾기 위해 웹 검색을 수행 할 수 있습니다 .

특정 서비스에 대해 항상 터널 연결을 내 서버에 열어두기 위해 이것을 사용하고 있습니다.


실제로 시도했습니다 autossh.이 기사를 읽었습니다 : goo.gl/jVuuSR , 그러나 시스템 부팅시 바로 인터넷에 연결되어있는 경우에만 작동했습니다. 그러나 연결이 나중에 설정되면 작동하지 않습니다. 확실하지, 어쩌면 내가 뭔가 잘못했지만 심지어는이 문서의 저자가 sleep 10자신에 /etc/rc.local반드시 인터넷 연결이 autossh가 호출 될 때 이미 준비가되기 위해.
Dmitry Frank

2
@DmitryFrank : 시도한 경우 질문에 언급하지 않는 것이 부당합니다. 여전히 추천합니다. 로 upstart다른 초기화 대체 당신은 최대되는 하나 개 이상의 네트워크 장치에 터널의 시작을 묶을 수있다. 웹에서 가장 좋은 솔루션 (IMO)은 erik.torgesta.com/tag/ssh-upstart ... sleep 10입니다. 어쨌든 어떤 경우에는 도움이되지 않습니다.
0xC0000022L

나는 그것을 언급하지 않은 것에 대해 유감스럽게 생각한다. 그것이 나를 위해 일하지 않았을 때 정직하기 위해 나는 그것을 "손으로"하기로하고 autossh에 대해 완전히 잊어 버렸다. 감사 ssh-upstart합니다. 살펴 보겠습니다.
Dmitry Frank

파티에 늦었지만 역 터널을 유지하기 위해 autossh를 안정적으로 얻을 수 없었습니다. 리버스 터널이 어떤 이유로 든 실패한 경우 autossh는 통지하지 않고 연결을 다시 빌드하지 않습니다. 여러 서버에서 여러 개의 터널이 필요하며 문제가 복잡합니다
DeveloperChris

@DeveloperChris : 글쎄, 나는이 시나리오를 정확하게 실행하고 있습니다. 원격 서버가 문자 그대로 다운되지 않고 다시 켜야하는 경우가 아니라면 터널은 항상 다시 설정됩니다. 아마도 당신은 당신의 자신의 질문을 작성하고 세부 사항을 제공해야합니다. 확실히 이것이 가능합니다. 나는 이것을 몇 달 동안 VPN 문제를 해결하는 데 사용했습니다.
0xC0000022L

9

@ 0xC0000022L의 제안 과 두 번째를 사용하겠습니다 autossh. 나는 그것을 어디에서 가져 가도 랩톱에서 SSH 연결을 유지하기 위해 사용합니다. 이 연결을 사용하여 개인 SMTP 및 IMAP 서버에 액세스하기 위해 포트 25 및 2143을 터널 백합니다.

내가 사용하는 스크립트는 다음과 같습니다.

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

그런 다음 host 파일에 Host항목 을 유지 $HOME/.ssh/config합니다 imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.sh스크립트는 로그인 할 때 데스크탑의 일부로 실행됩니다 .를 통해 스크립트에 액세스 할 수 있습니다 gnome-session-properties.

       ss # 1

                                          ss # 2

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