SSH-Zugriff auf den Office-Host hinter dem NAT-Router

32

Ich möchte von zu Hause aus auf den ssh-Port meines Office-Linux-Hosts zugreifen. Leider befindet sich der Host hinter einem NAT-Router. Daher ist die IP-Adresse nicht öffentlich verfügbar. Es besteht jedoch Zugriff auf einen anderen Internet-Host (Server), der leider nur Nicht-Root-Zugriff hat. Nach einer Weile der Suche finde ich keine passende Lösung.

Folgendes Setup:

  • Office-PC (Linux, Root-Zugriff) hinter NAT (IP nicht öffentlich), aber voller Internetzugang.
  • Server-PC (Linux, kein Root-Zugriff) statische und öffentliche IP und vollständiger Internetzugang.
  • Heim-PC (Linux, Root-Zugriff) hinter NAT (IP nicht öffentlich), aber voller Internetzugang.

Mögliche Verbindungen: Office PC -> Server <- Home PC

Nicht möglich: Office-PC <-X- Server -X-> Heim-PC

Weder der Home-PC noch der Server können den Zugriff auf den Office-PC initiieren. Sowohl der Office-PC als auch der Home-PC können jedoch Verbindungen zum Server herstellen.

Reverse-SSH-Tunnel nicht möglich: Ich habe eine Methode namens Reverse-SSH-Tunnel ausprobiert. Leider erfordert dies, dass GatewayPorts auf dem Server in / etc / ssh / sshd_config auf "yes" gesetzt ist, wobei ich keinen Root-Zugriff habe.

Grundsätzlich sollte es möglich sein:

0) Auf dem Server starte ich ein Userspace-Programm, das auf 2 Ports lauscht (1 eingehender, 1 ausgehender)

1) Auf meinem Büro-PC führe ich ein anderes Programm aus, das eine TCP-Verbindung zum ausgehenden Port des Servers offen hält.

2) Von zu Hause aus verbinde ich mich mit dem eingehenden Port des Servers.

Hierfür sollte es eine Standardlösung geben.

Was ist die schnellste und sauberste Lösung, um dieses Problem zu lösen?

Frank

ritter
quelle
1
Kann der Arbeits-PC eine Verbindung zum Heimnetzwerk herstellen, um einen SSH-Tunnel einzurichten? en.gentoo-wiki.com/wiki/Autossh
Sie können FileZilla mit SFTP und Portweiterleitung verwenden. Check out: superuser.com/a/1286681/141314
Noam Manos

Antworten:

30
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

Später:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

Was Sie tun könnten, ist Folgendes: In Schritt 1 leiten Sie einen Remote-Port vom Büro-PC an den Server weiter ( 12345wird als Beispiel verwendet, sollte jeder Port> 1024 tun). Wenn Sie jetzt eine Verbindung zu 12345 auf dem Server herstellen, sollten Sie eine Verbindung zu Port 22 auf dem OfficePC herstellen.

In Schritt 2 leiten Sie den Port 23456 von Ihrem Heimcomputer an 12345 auf dem Server weiter (von wo aus er an officepc: 22 weitergeleitet wird, wie in Schritt 1 eingerichtet).

In Schritt 3 stellen Sie mit Ihrem Office-PC-Login eine Verbindung zum lokalen Port 23456 her . Dies wird in Schritt 2 an den Port 12345 auf Ihrem Server und in Schritt 1 an Ihren Büro-PC weitergeleitet.

Beachten Sie, dass ich autossh für die Weiterleitungen verwende, da es sich um einen SSH-Wrapper handelt, der den Tunnel automatisch wieder verbindet, wenn er getrennt wird. aber normales ssh würde genauso gut funktionieren, solange die verbindung nicht unterbrochen wird.

