effettuare una connessione SSH inversa automatica all'avvio


9

Ho un PC dietro un NAT che stabilisce una connessione SSH inversa al mio VPC Digitalocean. Uso questa connessione SSH inversa da casa per accedere al PC del mio ufficio (sono autorizzato a farlo) e copiare i file e fare altre cose importanti.

Anche se non spesso, ho notato che il mio PC dell'ufficio si riavvia (a causa di interruzioni di corrente, ecc.) E interrompe la connessione SSH inversa che ha effettuato con il mio VPC. In questi casi, non riesco a collegarmi dal mio PC di casa al mio PC dell'ufficio.

Eseguo il seguente script per effettuare la connessione inversa + proxy dinamico per anonimizzare il mio traffico (poiché non sono tenuto a condividere le informazioni di navigazione) generato sul PC dell'ufficio.

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

Non è possibile eseguire nuovamente questo script sul PC dell'ufficio al riavvio poiché non sono fisicamente presente. Per risolvere questo problema ho installato il seguente crontab.

Nota: il rev.shfile contiene la riga sopra. Il certificato "digitalOcean" e rev.sh si trovano in Ubuntu home. Pertanto, quando eseguo ./rev.shnel mio terminale Ubuntu ottengo un proxy dinamico e accedo anche al server y DigitalOcean. Questo metodo funziona al 100%.

Tuttavia, quando installo chrontab nel seguente metodo, il mio PC Ubuntu non crea mai un proxy dinamico. Posso vederlo perché quando controllo questo proxy da Google Chrome, dice che il proxy rifiuta la connessione.

Ecco i cronejobs che ho provato come root cronejobs. Ho anche provato questi come un normale utente, ma non hanno funzionato.

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

Ho quindi installato un chrontab alcuni minuti prima dell'ora corrente e ho aspettato che si eseguisse.

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

neanche questi sono stati eseguiti.

Per favore, sii gentile abbastanza da aiutarmi a individuare il mio errore. Ci sono molte domande simili su questo sito sul mio problema. Ho quindi indirizzato molte risposte, ma nessuna di queste sembrava aiutare.


Non sono sicuro di quale sia il tuo problema qui. Cron non sta iniziando un lavoro? O lo script non funziona? Con entrambi i problemi, consultare i registri. Cron dovrebbe scrivere da qualche parte a /var/log/cron*. A scopo di test potresti semplicemente scrivere qualcosa del genere */2 * * * * /path/to/script: eseguirà uno script ogni 2 minuti. Controlla anche la posta per l'utente che esegue cron. È root? Usa il mailcomando. Oh, vedo che stai usando il tasto ssh? Dubito che cron job sarà in grado di trovarlo se non si fornisce un percorso completo dopo il -ipassaggio.
Kalavan,

Risposte:


8

Non sono sicuro che utilizzare cronper eseguire uno script all'avvio sia una buona idea. Un'alternativa che ritengo più adatta è quella di creare un servizio SystemD, come descritto qui . Crea un file chiamato /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

Quindi eseguire il comando seguente come root:

systemctl enable autossh.service

1

Un paio di cose che puoi provare:

chmod +x rev.sh

A volte il tuo percorso non è completamente impostato al momento dell'avvio o tramite cronjobs, quindi sostituisci autossh con il percorso completo, sul mio sistema che è

/usr/bin/autossh

Il motivo @reboot dipende dal tempo di avvio del demone cron, quindi può essere invocato prima che altri sottosistemi (rete?) siano attivi e funzionanti

E il tuo esempio crontab:

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

invocherà solo l'8 di ogni mese. E ha un campo in più. Provare

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

scusa è stato un errore. Ho provato '24 12 * * * /home/user/rev.sh 'ma non funzionava ancora. Con mia sorpresa, nemmeno "24 12 * * * reboot" ha funzionato.
Denis,

1
Beh, il riavvio non funzionerà sicuramente a meno che tu non stia invocando come root.
slowko,

Ho provato ad aggiungere / usr / bin / autossh. Non ha funzionato.
Denis,

Ho provato a riavviare 24 12 8 * * * nel crontab di root. Non ha funzionato. Funziona sul tuo?
Denis,

