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 [email protected]

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!

Tom
quelle
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 [email protected]
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/[email protected]

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 [email protected]Datei an den Endbenutzer weiter und verwenden Sie die folgende Konfigurationsdatei

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 [email protected]
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0
Ben Lessani - Sonassi
quelle
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@
mgorven
quelle
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.

Mark Wagner
quelle
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 [email protected]

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

Deeler
quelle
0

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

lsof -i tcp

Als root ausführen.

Thor
quelle
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.

Eric
quelle