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 0
unmittelbar 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!
quelle
Antworten:
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:
Erstellen Sie dann eine neue Datei,
/etc/openvpn/client_server.conf
und fügen Sie Folgendes ein,SERVER_IP_ADDRESS
indem Sie die entsprechende ändernErstellen Sie dann einen Schlüssel für jeden Benutzer, der eine Verbindung herstellen soll, und erstellen Sie die Konfigurationsdatei im Verzeichnis ccd
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 Konfigurationsdateiquelle
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).Wenn die Clients unterschiedliche Benutzernamen haben, können Sie
netstat
herausfinden, welchen Port dersshd
Prozess des Benutzers abhört. Beispielsweise:quelle
Sie können den kurzlebigen Portbereich ändern (
/proc/sys/net/ipv4/ip_local_port_range
für Linux) und dann statisch zugewiesene Ports außerhalb dieses Bereichs verwenden.quelle
echo $[61002+RANDOM%4532]
, um eine Portnummer in diesem Bereich zu wählen.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:
dort siehst du die portnummer
quelle
Sie sollten in der Lage sein, die relevanten Informationen aus der Ausgabe von:
Als root ausführen.
quelle
Führen Sie dieses Skript auf dem Server aus:
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.
quelle