/usr/binè sempre l'impostazione predefinita PATH, anche percron
roaima il

1

Sembra che quando lo script viene eseguito tramite crontab non riesca a trovare il tuo certificato.

Quando l'utente esegue lo script, utilizza il certificato da /home/ubuntu-user/.ssh / ... Tuttavia, quando lo script viene eseguito da crontab, viene eseguito come root. root prende i certificati da /root/.ssh

Quindi hai diversi modi per farlo funzionare, ma penso che eseguire lo script come Ubuntu-user in crontab lo faccia.

Modificare:

assicurarsi di fornire un percorso completo qualificato per il certificato


1

Prova a usare su:

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

Aiuterà con il tuo problema?


0

poiché la domanda non contiene molti dati, ricomincio da capo con quello che farei

Vorrei mettere tutte le configurazioni in / 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

Vorrei inserire la chiave /etc/ssh/mytunnel_key

quindi proverei con una voce cron (un servizio upstart / systemd sarebbe meglio) in questo modo:

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

0

È necessario utilizzare -f ed eseguire un comando quando si esegue senza un terminale. Quindi ecco un esempio:

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

-f lo posiziona in background, ma posizionandolo in background significa che ssh si connetterà, quindi si disconnetterà non appena avrà completato il suo compito. Quindi hai bisogno di un compito.

sleep 31536000 dice a ssh di eseguire "sleep" per 1 anno dopo la connessione. Durante questo periodo, i tunnel rimarranno attivi.

Se non si esegue un comando, ssh si connetterà, installerà il tunnel inverso sulla porta 2205 e quando avrà finito, uscirà. Usando autossh, se la connessione fallisce, si riconnetterà e riavvierà nuovamente lo sleep. Anche con una connessione Internet davvero stabile, dubito che un anno sia possibile.

A proposito: a differenza di questi altri burloni, so che funziona, dal momento che l'ho effettivamente testato perché ovviamente sto facendo qualcosa di simile e dal momento che lo lavoro ora, in modo molto affidabile, posso darti la risposta corretta.

-f e "comando"

Questo è quello che ti stai perdendo.


1
Non penso che dobbiamo chiamare i nomi di altre persone qui.
Jeff Schaller

1
Non sto chiamando i nomi di altre persone. Sto sottolineando che le soluzioni suggerite in precedenza non sono mai state provate dalle persone che le hanno suggerite. Non mi credi? Provali.
Jimminy Doe,

1
Non credo che tu abbia affrontato anche il punto della domanda: le dichiarazioni di OP Questo metodo funziona al 100% . Credo che le loro domande si concentrino sull'esecuzione automatica dei loro script dopo il riavvio del PC.
Jeff Schaller

1
Se è al lavoro, può impostare i tunnel inversi a casa, perché l'OP è in esecuzione in un terminale, che funziona il 100% delle volte. I programmi ssh (e autossh) agiscono diversamente se non hanno un terminale associato al processo. Ha avuto problemi ad avere crontab (che funziona senza un terminale) per ricollegare i tunnel, proprio perché non sta usando -f, e anche se lo fosse, l'ssh usciva una volta che i tunnel sono stati installati, senza eseguire qualcosa - nel mio caso, vado corro a dormire, per un anno. Nello script -f deve essere usato CON UN COMANDO che impedisce a SSH di uscire. Questo è il suo problema.
Jimminy Doe,

1
Suppongo che fossi tu, Jeff Schaller, per avermi dato un voto negativo, per aver dato la soluzione corretta e averla effettivamente testata. Fondamentalmente sto facendo la stessa esatta configurazione che è, tranne che sto configurando un PI per passare attraverso un firewall e avviare rdesktop, e lo sto dando al nostro responsabile dell'ufficio, che non sa nulla di Linux, per usarlo . Abbastanza sicuro di avere una soluzione antiproiettile, dal momento che la sto usando ora, e ho riavviato sia il mio pi in remoto, sia il mio modem via cavo locale - solo per sicurezza .. Ma diamine, non lasciare che una risposta corretta entri la via di un ego esagerato, non appreso.
Jimminy Doe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.