Exécutez autossh en tant que service systemd sur CentOS

Si vous installez avec yum, le fichier de configuration systemd sera également placé, donc c'est facile.

(En premier lieu) À propos du transfert de port SSH

Il s'agit d'une technologie générale de transfert de communication entre l'hôte de source de connexion SSH et l'hôte de destination de connexion.

Par exemple, considérez l'environnement suivant. Supposons que vous ne puissiez pas vous connecter aux appareils du réseau de vérification à partir d'Internet et que vous deviez une fois vous connecter à la plate-forme en SSH.

image.png Ici, si vous souhaitez accéder au serveur Web dans le réseau de vérification par HTTP à partir du terminal d'exploitation, vous pouvez utiliser le transfert de port SSH.

SSH


ssh -L 127.0.0.1:10080:<Adresse du serveur Web>:80 <Adresse du serveur d'étape>

Ajoutez l'option -L lors de la connexion SSH du terminal d'exploitation à la plate-forme. Ensuite, pendant que SSH est connecté, la communication avec "127.0.0.1: 10080" du terminal d'exploitation est transférée vers ": 80" (vue depuis la destination de connexion SSH).

À ce stade, vous pouvez accéder au serveur Web en entrant http: //127.0.0.1: 10080 dans le navigateur Web.

De plus, comme la communication est transférée via des canaux SSH, la communication est cryptée sur Internet.

Qu'est-ce que l'autossh

Comme vous pouvez le voir, le transfert de port SSH est si pratique que vous voudrez peut-être l'utiliser en permanence.

Autossh est pratique dans un tel cas.

AUTOSSH(1)Plus d'extrait


     autossh is a program to start a copy of ssh and monitor it, restarting it as necessary should it die or
     stop passing traffic.

autossh surveille ssh et redémarre ssh s'il y a un problème. Commencez comme suit.

autossh


AUTOSSH_GATETIME=0 autossh -M 0 -N -L <Options de transfert> <Destination de la connexion SSH>

Ici, -M est le réglage du port de surveillance, mais comme il n'est pas utilisé, il est réglé sur 0. Après -N, c'est une option SSH. -N est une option qui n'exécute pas de commandes après la connexion SSH, sans laquelle les tentatives de démarrage du shell échoueront.

Après cela, c'est la même chose que le transfert de port SSH normal.

Il semble que l'autossh se termine lorsque SSH est déconnecté à moins que la variable d'environnement AUTOSSH_GATETIME soit définie sur 0.

Pendant l'exécution de l'autossh, il essaiera de se reconnecter si le SSH est déconnecté.

Sep 02 14:24:14 localhost.localdomain autossh[9968]: Connection to 192.168.122.61 closed by remote host.
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 2)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10189
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 3)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10190
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 4)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10191
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 5)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10192
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 6)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10193
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:14 localhost.localdomain autossh[9968]: starting ssh (count 7)
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh child pid is 10194
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: Connection refused
Sep 02 14:24:14 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:16 localhost.localdomain autossh[9968]: starting ssh (count 8)
Sep 02 14:24:16 localhost.localdomain autossh[9968]: ssh child pid is 10195
Sep 02 14:24:26 localhost.localdomain autossh[9968]: ssh: connect to host 192.168.122.61 port 22: No route to host
Sep 02 14:24:26 localhost.localdomain autossh[9968]: ssh exited with error status 255; restarting ssh
Sep 02 14:24:34 localhost.localdomain autossh[9968]: starting ssh (count 9)
Sep 02 14:24:34 localhost.localdomain autossh[9968]: ssh child pid is 10196

Installer et exécuter avec systemd

Cette fois, je vais l'installer sur CentOS 7. L'environnement suivant

Activez et installez le référentiel epel.

sudo yum install epel-release
sudo yum install autossh

Le fichier de configuration systemd est ajouté ici.

$ rpm -ql autossh
/etc/autossh
/usr/bin/autossh
/usr/lib/systemd/system/[email protected] # <-ce
/usr/share/doc/autossh-1.4g
/usr/share/doc/autossh-1.4g/CHANGES
/usr/share/doc/autossh-1.4g/README
/usr/share/doc/autossh-1.4g/README.service
/usr/share/doc/autossh-1.4g/examples
/usr/share/doc/autossh-1.4g/examples/autossh.host
/usr/share/doc/autossh-1.4g/examples/rscreen
/usr/share/man/man1/autossh.1.gz

