부팅시 자동 역방향 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.