Reverse-SSH-Tunnel: Wie kann ich meine Portnummer an den Server senden?


12

Ich habe zwei Maschinen, Client und Server.

Der Client (der sich hinter einer Unternehmens-Firewall befindet) öffnet mit dem folgenden Befehl einen umgekehrten SSH-Tunnel zum Server, der über eine öffentlich zugängliche IP-Adresse verfügt:

ssh -nNT -R0: localhost: 2222 insecure@server.example.com

In OpenSSH 5.3+ bedeutet das Vorkommen 0unmittelbar nach dem -R" Wählen eines verfügbaren Ports", anstatt explizit einen Port anzufordern . Der Grund dafür ist, dass ich keinen Port auswählen möchte, der bereits belegt ist. In Wahrheit gibt es tatsächlich viele Kunden, die ähnliche Tunnel einrichten müssen.

Das Problem an dieser Stelle ist, dass der Server nicht weiß, welcher Client welcher ist. Wenn wir eine Verbindung zu einem dieser Clients (über localhost) herstellen möchten, woher wissen wir dann, welcher Port auf welchen Client verweist?

Mir ist bekannt, dass ssh die Portnummer an die Befehlszeile meldet, wenn es auf die oben beschriebene Weise verwendet wird. Ich möchte jedoch auch autossh verwenden, um die Sitzungen am Leben zu erhalten. autossh führt seinen Child-Prozess vermutlich über fork / exec aus, sodass die Ausgabe des eigentlichen ssh-Befehls im Ether verloren geht.

Außerdem kann ich mir keine andere Möglichkeit vorstellen, um den Remote-Port vom Client abzurufen. Daher frage ich mich, ob es eine Möglichkeit gibt, diesen Port auf dem Server zu bestimmen.

Eine Idee, die ich habe, ist, irgendwie / etc / sshrc zu verwenden, was angeblich ein Skript ist, das für jede Verbindung ausgeführt wird. Ich weiß jedoch nicht, wie man hier die relevanten Informationen erhält (vielleicht die PID des jeweiligen SSHD-Prozesses, der diese Verbindung verarbeitet?). Ich würde gerne einige Hinweise erhalten.

Vielen Dank!


2
Wäre ein VPN nicht angemessener? OpenVPN ist sehr einfach zu konfigurieren.
Ben Lessani - Sonassi

Klingt interessant. Ich weiß nicht viel über VPN. Funktioniert dies auch, wenn der Client-Computer für die Verwendung von DHCP konfiguriert ist?
Tom

1
Ja, es wird von einer anderen TUN / TAP-Schnittstelle ausgeführt, sodass andere Schnittstellen keine Rolle spielen.
Ben Lessani - Sonassi

@sonassi, es sieht so aus, als würde dieses VPN-Ding den Trick machen. Danke für die Information.
Tom

Ich habe unten eine Antwort hinzugefügt, die Sie speziell durch den VPN-Prozess mit OpenVPN (basierend auf Debian / Ubuntu) führt.
Ben Lessani - Sonassi

Antworten:


4

Wäre ein VPN nicht angemessener? OpenVPN ist sehr einfach zu konfigurieren. Hier ist eine Beispielkonfiguration und einige Links, die Sie durch den Zertifikaterstellungsprozess führen:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Erstellen Sie dann eine neue Datei, /etc/openvpn/client_server.confund fügen Sie Folgendes ein, SERVER_IP_ADDRESSindem Sie die entsprechende ändern

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Erstellen Sie dann einen Schlüssel für jeden Benutzer, der eine Verbindung herstellen soll, und erstellen Sie die Konfigurationsdatei im Verzeichnis ccd

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

Die IP-Adresse MUSS für ein / 30-Subnetz geeignet sein (siehe http://www.subnet-calculator.com/cidr.php ), da nur 2 Adressen (Server und Client) pro Verbindung verfügbar sind. Ihre nächste verfügbare Client-IP wäre also 192.168.100.6 und so weiter.

Dann haben Sie jetzt statische IPs pro verbindendem Benutzer.

Geben Sie dann die the user1@domain.com.p12Datei an den Endbenutzer weiter und verwenden Sie die folgende Konfigurationsdatei

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

Danke für die gründliche Antwort! Ich habe jedoch zwei Fragen dazu. A) Die Angabe von 255.255.255.0 für die ifconfig-push-Leitung des Clients scheint nicht zu funktionieren, funktioniert jedoch, wenn ich eine zweite IP-Adresse angebe. Warum ist das? Und B) bedeutet dieser Ansatz, dass pro Verbindung 4 IP-Adressen verwendet werden?
Tom

Auf einigen Linux-Systemen unterscheidet sich die Syntax für die Zeile ifconfig-push. Z.B. ifconfig-push 192.168.100.2 192.168.100.3- Ich habe keine Ahnung, warum es auf Plattformen anders ist. Und ja, es bedeutet, dass pro Client 4 IPs verwendet werden (verschwenderisch, aber die Natur des Tieres).
Ben Lessani - Sonassi

3

Wenn die Clients unterschiedliche Benutzernamen haben, können Sie netstatherausfinden, welchen Port der sshdProzess des Benutzers abhört. Beispielsweise:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

Sie können den kurzlebigen Portbereich ändern ( /proc/sys/net/ipv4/ip_local_port_rangefür Linux) und dann statisch zugewiesene Ports außerhalb dieses Bereichs verwenden.


Keine Notwendigkeit, den kurzlebigen Bereich dafür zu ändern. Standardmäßig endet der kurzlebige Bereich bei 61000, sodass darüber Tausende von verfügbaren Portnummern verfügbar sind. Ich habe oft benutztecho $[61002+RANDOM%4532] , um eine Portnummer in diesem Bereich zu wählen.
Kasperd

2

Ich möchte dasselbe Setup wie Sie. Ich habe die Protokollebene des SSH-Servers auf DEBUG erhöht und in den Protokollen angezeigt, wie der lokale Port des Clients lautete

beispielsweise:

Client-Befehl: ssh -N -R0:127.0.0.1:5522 connector@example.com

Serverprotokoll:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

dort siehst du die portnummer


0

Sie sollten in der Lage sein, die relevanten Informationen aus der Ausgabe von:

lsof -i tcp

Als root ausführen.


0

Führen Sie dieses Skript auf dem Server aus:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

Möglicherweise benötigen Sie die beiden Sudos. Entfernen Sie, wenn Sie dies nicht tun.

PS - Dies ist eine modifizierte Version einer Lösung, die ich vor einiger Zeit an anderer Stelle gefunden habe. Ich denke, es könnte von StackOverflow stammen, aber ich kann die ursprüngliche Referenz nicht finden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.