$ cat /usr/lib/systemd/system/[email protected]
[Unit]
Description=autossh: %I
Documentation=file:///usr/share/doc/autossh/README.service man:autossh(1)
After=network.target

[Service]
User=autossh
Environment="AUTOSSH_GATETIME=0"
EnvironmentFile=/etc/autossh/%i.conf
ExecStart=/usr/bin/autossh $OPTIONS

[Install]
WantedBy=multi-user.target

Il y a une explication dans / usr / share / doc / autossh-1.4g / README.service, alors créons un fichier de configuration en fonction de cela.

/etc/autossh/web.conf


OPTIONS=-M 0 -N -L 127.0.0.1:10080:192.168.0.2:80 -i /etc/autossh/keys/testing.rsa -l testing 192.168.122.61

Ce qui est spécifié dans la variable OPTIONS est passé à autossh et exécuté.

Lors du démarrage à partir de systemd, autossh est exécuté par l'utilisateur autossh. Par conséquent, cette fois, l'utilisateur pour la connexion est explicitement spécifié avec l'option -l de SSH, et la clé privée pour l'authentification est explicitement spécifiée avec l'option -i.

Conservez la clé privée dans un endroit accessible à l'utilisateur autossh.

#Si l'utilisateur testeur sur cette machine peut se connecter à la destination avec une authentification par clé publique.
sudo -u autossh mkdir -m 700 /etc/autossh/keys
sudo cp /home/testing/.ssh/id_rsa /etc/autossh/keys/testing.rsa
sudo chown autossh:autossh /etc/autossh/keys/testing.rsa

Lorsque vous vous connectez pour la première fois avec SSH, vous devez confirmer la destination de la connexion, donc connectez-vous une fois avec la commande SSH.

python


$ sudo -u autossh ssh -i /etc/autossh/keys/testing.rsa [email protected]
The authenticity of host '192.168.122.61 (192.168.122.61)' can't be established.
ECDSA key fingerprint is SHA256:gYYyvZ9++CwtcU3zlpfEJHgo509G7KaqSDpaqBDte8o.
ECDSA key fingerprint is MD5:de:c9:1c:80:0d:60:8c:33:9f:c8:22:48:8f:dc:6b:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.122.61' (ECDSA) to the list of known hosts.
Last login: Wed Sep  2 12:18:35 2020 from 192.168.122.1
[testing@localhost ~]$

À ce stade, la préparation est terminée.

Démarrez le service. Le nom du service sera autossh @ <avant .conf dans le fichier de configuration>.

sudo systemctl start autossh@web

Vous pouvez vérifier l'état et redémarrer / arrêter comme d'autres services. Vous pouvez également le configurer pour qu'il démarre lorsque la machine démarre.

#Vérification de l'état
$ sudo systemctl status autossh@web
● [email protected] - autossh: web
   Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-09-02 13:58:32 EDT; 6s ago
     Docs: file:///usr/share/doc/autossh/README.service
           man:autossh(1)
 Main PID: 9954 (autossh)
   CGroup: /system.slice/system-autossh.slice/[email protected]
           ├─9954 /usr/bin/autossh -M 0 -N -L 127.0.0.1:10080:192.168.1.2:80 -i /etc/autossh/keys/testing.rsa t...
           └─9955 /usr/bin/ssh -N -L 127.0.0.1:10080:192.168.1.2:80 -i /etc/autossh/keys/testing.rsa testing@19...

Sep 02 13:58:32 localhost.localdomain systemd[1]: Started autossh: web.
Sep 02 13:58:32 localhost.localdomain autossh[9954]: port set to 0, monitoring disabled
Sep 02 13:58:32 localhost.localdomain autossh[9954]: starting ssh (count 1)
Sep 02 13:58:32 localhost.localdomain autossh[9954]: ssh child pid is 9955

#redémarrer
$ sudo systemctl restart autossh@web

#Démarre lorsque la machine démarre
$ sudo systemctl enable autossh@web

Exemple d'utilisation

