établir une connexion SSH inverse automatisée au démarrage

9

J'ai un PC derrière un NAT qui établit une connexion SSH inverse avec mon VPC Digitalocean. J'utilise cette connexion SSH inversée de chez moi pour me connecter à mon PC de bureau (j'y suis autorisé) et copier des fichiers et faire d'autres choses importantes.

Bien que ce ne soit pas souvent, j'ai remarqué que mon PC de bureau redémarre (en raison de pannes de courant, etc.) et rompt la connexion SSH inversée qu'il a établie avec mon VPC. Dans ce type de cas, je ne parviens pas à me connecter de mon ordinateur personnel à mon ordinateur de bureau.

J'exécute le script suivant pour créer la connexion inversée + proxy dynamique pour anonymiser mon trafic (car je ne suis pas obligé de partager les informations de navigation) généré sur le PC de bureau.

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

Il n'y a aucun moyen de réexécuter ce script sur mon ordinateur de bureau lors d'un redémarrage car je n'y suis pas physiquement. Afin de résoudre ce problème, j'ai installé la crontab suivante.

Remarque: le rev.shfichier contient la ligne ci-dessus. Le certificat "digitalOcean" et rev.sh est situé dans Ubuntu home. Par conséquent, lorsque j'exécute ./rev.shdans mon terminal Ubuntu, j'obtiens un proxy dynamique et également l'accès au serveur ym DigitalOcean. Cette méthode fonctionne à 100%.

Cependant, lorsque j'installe le chrontab de la manière suivante, mon PC ubuntu ne fait jamais de proxy dynamique. Je peux le voir parce que lorsque je vérifie ce proxy à partir de Google Chrome, il dit que le proxy refuse la connexion.

Voici les cronejobs que j'ai essayés en tant que root cronejobs. J'ai également essayé ces derniers en tant qu'utilisateur normal, mais ils ne fonctionnaient toujours pas.

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

J'ai ensuite installé un chrontab quelques minutes avant l'heure actuelle et j'ai attendu qu'il s'exécute.

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

ceux-ci n'ont pas été exécutés non plus.

Veuillez être assez aimable pour m'aider à repérer mon erreur. Il y a beaucoup de questions similaires sur ce site sur mon problème. J'ai renvoyé de nombreuses réponses par la suite, mais aucune ne semblait aider.

Denis
la source
Je ne sais pas vraiment quel est votre problème ici. Est-ce que c'est cron de ne commencer aucun travail? Ou le script ne fonctionne pas? Avec les deux problèmes, veuillez consulter les journaux. Cron devrait écrire quelque part /var/log/cron*. À des fins de test, vous pouvez simplement écrire quelque chose comme */2 * * * * /path/to/script- il exécutera un script toutes les 2 minutes. Vérifiez également les e-mails de l'utilisateur exécutant cron. Est-ce root? Utilisez la mailcommande. Oh, je peux voir que vous utilisez la clé ssh? Je doute que cron job puisse le trouver si vous ne lui donnez pas un chemin complet après le -ichangement.
Kalavan

Réponses:

8

Je ne sais pas si utiliser cronpour exécuter un script au démarrage est une si bonne idée. Une alternative que je considère plus appropriée consiste à créer un service SystemD, comme décrit ici . Créez un fichier nommé /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

Exécutez ensuite la commande suivante en tant que root:

systemctl enable autossh.service
Dmitry Grigoryev
la source
1

Quelques choses que vous pouvez essayer:

chmod +x rev.sh

Parfois, votre chemin n'est pas entièrement défini au démarrage ou via les tâches cron, alors remplacez autossh par le chemin complet, sur mon système qui est

/usr/bin/autossh

Le motif @reboot dépend du temps de démarrage du démon cron, il peut donc être invoqué avant que d'autres sous-systèmes (réseau?) ne soient opérationnels

Et votre exemple crontab:

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

ne sera invoqué que le 8 de chaque mois. Et il a un champ supplémentaire. Essayer

24 12 * * * /home/user/rev.sh
slowko
la source
Désolé c'était une erreur. J'ai essayé '24 12 * * * /home/user/rev.sh 'mais cela ne fonctionnait toujours pas. À ma grande surprise, même «24 12 * * * reboot» n'a pas fonctionné.
Denis
1
Le redémarrage ne fonctionnera certainement pas, sauf si vous l'invoquez en tant que root.
slowko
J'ai essayé d'ajouter / usr / bin / autossh. Cela n'a pas fonctionné.
Denis
J'ai essayé de redémarrer 24 12 8 * * * dans la racine crontab. Cela n'a pas fonctionné. Cela fonctionne-t-il sur le vôtre?
Denis
/usr/binest toujours dans la valeur par défaut PATH, même pourcron
roaima
1

Il semble que lorsque le script est exécuté via crontab, il ne trouve pas votre certificat.

Lorsque vous, en tant qu'utilisateur, exécutez le script, il utilise le certificat de /home/ubuntu-user/.ssh / ... Cependant, lorsque le script est exécuté à partir de crontab, il s'exécute en tant que root. root prend les certificats de /root/.ssh

Vous avez donc plusieurs façons de le faire fonctionner, mais je pense que l'exécution du script en tant qu'utilisateur ubuntu dans crontab le fait.

Éditer:

assurez-vous de fournir un chemin d'accès complet pour le certificat

syss
la source
1

Essayez d'utiliser su:

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

Cela vous aidera-t-il avec votre problème?

Fedor Dikarev
la source
0

comme la question ne contient pas beaucoup de données, je vais recommencer à zéro avec ce que je ferais

Je mettrais toutes les configurations dans / 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

Je mettrais la clé /etc/ssh/mytunnel_key

alors j'essaierais avec une entrée cron (un service upstart / systemd serait mieux) comme ceci:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel
Diego Roccia
la source
0

Vous devez utiliser -f et exécuter une commande lorsque vous exécutez sans terminal. Voici donc un exemple:

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

-f le place en arrière-plan, mais le placer en arrière-plan signifie que ssh se connectera, puis se déconnectera dès qu'il aura terminé sa tâche. Vous avez donc besoin d'une tâche.

sleep 31536000 indique à ssh d'exécuter "sleep" pendant 1 an après la connexion. Pendant ce temps, vos tunnels resteront en place.

Si vous n'exécutez pas de commande, ssh se connectera, configurera le tunnel inverse sur le port 2205, et lorsque cela sera fait, il se fermera. En utilisant l'autossh, si la connexion échoue, il se reconnectera et redémarrera la veille. Même avec une connexion Internet vraiment stable, je doute qu'une année soit possible.

BTW - contrairement à ces autres jokers, je sais que cela fonctionne, car je l'ai testé car, bien sûr, je fais quelque chose de similaire et comme je le fais fonctionner maintenant, de manière très fiable, je peux vous donner la bonne réponse.

-f et "commande"

Voilà ce qui vous manque.

Jimminy Doe
la source
1
Je ne pense pas que nous ayons besoin d'appeler les noms d'autres personnes ici.
Jeff Schaller
1
Je n'appelle pas les noms d'autres personnes. Je souligne que les solutions qui ont été suggérées précédemment n'ont jamais été essayées par les personnes qui les ont suggérées. Tu ne me crois pas? Essayez les.
Jimminy Doe
1
Je ne pense pas que vous ayez abordé le point de la question non plus - l'OP prétend que cette méthode fonctionne à 100% . Je pense que leurs questions portent sur l'exécution de leur script de manière automatisée après le redémarrage de leur PC.
Jeff Schaller
1
S'il est au travail, il peut configurer les tunnels inverses à la maison, car l'OP s'exécute dans un terminal - cela fonctionne à 100% du temps. Les programmes ssh (et autossh) agissent différemment s'ils n'ont pas de terminal associé au processus. Il a eu des problèmes pour que crontab (qui fonctionne sans terminal) reconnecte les tunnels, précisément parce qu'il n'utilise pas -f, et même s'il l'était, le ssh se fermerait une fois les tunnels installés, sans exécuter quelque chose - dans mon cas, je vais dormir, pendant un an. Dans le script, -f doit être utilisé AVEC UNE COMMANDE qui empêche la fermeture de SSH. Voilà son problème.
Jimminy Doe
1
Je suppose que c'était vous, Jeff Schaller, pour m'avoir donné un downvote, pour avoir donné la bonne solution et l'avoir testée. Je fais essentiellement la même configuration que lui, sauf que je configure un PI pour passer par un pare-feu et que je démarre rdesktop, et que je le donne à notre responsable de bureau, qui ne sait rien de Linux, pour l'utiliser . Je suis presque certain que j'ai une solution pare-balles, car je l'utilise maintenant, et j'ai redémarré à la fois mon pi à distance et mon modem câble local - juste pour être sûr. Mais diable, ne laissez pas une réponse correcte entrer la voie d'un ego exagéré, non mérité.
Jimminy Doe