wykonywanie automatycznego odwrotnego połączenia SSH podczas rozruchu

9

Mam komputer za NATem, który wykonuje odwrotne połączenie SSH z moim Digitalocean VPC. Korzystam z tego odwróconego połączenia SSH z domu, aby zalogować się do mojego biurowego komputera (jestem do tego upoważniony) i kopiować pliki oraz robić inne ważne rzeczy.

Chociaż nie często, zauważyłem, że mój komputer biurowy uruchamia się ponownie (z powodu awarii zasilania itp.) I przerywa odwrócone połączenie SSH, które nawiązało z moim komputerem VPC. W takich przypadkach nie mogę połączyć się z komputera domowego z komputerem biurowym.

Uruchamiam następujący skrypt, aby połączenie odwrócone + dynamiczny serwer proxy w celu anonimizacji mojego ruchu (ponieważ nie muszę udostępniać informacji o przeglądaniu) generowanego na komputerze w biurze.

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

Po ponownym uruchomieniu nie ma możliwości ponownego uruchomienia skryptu thsi na komputerze w biurze, ponieważ nie ma go fizycznie. Aby rozwiązać ten problem, zainstalowałem następujący crontab.

Uwaga: rev.shplik zawiera powyższą linię. Certyfikat „digitalOcean” i rev.sh znajduje się w Ubuntu home. Dlatego po uruchomieniu ./rev.shw terminalu Ubuntu uzyskuję dynamiczny serwer proxy, a także dostęp do serwera ym DigitalOcean. Ta metoda działa w 100%.

Jednak gdy instaluję chrontab w następujący sposób, Mój komputer ubuntu nigdy nie tworzy dynamicznego serwera proxy. Widzę to, ponieważ gdy sprawdzam ten serwer proxy z Google Chrome, mówi, że serwer proxy odmawia połączenia.

Oto cronejobs, których próbowałem jako root cronejobs. Próbowałem również jako zwykły użytkownik, ale nadal nie działały.

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

Następnie zainstalowałem chrontab na kilka minut przed bieżącą godziną i czekałem, aż się uruchomi.

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

te również się nie wykonały.

Proszę, bądź na tyle uprzejmy, aby pomóc mi dostrzec mój błąd. Na tej stronie internetowej jest wiele podobnych pytań dotyczących mojego problemu. Odniosłem się zatem do wielu odpowiedzi, ale żadna z nich nie pomogła.

Denis
źródło
Nie jestem do końca pewien, na czym polega twój problem. Czy to cron nie zaczyna żadnej pracy? Czy skrypt nie działa? W przypadku obu problemów zajrzyj do dzienników. Cron powinien gdzieś napisać /var/log/cron*. Do celów testowych możesz po prostu napisać coś takiego */2 * * * * /path/to/script- uruchamia skrypt co 2 minuty. Sprawdź także maile dla użytkownika uruchamiającego crona. Czy to root? Użyj mailpolecenia. Och, widzę, że używasz klucza ssh? Wątpię, czy zadanie crona będzie w stanie je znaleźć, jeśli nie podasz pełnej ścieżki do niego po -izmianie.
Kalavan

Odpowiedzi:

8

Nie jestem pewien, czy używanie cronskryptu przy uruchamianiu jest tak dobrym pomysłem. Alternatywą, którą uważam za bardziej odpowiednią, jest utworzenie usługi SystemD, jak opisano tutaj . Utwórz plik o nazwie /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

Następnie uruchom następującą komendę jako root:

systemctl enable autossh.service
Dmitrij Grigoriew
źródło
1

Kilka rzeczy, które możesz wypróbować:

chmod +x rev.sh

Czasami twoja ścieżka nie jest w pełni ustawiona w czasie uruchamiania lub przez cronjobs, więc zamień autossh na pełną ścieżkę, w moim systemie, który jest

/usr/bin/autossh

Motyw @reboot zależy od czasu uruchomienia demona cron, dlatego można go wywołać, zanim inne podsystemy (sieć?) zaczną działać

I twój przykład crontab:

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

będzie wywoływał dopiero 8 każdego miesiąca. I ma dodatkowe pole. Próbować

24 12 * * * /home/user/rev.sh
slowko
źródło
Przepraszam, to był błąd. Próbowałem „24 12 * * * /home/user/rev.sh”, ale nadal nie działało. Ku mojemu zdziwieniu nawet „24 12 * * * restart” nie zadziałał.
Denis,
1
Ponowne uruchomienie z pewnością nie zadziała, chyba że wywołujesz jako root.
slowko
Próbowałem dodać / usr / bin / autossh. To nie działało.
Denis,
Próbowałem 24 12 8 * * * restart w crontab root. To nie działało. Czy to działa na twoim?
Denis,
/usr/binjest zawsze w ustawieniu domyślnym PATH, nawet dlacron
roaima
1