Es gibt eine mögliche Sicherheitsanfälligkeit: Jeder, der eine Verbindung zu localhost: 12345 auf dem Server-PC herstellen kann, kann jetzt eine Verbindung zu officepc: 22 herstellen und versuchen, sich darin zu hacken. (Beachten Sie, dass Sie einen SSH-Server auf jeden Fall oberhalb der standardmäßig aktivierten grundlegenden Schutzfunktionen sichern sollten. Ich empfehle, mindestens die Root-Anmeldung und die Kennwortauthentifizierung zu deaktivieren - siehe z. B. diese )

Bearbeiten : Ich habe dies mit der gleichen Konfiguration überprüft, und es funktioniert. GatewayPorts noBetroffen sind nur die Häfen, die weltweit geöffnet sind, nicht die lokalen Tunnel. Dies sind die weitergeleiteten Ports:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

In Bezug auf den Netzwerkstack handelt es sich also ausschließlich um lokalen Datenverkehr auf den jeweiligen Loopback-Schnittstellen (plus SSH- Verbindungen zum Server-PC). wird daher überhaupt GatewayPortsnicht geprüft.

Es gibt jedoch die Anweisung AllowTcpForwarding: Wenn nodies der Fall ist , schlägt dieses Setup fehl, da überhaupt keine Weiterleitung zulässig ist, auch nicht über die Loopback-Schnittstelle.

Vorsichtsmaßnahmen :

  • bei Verwendung von autossh und den letzten ssh, können Sie ssh verwenden ServerAliveIntervalund ServerAliveCountMaxfür den Tunnel nach oben zu halten. Autossh hat eine eingebaute Prüfung, aber anscheinend hat es einige Probleme mit Fedora. -M0Deaktiviert dies und -oServerAliveInterval=20 -oServerAliveCountMax=3prüft, ob die Verbindung hergestellt wurde. Versuche alle 20 Sek., wenn der Verbindungsaufbau dreimal hintereinander fehlschlägt, stoppt ssh (und autossh erstellt eine neue):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • Es kann nützlich sein, den SSH-Tunnel neu zu starten, wenn die Weiterleitung fehlschlägt. Verwenden Sie dazu -oExitOnForwardFailure=yes- Wenn der Port bereits gebunden ist, erhalten Sie möglicherweise eine funktionierende SSH-Verbindung, aber keinen weitergeleiteten Tunnel.

  • Verwenden ~/.ssh/configfür die Optionen (und Ports) ist ratsam, sonst werden die Befehlszeilen zu ausführlich. Zum Beispiel:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

Dann können Sie nur den Server-Alias ​​verwenden:

    autossh -M0 fwdserverpc
Piskvor
quelle
Ich glaube, diese Methode, die Sie annehmen, heißt "reverse ssh-tunnel". Leider erfordert dies, dass GatewayPorts auf dem Server in / etc / ssh / sshd_config auf "yes" gesetzt ist. Dieser Server hat keine Gateway-Ports aktiviert und ich habe dort keinen Root-Zugriff.
3
@Frank: Eigentlich glaube ich nicht: Schränkt den Zugriff GatewayPorts noauf die geöffneten Ports auf die Loopback-Schnittstelle ein; Beachten Sie, dass Sie in Schritt 2 über die Loopback-Schnittstelle weiterleiten (in der Tat sind beide Weiterleitungen "nur localhost"), sodass dies möglicherweise funktioniert ( AllowTcpForwarding noin der sshd-Konfiguration würde dies zu einem Defekt führen).
Piskvor
3
@Frank: Ja, bestätigt. Das funktioniert sogar mit GatewayPorts no; hat die Antwort bearbeitet. Beachten Sie, dass es andere Anweisungen (wie PermitOpenund AllowTcpForwarding) gibt, die dieses Setup beschädigen
Piskvor
1
Hervorragende Antwort! Es funktioniert, du hast mein Wochenende gerettet! Danke vielmals!!
1
Meine autossh-Version (Fedora Core) konnte ohne -M nicht vom Terminal ausgeführt werden. Ich habe auch eine Verbindung zu einer anderen Person hergestellt, die das erlebt hat. Sie haben Recht, dass es im Handbuch als optionales Argument markiert ist. Gut, wenn es für viele Menschen funktioniert, schade, dass nicht für alle.
Jaroslaw Nikitenko
4