Voici quelques cas possibles.

web Il est bon de le rendre TLS avec Nginx etc., mais selon l'application, cela peut ne pas être nécessaire.

Un peu différent de l'exemple du début, Prenons le cas où le serveur Web (192.168.122.61) n'autorise pas l'accès HTTP à partir d'autres hôtes du pare-feu. Supposons que ce serveur puisse être connecté SSH à partir du terminal d'exploitation pour la gestion.

[testing@localhost ~]$ curl 192.168.122.61:80
curl: (7) Failed connect to 192.168.122.61:80; No route to host
#peut pas se connecter.

[testing@localhost ~]$ ssh 192.168.122.61
Last login: Thu Sep  3 03:48:08 2020 from 192.168.122.1
#SSH peut se connecter.
 
[testing@web ~]$ curl -i 127.0.0.1:80
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.5
Date: Thu, 03 Sep 2020 07:59:31 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 414

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
#Ce qui suit est omis. Il est accessible depuis l'hôte local.

Essayez le transfert de port afin de pouvoir établir une connexion HTTP à partir du terminal d'exploitation. Les paramètres de l'autossh sont les suivants.

/etc/autossh/web.conf


OPTIONS=-M 0 -N -L 127.0.0.1:10080:127.0.0.1:80 -i /etc/autossh/keys/testing.rsa [email protected]

J'essaierai de l'utiliser.

#commencer.
[testing@localhost ~]$ sudo systemctl start autossh@web

[testing@localhost ~]$ curl 127.0.0.1:10080
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
#Ce qui suit est omis.

VNC

C'est un gars qui peut vérifier l'interface graphique Linux sur le réseau. Il peut également être utilisé pour accéder à l'affichage de la machine virtuelle depuis l'hyperviseur.

Cette fois,

--Pour le serveur qui accepte VNC du local

image.png

Il s'agit du fichier de configuration d'autossh. Supposons que VNC attend à "127.0.0.1: 5903" de "192.168.122.1".

/etc/autossh/vnc.conf


OPTIONS=-M 0 -N -L 127.0.0.1:15903:127.0.0.1:5903 -l testing -i /etc/autossh/keys/testing.rsa 192.168.122.1

Transféré le port vers 15903 sur l'hôte local. Convertissez ce port en Websocket avec Websockify pour une utilisation avec noVNC.

websocketify


#Commencez avec ça.
websockify 25903 localhost:15903

25903 accepte WebSocket. Cette fois, je vais essayer d'héberger noVNC avec Nginx. (Référence https://github.com/novnc/noVNC/wiki/Proxying-with-nginx)

bash:/etc/nginx/conf.d/novnc.conf


server {
    listen 80;
    server_name 192.168.122.80;
    location /websockify {
        proxy_pass http://127.0.0.1:25903/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    location / {
        index index.html;
        alias /usr/share/novnc;
    }
}

Lorsque vous démarrez le service et y accédez, cela ressemble à ceci. (Après ouverture de la page Web, saisie des paramètres et connexion.) image.png

Ici, si vous démarrez Nginx avec systemd, vous pouvez définir la dépendance.

$ sudo systemctl edit nginx
#Décrit ci-dessous.
[Unit]
[email protected]

Si vous faites cela, l'autossh sera également démarré lorsque vous démarrez Nginx. N'est-il pas bon qu'il soit facile à manipuler?

Sommaire

Je pense que la commodité est pratique.

À propos, Ubuntu n'a pas de fichier de configuration systemd, il semble donc que vous deviez l'écrire vous-même.

Recommended Posts

Exécutez autossh en tant que service systemd sur CentOS
Comment exécuter l'application SpringBoot en tant que service
Comment installer GNOME en tant qu'environnement de bureau sur CentOS 7
Exécuter PureScript sur un conteneur Docker
Exécutez JVM-Math-Language comme un projet Gradle à portée de main
Installer le wiki de documentation BookStack sur Elastic Compute Service sur CentOS 7
Créer un environnement de développement gcloud sur un conteneur centos8
Java11: exécuter le code Java dans un seul fichier tel quel
Apparemment, les variables d'environnement sont différentes lors de l'exécution de sidekiq en tant que service sur le serveur de production