부팅시 자동 역방향 SSH 연결 만들기


9

내 Digitalocean VPC에 대한 역방향 SSH 연결을 만드는 NAT 뒤에 PC가 있습니다. 나는 집 에서이 역 SSH 연결을 사용하여 내 사무실 PC에 로그인하고 (권한을 부여 받았습니다) 파일을 복사하고 다른 중요한 일을합니다.

자주는 아니지만, 전원 장애 등으로 인해 내 사무실 PC가 다시 시작되고 내 VPC와의 역방향 SSH 연결이 끊어졌습니다. 이런 종류의 경우, 가정용 PC에서 내 사무실 PC로 연결할 수 없습니다.

다음 스크립트를 실행하여 사무실 PC에서 생성 된 트래픽을 탐색하기 위해 역방향 연결 + 동적 프록시를 만듭니다 (탐색 정보를 공유 할 필요가 없으므로).

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

물리적으로 있지 않기 때문에 컴퓨터를 다시 시작하면 사무실 PC에서 다시 스크립트를 실행할 수있는 방법이 없습니다. 이 문제를 해결하기 위해 다음 crontab을 설치했습니다.

참고 : rev.sh파일에는 위의 줄이 포함되어 있습니다. "digitalOcean"및 rev.sh 인증서는에 있습니다 Ubuntu home. 따라서 ./rev.sh우분투 터미널에서 실행할 때 동적 프록시를 얻거나 ym DigitalOcean 서버에 액세스합니다. 이 방법은 100 % 작동합니다.

그러나 다음 방법으로 chrontab을 설치할 때 내 우분투 PC는 동적 프록시를 만들지 않습니다. Chrome에서이 프록시를 확인할 때 프록시가 연결을 거부하고 있기 때문에이 메시지를 볼 수 있습니다.

루트 크론 작업으로 시도한 크론 작업은 다음과 같습니다. 나는 또한 일반 사용자로 시도했지만 여전히 작동하지 않았습니다.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

그런 다음 현재 시간 몇 분 전에 크로노 탭을 설치하고 실행되기를 기다렸습니다.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

이것들도 실행되지 않았습니다.

내 실수를 발견 할 수있을 정도로 친절하십시오. 이 웹 사이트에는 비슷한 문제가 많이 있습니다. 나는 많은 답변을 언급했지만 그들 중 누구도 도움이되지 않는 것 같습니다.


문제가 무엇인지 잘 모르겠습니다. cron이 작업을 시작하지 않습니까? 아니면 스크립트가 작동하지 않습니까? 두 가지 문제 모두 로그를 참조하십시오. Cron은에 어딘가에 써야합니다 /var/log/cron*. 테스트 목적으로 간단히 다음과 같이 작성할 수 */2 * * * * /path/to/script있습니다. 2 분마다 스크립트를 실행합니다. cron을 실행하는 사용자의 메일도 확인하십시오. 루트입니까? mail명령을 사용하십시오 . 오, 당신이 ssh 키를 사용하고 있음을 알 수 있습니까? -i스위치 후 전체 경로를 제공하지 않으면 cron 작업이 찾을 수 없을 것 입니다.
Kalavan

답변:


8

cron시작시 스크립트를 실행하는 것이 좋은 아이디어 인지 확실하지 않습니다 . 더 적합하다고 생각되는 대안은 여기에 설명 된 것처럼 SystemD 서비스를 만드는 입니다. 이름이 다음과 같은 파일을 작성하십시오 /etc/systemd/system/autossh.service.

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

그런 다음 루트로 다음 명령을 실행하십시오.

systemctl enable autossh.service

1

시도해 볼 수있는 몇 가지 사항 :

chmod +x rev.sh

부팅시 또는 cronjobs를 통해 경로가 완전히 설정되지 않은 경우가 있으므로 autossh를 시스템의 전체 경로로 바꾸십시오.

/usr/bin/autossh

@reboot 주제는 cron 데몬 시작 시간에 따라 달라 지므로 다른 서브 시스템 (네트워크?)이 시작되어 실행되기 전에 호출 될 수 있습니다.

그리고 당신의 crontab 예제 :

24 12 8 * * * bash /home/user/rev.sh

매월 8 일에만 호출됩니다. 그리고 추가 필드가 있습니다. 시험

24 12 * * * /home/user/rev.sh

죄송합니다. 실수였습니다. '24 12 * * * /home/user/rev.sh '를 시도했지만 여전히 문제가되었습니다. 놀랍게도 '24 12 * * * reboot '도 작동하지 않았습니다.
Denis

1
루트로 호출하지 않으면 재부팅이 제대로 작동하지 않습니다.
slowko