Wenn Sie von zu Hause aus und vom internen Server zum Linux-Computer im Büro sshen können, können Sie von zu Hause aus das ssh verwenden ProxyCommand, um über nc(netcat) unbemerkt über den Server zum internen Computer zu springen.

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh [email protected] exec nc internal.pc.example.com %p

Dann werden Sie nur ssh user@internalpcund Sie werden stillschweigend durch den Server weitergeleitet, ohne dass Ports oder Tunnel an beiden Enden geöffnet werden müssen.

Michael
quelle
1
Danke für deine Antwort. Leider können weder der Home-PC noch der Server den Zugriff auf den Office-PC initiieren. Sowohl der Office-PC als auch der Home-PC können jedoch Verbindungen zum Server herstellen.
4

Installieren Sie Robo-TiTO auf dem Computer, auf den Sie remote zugreifen möchten.

  • Auf diese Weise können Sie von überall aus über Google Talk-Client-Apps auf SSH zugreifen.
  • Es ist keine öffentliche IP-Adresse oder spezielle Einstellung erforderlich.
  • Es ist kostenlos und Open Source und zahlt keine Anwendungsdienste mehr.
  • Der SSH-Port muss nicht geöffnet werden (schützen Sie Ihren Computer).
  • Keine Notwendigkeit zum Öffnen von Tunneln (z. B. VPN oder ähnliches)

Die folgenden Installationsanweisungen sind veraltet, da die Site verschoben wurde. Die neue URL lautet https://github.com/formigarafa/robotito

Ich habe ein Skript erstellt (getestet auf meinem Raspbian-Betriebssystem in Raspberry Pi), damit Sie Robo-TiTO einfach auf Raspberry Pi, Debian oder Ubuntu Box (Debian-Paketdistribution) installieren können. Dies sind die Schritte, um Ihre Linux-Box entfernbar zu machen:

  1. Öffnen Sie Shell Command oder rufen Sie es Terminal auf, gehen Sie zu Ihrem Home-Ordner und laden Sie das Installationsskript per Befehl herunter:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. Danach führen Sie das Skript durch Eingabe des Befehls aus:

    $ sudo ./robotito
    
  3. und dann können Sie die Datei credentials.rbaus dem Konfigurationsordner von Robo-TiTO mit Ihrem GTalk-Konto bearbeiten und durch Drücken von Ctrl+ Xund speichern Y. Standardmäßig wird der Nano-Editor verwendet.

  4. Ausführen des Robo-TiTO über den Robo-TiTO-Ordner per Befehl

    $ cd robotito
    $ ./jabbershd start
    
  5. Jetzt können Sie SSH von jedem Google Talk-Client aus verwenden. Vergessen Sie nicht, das Robo-TiTO GTalk-Konto zu Ihrem Google Talk-Konto hinzuzufügen und es zu testen, indem Sie sich gegenseitig chatten, bevor Sie das Konto verwenden.

