Si vous installez avec yum, le fichier de configuration systemd sera également placé, donc c'est facile.
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.
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 "
À 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.
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
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
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
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.)
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?
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