Führen Sie autossh als systemd-Dienst unter CentOS aus

Wenn Sie mit yum installieren, wird auch die Systemd-Einstellungsdatei abgelegt, so dass es einfach ist.

(An erster Stelle) Über die Übertragung von SSH-Ports

Dies ist eine allgemeine Technologie zum Übertragen der Kommunikation zwischen dem SSH-Verbindungsquellenhost und dem Verbindungszielhost.

Betrachten Sie beispielsweise die folgende Umgebung. Angenommen, Sie können keine Verbindung zu Geräten im Überprüfungsnetzwerk über das Internet herstellen und müssen einmal eine SSH-Verbindung zur Plattform herstellen.

image.png Wenn Sie über das Operationsterminal über HTTP auf den Webserver im Überprüfungsnetzwerk zugreifen möchten, können Sie hier die SSH-Portübertragung verwenden.

SSH


ssh -L 127.0.0.1:10080:<Webserver-Adresse>:80 <Schritt Serveradresse>

Fügen Sie die Option -L hinzu, wenn Sie sich SSH vom Bedienterminal auf der Plattform anmelden. Während SSH verbunden ist, wird dann die Kommunikation mit "127.0.0.1: 10080" des Bedienterminals an ": 80" übertragen (vom SSH-Verbindungsziel aus gesehen).

Zu diesem Zeitpunkt können Sie auf den Webserver zugreifen, indem Sie im Webbrowser "http: //127.0.0.1: 10080" eingeben.

Da die Kommunikation über SSH-Kanäle übertragen wird, wird die Kommunikation im Internet verschlüsselt.

Was ist autossh

Wie Sie sehen können, ist die Übertragung von SSH-Ports so bequem, dass Sie sie möglicherweise dauerhaft verwenden möchten.

Autossh ist in einem solchen Fall praktisch.

AUTOSSH(1)Mehr Auszug


     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 überwacht ssh und startet ssh neu, wenn ein Problem auftritt. Beginnen Sie wie folgt.

autossh


AUTOSSH_GATETIME=0 autossh -M 0 -N -L <Übertragungsoptionen> <SSH-Verbindungsziel>

Hier ist "-M" die Einstellung des Überwachungsports, aber da er nicht verwendet wird, wird er auf "0" gesetzt. Nach -N ist es eine SSH-Option. -N ist eine Option, die den Befehl nach einer SSH-Verbindung nicht ausführt, ohne die die Shell nicht gestartet werden kann.

Danach ist es dasselbe wie bei der normalen SSH-Port-Übertragung.

Es scheint, dass Autossh endet, wenn SSH getrennt wird, es sei denn, die Umgebungsvariable "AUTOSSH_GATETIME" ist auf 0 gesetzt.

Während Autossh ausgeführt wird, wird versucht, die Verbindung wiederherzustellen, wenn der SSH getrennt wird.

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

Installieren und ausführen mit systemd

Dieses Mal werde ich es auf CentOS 7 installieren. Die folgende Umgebung

Aktivieren und installieren Sie das Epel-Repository.

sudo yum install epel-release
sudo yum install autossh

Die Systemd-Konfigurationsdatei wird hier hinzugefügt.

$ rpm -ql autossh
/etc/autossh
/usr/bin/autossh
/usr/lib/systemd/system/[email protected] # <-Dies
/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

Es gibt eine Erklärung in / usr / share / doc / autossh-1.4g / README.service, also erstellen wir eine entsprechende Einstellungsdatei.

/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

Was in der Variablen "OPTIONS" angegeben ist, wird an autossh übergeben und ausgeführt.

Beim Booten von systemd wird autossh vom Benutzer "autossh" ausgeführt. Daher wird diesmal der Benutzer für die Anmeldung explizit mit der Option "-l" von SSH angegeben, und der private Schlüssel für die Authentifizierung wird explizit mit der Option "-i" angegeben.

Bewahren Sie den privaten Schlüssel an einem für den Autossh-Benutzer zugänglichen Ort auf.

#Wenn sich der Testbenutzer auf diesem Computer mit der Authentifizierung mit öffentlichem Schlüssel am Ziel anmelden kann.
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

Wenn Sie sich zum ersten Mal mit SSH anmelden, müssen Sie das Verbindungsziel bestätigen. Melden Sie sich daher einmal mit dem SSH-Befehl an.

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 ~]$