Rolly Maulana Awangga
quelle
5
Ich habe ein ernsthaftes Problem mit "Keine Notwendigkeit, den SSH-Port zu öffnen ( speichern Sie Ihren Computer )" - der von Ihnen vorgeschlagene Shell-Over-Jabber-Bot ist mit, quote CLIENT_PASSPHRASE = "logmein", im Klartext gesichert . Das ist buchstäblich null Sicherheit - Sie machen ein Loch in Lkw-Größe, in das jeder eintreten kann. Im Gegensatz zur SSH-Authentifizierung mit öffentlichem Schlüssel: Ich authentifiziere über einen sicheren Kanal mit Anmeldeinformationen, die nicht einmal die Leitung kreuzen. Wer schützt jetzt ihren Computer?
Piskvor
@Piskvor, robotito führt nur Befehle von Kontakten aus, die auf der Whitelist stehen. github.com/formigarafa/robotito/blob/master/config/…
formigarafa
Ich habe nie Probleme mit der Whitelist-basierten Authentifizierung. Wenn ich mich nicht irre, wird die Nachrichtenübertragung bei Verwendung mit GTalk verschlüsselt. Auf die eine oder andere Weise habe ich es kürzlich geändert und jetzt wird ein Einmalkennwort aus einem Tool wie Google Authenticator oder ähnlichem verwendet, um den Zugriff zu ermöglichen.
Formigarafa
1
@formigarafa: (1) Wenn Sie an der Entwicklung dieses Produkts beteiligt sind oder waren, müssen Sie dies ausdrücklich sagen. Es reicht nicht aus, denselben Namen zu verwenden. die meisten Leute werden das nicht bemerken. (Sie können es in Ihrem Profil erwähnen .) (2) Wenn Sie einen Beitrag bearbeiten, sollten Sie ihn so gut wie möglich korrigieren. Versuchen Sie beispielsweise, Tippfehler wie "I'ts" zu fangen. Und wenn ein Link ausgefallen ist, kennzeichnen Sie ihn nicht einfach als toten Link. Gib die neue URL in den Beitrag ein . Die Leute sollten nicht die Kommentare durchforsten müssen, um die richtigen Informationen zu finden.
G-Man
@ G-Man, die ursprüngliche Antwort und Bearbeitung waren nicht meine. Und ich hatte nie die Absicht, es so aussehen zu lassen wie ich. Ich habe einen toten Link in der Antwort bemerkt, den Link habe ich auch nicht erstellt. Ich war wirklich gespannt auf den Inhalt und habe versucht, ihm zu folgen. Leider konnte ich die Ressource nicht finden. Ich habe als toten Link markiert, in der Hoffnung, dass derjenige, der die Antwort geschrieben hat, von der Änderung benachrichtigt wird und versucht, sie zu beheben.
Formigarafa
3

Die Lösung von Piskvor funktioniert und ist nett. Es lässt jedoch die Terminals offen, während die Login-Shells hängen. Nicht sehr cool.

Ich habe dieses kleine Skript, das ich geschrieben habe, immer verwendet, um eine Verbindung zu einem Server herzustellen und die Verbindung aufrechtzuerhalten, indem ich es in cron ausführe:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

Ich wette, wir könnten Piskvors Lösung mit dem eleganteren Autossh neben vielleicht einem abgetrennten Bildschirm reparieren oder die -NT-ssh-Argumente verwenden, um die Verbindung einfach im Hintergrund aufrechtzuerhalten.

odinho - Velmont
quelle
Vielen Dank für die Komplimente :) Für meine Use Cases benötige ich regelmäßig den Shell-Zugriff sowie die Weiterleitungen; Außerdem habe ich versucht, den Minimalfall hier zu zeigen (es ist möglich, das Obige in zwei Befehle mit transparentem SSH-Host-Hopping zu vereinfachen, aber das würde eine zusätzliche Konfiguration auf dem homepcComputer erfordern ).
Piskvor
2

Für mich klingt es so, als ob Sie anstelle eines SSH-Tunnels ein VPN ausprobieren sollten: die Art, bei der ein externer Server als Proxy verwendet wird, z. B. Hamachi . Es gibt andere kostenlose Software wie diese, aber Hamachi ist mein Favorit.

Djangofan
quelle
1
Nachdem dem 5.0.0.0/8Netzwerk öffentliche IPv4-Adressen zugewiesen wurden, ist Hamachi in Schwierigkeiten (wenn Hamachi ausgeführt wird, können Sie nicht auf einen zufälligen Teil des Internets zugreifen). Außerdem kann Hamachi nicht mehr kostenlos verwendet werden.
Piskvor