Guten Tag an alle!
Nächste Woche starten wir die nächste
Linux-Administratorgruppe , in deren Zusammenhang wir eine Reihe von Veranstaltungen durchgeführt haben. Eine davon ist eine offene Lektion zum Thema „SSH / NC / Socat: Tipps & Tricks“. Darauf erinnerten wir uns, was SSH ist, seine Geschichte und Mission. Wir haben verschiedene Optionen für die Verwendung untersucht: Remote, lokale Portweiterleitung, sichere Kopie, Socken-Proxy, Reverse-Proxy. Wir haben die Dienstprogramme nc und socat tatsächlich in einem virtuellen Labor ausprobiert.
Das Webinar wurde von dem erfahrenen Systemadministrator
Vladimir Drozdetsky , einem Infrastrukturentwickler bei letundra.com, exposcan.ru, crispmessenger.com, durchgeführt.
Wir machen Sie auf eine detaillierte Beschreibung der vergangenen Veranstaltung aufmerksam.
Erinnern Sie sich, was SSH istSSH (Secure Shell) ist eine „sichere Shell“, ein Netzwerkprotokoll auf Anwendungsebene. Sie können damit das Betriebssystem fernsteuern und TCP-Verbindungen tunneln (z. B. um Dateien zu übertragen). In seiner Funktionalität ähnelt SSH den Protokollen Telnet und rlogin, unterscheidet sich jedoch von diesen, da es den gesamten Datenverkehr einschließlich der übertragenen Kennwörter verschlüsselt. Die SSH-2-Protokollspezifikation ist in RFC 4251 enthalten.
Schauen wir uns die verschiedenen Verwendungen von SSH an, sowohl Standard- als auch Nicht-Standard-Anwendungen. Der folgende Stand hilft uns dabei:

Der Stand präsentiert vier virtuelle Maschinen, die sich hinter der Firewall befinden. Wir werden alle Aktionen von der Node-1-Maschine ausführen.
Erstellen eines SSH-Schlüssels
Um den SSH-Schlüssel verwenden zu können, müssen Sie ihn zuerst erstellen. Hierfür eignet sich ein spezielles Dienstprogramm, das absolut in jeder Linux-Distribution enthalten ist:
ssh-keygen -t RSA -N otuslinux -f ~/.ssh/otus
- -t - welcher Verschlüsselungsalgorithmus verwendet werden soll;
- -N - Verschlüsselungsschlüssel (ein praktisches Argument, wenn Sie einen Schlüssel ohne Verschlüsselung und Antworten auf verschiedene ssh-keygen-Anforderungen erstellen müssen);
- -f - in welcher Datei der Schlüssel gespeichert werden soll.
SSH-Einstellungen SSH-ServerFür weitere Arbeiten müssen Sie die Datei / etc / ssh / sshd_config bearbeiten und den ssh-Server neu starten. Hier sollten Sie folgende Optionen beachten:
RSAAuthentication yes
(ob die RSA-Authentifizierung zulässig ist);
PubkeyAuthentication yes
(ob die Authentifizierung per Schlüssel zulässig ist);
AuthorizedKeysFile %h/.ssh/authorized_keys
(Pfad zum öffentlichen Teil des Schlüssels);
PasswordAuthentication yes
(ob die Authentifizierung zulässig ist).
Gehen Sie wie folgt vor, um den Schlüssel auf den Server zu kopieren:
ssh-copy-id -i /path/to/pub/key user@server
(Kopieren Sie den öffentlichen Teil des Schlüssels auf den Remote-Server. Der öffentliche Schlüssel wird entlang des Pfads in die Datei% h / .ssh / autorisierte_Tasten kopiert.)
Um den Verschlüsselungsschlüssel beim Herstellen einer Verbindung zu einem Remote-Server nicht jedes Mal erneut einzugeben, können wir ssh-agent verwenden. Dafür:
eval $(ssh-agent -s)
(eval ist Teil von POSIX. Die Schnittstelle kann auch eine Shell sein. Der Schlüssel im Agenten wird in entschlüsselter Form gespeichert.)
ssh-add ~/.ssh/our_private_key
(Fügen Sie einen privaten Schlüssel hinzu).
In diesem Fall:
- -i - gibt den Speicherort des öffentlichen Schlüssels an;
- Benutzer - Benutzername auf dem Remote-Server;
- Server - IP oder DNS des Zielservers.
Um die Verbindung zu einem Remote-Server zu vereinfachen, können wir die Verbindungsparameter in der ssh-Konfigurationsdatei beschreiben, die sich im Pfad ~ / .ssh / config befindet
Somit erhalten wir die folgende SSH-Konfigurationsdatei:
Host myserver HostName ip/hostname Port 22/??? User username IdentityFile ~/.ssh/id_rsa
Hier ist alles einfach:
- Host - der Name unserer Verbindung;
- Hostname - Servername;
- Port - ssh Port
- Benutzer - Benutzername;
- IdentityFile - ssh-Schlüssel.
SSH SCPLass uns weitermachen. Der einfachste Weg, SSH zu verwenden, besteht darin, die Datei von einem Computer auf die Fernbedienung zu kopieren. Verwenden Sie dazu das Dienstprogramm SCP (Secure Copy Protocol). Mit ihm können Sie ein Verzeichnis oder eine Datei von einem lokalen Server auf einen Remote-Server kopieren oder umgekehrt:
scp test.txt username@server:/some/directory
(Kopieren einer Datei vom lokalen Server auf den Remote-Server).
scp username@server:test.txt /some/directory
(Kopieren einer Datei von einem Remote-Server auf einen lokalen).
scp -r dir_name username@server:/some/directory
(Kopieren eines Ordners vom lokalen Server auf die Remote).
Hier:
- Benutzername - Benutzername;
- Server - Serveradresse;
- / some / server - das Verzeichnis, in das wir kopieren;
- dir_name - Ordnername;
- -r - rekursiv verwenden.
SSH-Tunnel, ProxySchauen wir uns nun die Möglichkeit an, einen Port mit einer Fernbedienung an den lokalen Computer weiterzuleiten. Nehmen wir den klassischen Fall als Beispiel, das heißt, ein Haufen, wenn wir einen „bösen Sicherheitsbeamten“ und einen Server mit einer Webanwendung haben, die SSH- und https-Ports in die Welt schauen und wir wirklich eine Verbindung zum MySQL-Server herstellen möchten.
Also:
ssh -f -N -L 9906:127.0.0.1:3306 user@server
(Nur unser Fall mit MySQL)
Infolgedessen können wir mit dem MySQL-Client eine Verbindung zum lokalen Port 9906 herstellen und zu unserem "Sicherheitsserver" gelangen.
ssh -D 8080 -q -C -N -f servername
(Proxy-Verkehr durch SOCKS über Port 8080)
Mit diesem Befehl erstellen wir mit ssh einen socks5-Proxyserver. Um die Leistung zu überprüfen, können wir den folgenden Befehl verwenden:
curl -x socks5h://server-with-proxy:8080 https://test.domain
Ein klassisches Beispiel für die Portweiterleitung mit ssh ist, wenn sich der Server, zu dem Sie eine Verbindung herstellen möchten, hinter dem nat befindet. Der folgende Befehl hilft uns, eine Verbindung zu einem solchen Server herzustellen:
ssh -f -N -R 2255:localhost:22 username@servername
(Weiterleitung von einem Remote-Server an einen lokalen Server).
Auf dem Remote-Server wird Port 2255 geöffnet, der für das nat an Port 22 unseres Servers umgeleitet wird. Um eine Verbindung zu einem solchen Server herzustellen, können wir den folgenden Befehl verwenden:
ssh -p 2255 username@localhost
Bitte beachten Sie Folgendes:
- -f - sende ssh an den Hintergrund;
- -N - Führen Sie den Befehl nicht auf dem Remote-Host aus.
- -L - leitet den lokalen Port weiter (lokaler Port: lokaler Computer: Remote-Port);
- -R - Port am Remote-Computer;
- -q - stiller Modus;
- -D - definiert das lokale dynamische Routing von Ports auf Anwendungsebene;
- -C - Anforderung zur Datenkomprimierung.
Netcat (nc)Unser nächster Stopp ist Netcat, ein Unix-Dienstprogramm, mit dem Sie TCP- und UDP-Verbindungen herstellen, Daten von dort empfangen und übertragen können. Trotz seiner Nützlichkeit und Einfachheit ist dieses Dienstprogramm in keinem Standard enthalten und wird nicht mit einem Distributionskit geliefert. Dementsprechend muss es von Hand installiert werden.
Eine der interessanten Funktionen von Netcat (nc) ist die Möglichkeit, Ports zu scannen:
nc -vn ipaddress 22
(Single-Port-Scan);
nc -v ipaddress 10-55
(Port Range Scan);
nc -l 4444
(Port 4444 öffnen und abhören);
nc servername 4444
(wir stellen über den gewünschten Port eine Verbindung zum Server her).
Nachdem wir den Port geöffnet und eine Verbindung hergestellt haben, erhalten wir einen kleinen Netzwerk-Chatroom =).
Als nächstes betrachten wir die Möglichkeit, Dateien mit dem Dienstprogramm nc zu übertragen. Dazu hilft uns der folgende Befehl:
cat test_file | pv -b | nc -l 4444
cat test_file | pv -b | nc -l 4444
(öffne den Port und übertrage die Datei über die Pipe dorthin. Das Dienstprogramm pv mit dem Schalter -b wird verwendet, um den Fortschritt der Dateiübertragung in Bytes anzuzeigen.)
nc servername 4444 | pv -b > filename
nc servername 4444 | pv -b > filename
(wir stellen eine Verbindung zum Server her, um die Datei zu empfangen, pv -b wird auf die gleiche Weise verwendet).
Wir können unsere Pipe komplizieren, indem wir die Dateiarchivierung im laufenden Betrieb hinzufügen:
tar -czf - /path/to/ | pv -b | nc -l 4444
tar -czf - /path/to/ | pv -b | nc -l 4444
(Ordner im
tar -czf - /path/to/ | pv -b | nc -l 4444
archivieren und senden);
n
c servername 4444 | pv -b > file.tar.gz
c servername 4444 | pv -b > file.tar.gz
(das Archiv wird gesendet).
Ein nicht sehr offensichtliches Merkmal von nc ist das Erstellen eines http-Servers.
while true; do nc -lp 80 < index.html; done
Bitte beachten Sie, dass Sie Root-Rechte haben müssen, um Port 80 verwenden zu können.
Beachten Sie auch Folgendes:
- -l - zeigt den Betriebsmodus des Hörens an;
- -n - keine DNS-Abfragen verwenden;
- -v - ausführliche Ausgabe.
SocatEs ist auch ein nützliches Dienstprogramm, mit dem Sie TCP-Verbindungen zwischen Computern, Forward-Ports usw. herstellen können. Es funktioniert nach dem Prinzip von Netcat: Es öffnet zwei bidirektionale Verbindungen, kann Daten, Streams usw. übertragen. Es verfügt jedoch über eine interessante Funktion. Mit Socat können wir beispielsweise COM-Ports TCP-Ports usw. zuordnen.
Socat Arbeitsbeispiele:
socat -u FILE:file_name TCP-LISTEN:5778,reuseaddr
# send file;
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name
# get file;
socat TCP-LISTEN:80,fork TCP:ubuntunode-4:80
# Portweiterleitung des Remote-Servers an den lokalen Port;
socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash
# Remote-Shell öffnen =);
socat - TCP:server_with_remote_shell:1234
#
socat - TCP:server_with_remote_shell:1234
eine Verbindung zur Remote-Shell des Remote-Servers her.
Kleine Entschlüsselung:
- -u - Verwendung des unidirektionalen Modus;
- DATEI - Geben Sie an, dass wir die Datei verwenden.
- TCP-LISTEN - Abhören des TCP-Ports;
- reuseaddr - ermöglicht es anderen Sockets, mit derselben Adresse zu kommunizieren, auch wenn diese verwendet wird;
- Fork - Nachdem die Verbindung hergestellt wurde, wird der Kanal im untergeordneten Prozess verarbeitet.
- TCP ist die Art der Verbindung.
Soll ich mir jetzt die Videoversion ansehen?Natürlich ja, denn in der Beschreibung wird alles abstrakt dargestellt. Darüber hinaus werden die Themen des Webinars ausführlicher beschrieben. Einige von ihnen bieten zusätzliche Beispiele und Implementierungsoptionen. Wenn Sie sich für dieses Thema interessieren, schauen Sie sich die offene Lektion vollständig an und wiederholen Sie alle Schritte für
Vladimir Drozdetsky, um eine maximale Assimilation des Materials zu erreichen. Und vergessen Sie nicht, Ihre Kommentare zu hinterlassen.
Wir verabschieden uns wiederum nicht und laden Sie zum
Linux Administrator Kurs ein!