/ usr / bin / autossh를 추가하려고했습니다. 그것은 작동하지 않았다.
Denis

루트 crontab에서 24 12 8 * * * 재부팅을 시도했습니다. 그것은 작동하지 않았다. 그것은 당신에게 작동합니까?
Denis

/usr/bin기본 항상 PATH도를 위해,cron
roaima

1

스크립트가 crontab을 통해 실행될 때 인증서를 찾을 수없는 것 같습니다.

사용자가 스크립트를 실행할 때 /home/ubuntu-user/.ssh/의 인증서를 사용합니다. 그러나 스크립트가 crontab에서 실행되면 루트로 실행됩니다. root는 /root/.ssh에서 인증서를 가져옵니다.

그래서 당신은 그것을 작동시키는 여러 가지 방법이 있지만, crontab에서 우분투 사용자 로 스크립트를 실행하면 그렇게한다고 생각 합니다.

편집하다:

인증서의 완전한 경로를 제공해야합니다



0

질문에 많은 데이터가 없기 때문에 내가 할 일부터 처음부터 시작할 것입니다.

모든 구성을 / etc / ssh / ssh_config에 넣었습니다.

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

나는 열쇠를 넣을 것이다 /etc/ssh/mytunnel_key

그런 다음 다음과 같이 cron 항목 (upstart / systemd 서비스가 더 좋을 것)으로 시도합니다.

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

당신은 사용할 필요가 -f명령을 실행 터미널없이 실행할 때. 여기 예가 있습니다 :

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f 백그라운드에 배치하지만 백그라운드에 배치하면 ssh가 연결 한 다음 작업이 완료되는 즉시 연결이 끊어집니다. 따라서 작업이 필요합니다.

sleep 31536000은 ssh가 연결 후 1 년 동안 "sleep"을 실행하도록 지시합니다. 이 시간 동안 터널은 그대로 유지됩니다.

명령을 실행하지 않으면 ssh가 연결되고 포트 2205에서 리버스 터널을 설정 한 후 완료되면 종료됩니다. autossh를 사용하면 연결에 실패하면 다시 연결되고 절전 모드가 다시 시작됩니다. 인터넷이 안정적으로 연결되어 있어도 1 년은 불가능합니다.

BTW-다른 조커와는 달리, 나는 실제로 비슷한 것을하고 있기 때문에 실제로 테스트했기 때문에 이것이 효과가 있다는 것을 알고 있습니다.

-f 및 "명령"

그것이 당신이 잃어버린 것입니다.


1
우리는 여기서 다른 사람들의 이름을 부를 필요가 없다고 생각합니다.
Jeff Schaller

1
나는 다른 사람들의 이름을 부르지 않습니다. 이전에 제안 된 솔루션은 제안한 사람들이 시도한 적이 없었습니다. 나를 믿지 않습니까? 사용해보십시오.
Jimminy Doe 2014

1
나는 당신이 질문의 요점을 언급하지 않았다고 생각합니다.-OP 주장 이 방법은 100 % 작동합니다 . 나는 그들의 질문이 PC가 다시 시작된 후 자동으로 스크립트를 실행하는 것을 중심으로 생각합니다.
Jeff Schaller

1
그가 직장에 있다면 OP가 터미널에서 실행되기 때문에 리버스 터널을 집으로 설정할 수 있습니다. ssh (및 autossh) 프로그램은 프로세스와 연관된 터미널이없는 경우 다르게 작동합니다. 그는 -f 사용하지 않을 것 정확하게 때문에 그는 문제 (터미널없이 실행)의 crontab, 터널을 다시 연결을 가지고 있었고, 그 경우에도, 터널 뭔가를 실행하지 않고, 설치했다 일단 ssh를 종료 것 - 내 경우, 나는 이동 일 년 동안 잠을 자십시오. 스크립트에서 -f는 COMMAND와 함께 사용해야 SSH를 종료 할 수 없습니다. 그의 문제입니다.
Jimminy Doe 2014

1
Jeff Schaller가 올바른 솔루션을 제공하고 실제로 테스트 해 줄 공감대를 제공 한 것이 당신이라고 생각합니다. 방화벽을 통과하도록 PI를 설정하고 rdesktop을 시작하고 Linux에 대해 전혀 모르는 사무실 관리자에게 사용하도록 PI를 설정하는 것을 제외하고는 기본적으로 그가 동일한 설정을 수행하고 있습니다. . 방금 해결책을 가지고 있습니다. 지금 사용하고 있기 때문에 필자는 원격으로 파이와 로컬 케이블 모뎀을 모두 재부팅했습니다. 안전을 위해 .. 그러나 정확한 답변을 얻지 마십시오. 과장되고 번지지 않은 자아의 길.
Jimminy Doe 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.