Zu diesem Zeitpunkt ist die Vorbereitung abgeschlossen.

Starten Sie den Dienst. Der Dienstname lautet "autossh @ <vor .conf in der Konfigurationsdatei>".

sudo systemctl start autossh@web

Sie können den Status überprüfen und wie andere Dienste neu starten / stoppen. Sie können es auch so einstellen, dass es startet, wenn die Maschine startet.

#Statusprüfung
$ 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

#Neustart
$ sudo systemctl restart autossh@web

#Startet, wenn die Maschine startet
$ sudo systemctl enable autossh@web

Anwendungsbeispiel

Hier sind einige mögliche Fälle.

web Es ist gut, TLS mit Nginx usw. zu erstellen, aber je nach Anwendung ist dies möglicherweise nicht erforderlich.

Ein wenig anders als am Beispiel am Anfang, Stellen Sie sich den Fall vor, in dem der Webserver (192.168.122.61) keinen HTTP-Zugriff von anderen Hosts in der Firewall zulässt. Angenommen, dieser Server kann zur Verwaltung über das Bedienterminal mit SSH verbunden sein.

[testing@localhost ~]$ curl 192.168.122.61:80
curl: (7) Failed connect to 192.168.122.61:80; No route to host
#kann nicht verbinden.

[testing@localhost ~]$ ssh 192.168.122.61
Last login: Thu Sep  3 03:48:08 2020 from 192.168.122.1
#SSH kann eine Verbindung herstellen.
 
[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>
#Folgendes wird weggelassen. Es kann vom lokalen Host aus aufgerufen werden.

Versuchen Sie die Portübertragung, damit Sie über das Bedienterminal eine HTTP-Verbindung herstellen können. Die Einstellungen für Autossh sind wie folgt.

/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]

Ich werde es versuchen.

#anfangen.
[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>
#Folgendes wird weggelassen.

VNC

Es ist ein Typ, der die Linux-GUI über das Netzwerk überprüfen kann. Es kann auch verwendet werden, um vom Hypervisor aus auf die Anzeige der virtuellen Maschine zuzugreifen.

Diesmal,

image.png

Dies ist die Autossh-Konfigurationsdatei. Angenommen, VNC wartet um 127.0.0.1: 5903 von 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

Leiten Sie den Port auf dem lokalen Host an 15903 weiter. Konvertieren Sie diesen Port in Websocket mit Websockify zur Verwendung mit noVNC.

websocketify


#Beginnen Sie damit.
websockify 25903 localhost:15903

25903 akzeptiert WebSocket. Dieses Mal werde ich versuchen, noVNC mit Nginx zu hosten. (Referenz 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;
    }
}

Wenn Sie den Dienst starten und darauf zugreifen, sieht es so aus. (Nachdem Sie die Webseite geöffnet, die Parameter eingegeben und eine Verbindung hergestellt haben.) image.png

Wenn Sie Nginx mit systemd starten, können Sie hier die Abhängigkeit festlegen.

$ sudo systemctl edit nginx
#Nachstehend beschrieben.
[Unit]
[email protected]

Wenn Sie dies tun, wird Autossh auch gestartet, wenn Sie Nginx starten. Ist es nicht gut, dass es einfach zu handhaben ist?

Zusammenfassung

Ich denke, Bequemlichkeit ist bequem.

Übrigens hat Ubuntu keine Systemd-Konfigurationsdatei, daher müssen Sie diese anscheinend selbst schreiben.

Recommended Posts

Führen Sie autossh als systemd-Dienst unter CentOS aus
So führen Sie die SpringBoot-App als Dienst aus
So installieren Sie GNOME als Desktop-Umgebung unter CentOS 7
Führen Sie PureScript auf einem Docker-Container aus
Führen Sie JVM-Math-Language als Gradle-Projekt aus
Installieren Sie das BookStack-Dokumentations-Wiki im Elastic Compute Service unter CentOS 7
Erstellen Sie eine gcloud-Entwicklungsumgebung auf einem centos8-Container
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus
Anscheinend unterscheiden sich die Umgebungsvariablen, wenn sidekiq als Dienst auf dem Produktionsserver ausgeführt wird