Wygląda na to, że kiedy skrypt jest wykonywany przez crontab, nie może znaleźć twojego certyfikatu.

Kiedy użytkownik wykonuje skrypt, używa certyfikatu z /home/ubuntu-user/.ssh / ... Jednak gdy skrypt jest wykonywany z crontab, działa jako root. root pobiera certyfikaty z katalogu /root/.ssh

Masz wiele sposobów, aby to zadziałało, ale myślę, że uruchamianie skryptu tak jak robi to użytkownik ubuntu w crontab .

Edytować:

upewnij się, że podałeś pełną kwalifikowaną ścieżkę do certyfikatu

syss
źródło
1

Spróbuj użyć su:

su -l user -c /home/user/rev.sh

Czy to pomoże w twoim problemie?

Fedor Dikarev
źródło
0

ponieważ pytanie nie zawiera tak wielu danych, zacznę od zera od tego, co bym zrobił

Umieściłbym wszystkie konfiguracje w / 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

Włożyłbym klucz /etc/ssh/mytunnel_key

wtedy spróbowałbym z wpisem cron (usługa upstart / systemd byłaby lepsza) w następujący sposób:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel
Diego Roccia
źródło
0

Musisz użyć -f i uruchomić polecenie, gdy uruchamiasz się bez terminala. Oto przykład:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
[email protected] \
sleep 31536000

-f umieszcza go w tle, ale umieszczenie go w tle oznacza, że ​​ssh połączy się, a następnie rozłączy, gdy tylko zakończy swoje zadanie. Więc potrzebujesz zadania.

sleep 31536000 mówi ssh, aby uruchamiał „sleep” przez 1 rok po podłączeniu. W tym czasie twoje tunele pozostaną otwarte.

Jeśli nie uruchomisz polecenia, ssh połączy się, skonfiguruje tunel zwrotny na porcie 2205, a kiedy to zrobi, zakończy działanie. Używając autossh, jeśli połączenie się nie powiedzie, połączy się ponownie i ponownie uruchomi tryb uśpienia. Nawet przy naprawdę stabilnym połączeniu internetowym wątpię, czy rok jest możliwy.

BTW - w przeciwieństwie do innych żartowniców, wiem, że to działa, ponieważ faktycznie przetestowałem to, ponieważ oczywiście robię coś podobnego, a ponieważ mam teraz działającą, bardzo niezawodnie, mogę udzielić poprawnej odpowiedzi.

-f i „polecenie”

Tego brakuje.

Jimminy Doe
źródło
1
Nie sądzę, żebyśmy musieli tutaj dzwonić do innych osób.
Jeff Schaller
1
Nie dzwonię po imieniu innych ludzi. Wskazuję rozwiązania, które zostały wcześniej zasugerowane przez osoby, które je zasugerowały. Nie wierzysz mi? Spróbuj ich.
Jimminy Doe
1
Nie sądzę, abyś zajął się także kwestią pytania - twierdzi OP Ta metoda działa w 100% . Uważam, że ich pytania dotyczą uruchamiania skryptów w sposób zautomatyzowany po ponownym uruchomieniu komputera.
Jeff Schaller
1
Jeśli jest w pracy, może ustawić tunele do tyłu do domu, ponieważ OP działa w terminalu - TO działa przez 100% czasu. Programy ssh (i autossh) działają inaczej, jeśli nie mają terminala powiązanego z procesem. Miał problemy z tym, że crontab (który działa bez terminala) ponownie łączy tunele, właśnie dlatego, że nie używa -f, a nawet gdyby tak było, ssh wyjdzie po skonfigurowaniu tuneli, bez uruchamiania czegoś - w moim przypadku idę śpij przez rok. W skrypcie należy używać -f Z POLECENIEM, która uniemożliwia wyjście SSH. To jego problem.
Jimminy Doe
1
Przypuszczam, że to byłeś ty, Jeff Schaller, za udzielenie mi opinii, za podanie właściwego rozwiązania i przetestowanie go. Zasadniczo robię dokładnie tę samą konfigurację, którą on jest, z wyjątkiem tego, że konfiguruję PI, aby przejść przez zaporę ogniową i uruchomić rdesktop, i przekazuję go naszemu kierownikowi biura, który nie wie nic o Linuksie, aby go użyć . Jestem pewien, że mam kuloodporne rozwiązanie, ponieważ teraz go używam i zrestartowałem zdalnie zarówno moją pi, jak i lokalny modem kablowy - na wszelki wypadek. Ale do cholery, nie pozwól, aby dostała się poprawna odpowiedź droga przesadzonego, niezrealizowanego ego.
Jimminy Doe