ssh -L leitet mehrere Ports weiter

126

Ich leite derzeit eine Reihe von:

sudo ssh -L PORT:IP:PORT root@IP

Dabei ist IP das Ziel eines gesicherten Computers und PORT die Ports, die ich weiterleiten möchte.

Dies liegt daran, dass ich viele Anwendungen verwende, auf die ich ohne diese Weiterleitung nicht zugreifen kann. Nachdem ich dies durchgeführt habe, kann ich durch zugreifen localhost:PORT.

Das Hauptproblem trat jetzt auf, da ich tatsächlich 4 dieser Ports habe, die ich weiterleiten muss.

Meine Lösung besteht darin, 4 Shells zu öffnen und meinen Verlauf ständig rückwärts zu durchsuchen, um genau zu suchen, welche Ports weitergeleitet werden müssen usw., und dann diesen Befehl auszuführen - einen in jeder Shell (Passwörter usw. eingeben müssen).

Wenn ich nur so etwas tun könnte:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

dann würde das schon richtig helfen.

Gibt es eine Möglichkeit, dies zu vereinfachen?

PascalVKooten
quelle

Antworten:

193

Die -LOption kann innerhalb eines Befehls mehrmals angegeben werden. Jedes Mal mit verschiedenen Ports.

NaN
quelle
19
Zuerst habe ich diese Antwort nicht verstanden. Veröffentlichen Sie hier ein Beispiel, falls jemand das gleiche leidet. Der Autor meinte "ssh -L Port0: IP: Port0 -L Port1: IP: Port1 ..."
Mong H. Ng
96

Genau das, was NaN beantwortet hat, geben Sie mehrere -L-Argumente an. Ich mache das die ganze Zeit. Hier ist ein Beispiel für die Weiterleitung mehrerer Ports:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

Hinweis : Dies ist dasselbe, als -L localhost:8822:REMOTE_IP_1:22ob Sie nichts angeben localhost.

Jetzt können Sie damit (von einem anderen Terminal aus) Folgendes tun:

ssh localhost -p 8822

um eine Verbindung zum REMOTE_IP_1Port herzustellen22

und ähnlich

ssh localhost -p 9922

um eine Verbindung zum REMOTE_IP_2Port herzustellen22

Natürlich hindert Sie nichts daran, dies in ein Skript zu packen oder zu automatisieren, wenn Sie viele verschiedene Hosts / Ports zum Weiterleiten und an bestimmte spezifische haben.

Hoffe das hilft.

jbchichoko
quelle
Tolle Ergänzung zu Nans Antwort. Vielen Dank.
AFP_555
1
Beachten Sie Folgendes: "Hinweis: Dies entspricht -L localhost: 8822: REMOTE_IP_1: 22, wenn Sie localhost nicht angeben." Dies gilt nur, wenn die GatewayPorts-Einstellung "Nein" ist, was zugegebenermaßen die Standardeinstellung ist. Wenn dies nicht der Fall ist, sollten Sie die Einstellung überprüfen oder, noch besser, explizit sein und "-L localhost: 8822 ..." verwenden.
David
Ich stimme @David By default, anyone (even on different machines) can connect to the specified port on the SSH client machine. However, this can be restricted to programs on the same host by supplying a bind address: ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com ssh.com/ssh/tunneling/example
Karl Pokus
24

Sie können die folgende Bash-Funktion verwenden (fügen Sie sie einfach zu Ihrer hinzu ~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

Anwendungsbeispiel:

pfwd hostname {6000..6009}
Yuval Atzmon
quelle
2
Verwenden Sie -f, um im Hintergrund zu laufen
Karl Pokus
Ehmmm ... warum willst du das so machen?
Anton Bessonov
12

Personen, die mehrere Ports über denselben Host weiterleiten, können so etwas in ihrer ~ / .ssh / config einrichten

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

und es wird einfach ssh all-port-forwardsweg.

RajaRaviVarma
quelle
Ich mag diesen Ansatz.
BMW
7

jbchichoko und yuval haben tragfähige Lösungen gegeben. Aber jbchichokos Antwort ist keine flexible Antwort als Funktion, und die geöffneten Tunnel von Yuvals Antwort können nicht geschlossen werden, ctrl+cda sie im Hintergrund ausgeführt werden. Ich gebe meine Lösung unten, um beide Fehler zu beheben:

Definieren einer Funktion in ~/.bashrcoder~/.zshrc :

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

Ein Beispiel für die Ausführung der Funktion:

fsshmap 6000 6010 hostname

Ergebnis dieses Beispiels:

Sie können auf 127.0.0.1:16000~16009dasselbe zugreifen wiehostname:6000~6009

Tom
quelle
2

In meinem Unternehmen benötigen sowohl ich als auch meine Teammitglieder Zugriff auf 3 Ports eines nicht erreichbaren "Ziel" -Servers. Daher habe ich einen permanenten Tunnel ( dh einen Tunnel, der unbegrenzt im Hintergrund ausgeführt werden kann, siehe Parameter -fund -N) von einem erreichbaren Server zu erstellt das Ziel. In der Befehlszeile des erreichbaren Servers habe ich ausgeführt:

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

Ich habe Benutzer verwendet, rootaber Ihr eigener Benutzer wird funktionieren. Sie müssen das Passwort des ausgewählten Benutzers eingeben (auch wenn Sie bereits mit diesem Benutzer mit dem erreichbaren Server verbunden sind).

Jetzt entspricht Port 8822 des erreichbaren Computers Port 22 des Zielcomputers (für ssh / PuTTY / WinSCP), und die Ports 9006 und 9100 auf dem erreichbaren Computer entsprechen denselben Ports des Zielcomputers (in meinem Fall hosten sie zwei Webdienste ).

Pino
quelle
1

Einer der Vorteile der Anmeldung bei einem Server mit Portweiterleitung besteht in der Erleichterung der Verwendung von Jupyter Notebook. Dieser Link bietet eine hervorragende Beschreibung der Vorgehensweise. Hier möchte ich eine Zusammenfassung und Erweiterung machen, auf die sich alle beziehen können.

Situation 1. Melden Sie sich von einem lokalen Computer mit dem Namen Host-A (z. B. Ihrem eigenen Laptop) bei einem Remote-Arbeitscomputer mit dem Namen Host-B an.

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

Dann können Sie einen Browser öffnen und Folgendes eingeben: http: // localhost: port_A / , um Ihre Arbeit auf Host-B auszuführen , aber in Host-A sehen.

Situation 2. Melden Sie sich von einem lokalen Computer mit dem Namen Host-A (z. B. Ihrem eigenen Laptop) bei einem Remote-Anmeldecomputer mit dem Namen Host-B und von dort aus mit dem Remote-Arbeitscomputer mit dem Namen Host-C an. Dies ist normalerweise bei den meisten Analyseservern an Universitäten der Fall und kann durch die Verwendung von zwei ssh -Lverbundenen Servern erreicht werden -t.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

Dann können Sie einen Browser öffnen und Folgendes eingeben: http: // localhost: port_A / , um Ihre Arbeit auf Host-C auszuführen , aber in Host-A sehen.

Situation 3. Melden Sie sich von einem lokalen Computer mit dem Namen Host-A (z. B. Ihrem eigenen Laptop) bei einem Remote-Anmeldecomputer mit dem Namen Host-B an und von dort aus mit dem Remote-Arbeitscomputer mit dem Namen Host-C und schließlich mit dem Remote-Arbeitscomputer Host-. D. D. Dies ist normalerweise nicht der Fall, kann aber irgendwann passieren. Es ist eine Erweiterung von Situation 2 und dieselbe Logik kann auf mehrere Maschinen angewendet werden.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

Dann können Sie einen Browser öffnen und Folgendes eingeben: http: // localhost: port_A / , um Ihre Arbeit auf Host-D auszuführen , aber in Host-A sehen.

Beachten Sie, dass port_A, port_B, port_C, port_D Zufallszahlen sein können, mit Ausnahme der hier aufgeführten allgemeinen Portnummern . In Situation 1 können port_A und port_B identisch sein, um die Prozedur zu vereinfachen.

Fei Yao
quelle
Zur Erinnerung, der gleiche Port auf verschiedenen Servern sind verschiedene Ports. Daher könnte es immer einfacher werden, eine identische Portnummer anzugeben!
Fei Yao
0

Ich habe loco für Hilfe bei der SSH-Weiterleitung entwickelt. Es kann verwendet werden, um die Ports 5000 und 7000 lokal auf denselben Ports gemeinsam zu nutzen:

pip install loco

loco listen SSHINFO -r 5000 -r 7000
PascalVKooten
quelle
0

Wenn Sie eine einfache Lösung suchen, die im Hintergrund ausgeführt wird und leicht zu beenden ist, verwenden Sie eine Steuerbuchse

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST
Karl Pokus
quelle
0

Hier ist eine Lösung, die von der von Yuval Atzmon inspiriert ist.

Es hat einige Vorteile gegenüber der ursprünglichen Lösung:

  • Zuerst wird ein einzelner Hintergrundprozess erstellt und nicht einer pro Port
  • Es generiert den Alias, mit dem Sie Ihre Tunnel töten können
  • es bindet nur an 127.0.0.1, was etwas sicherer ist

Sie können es verwenden als:

  • tnl your.remote.com 1234
  • tnl your.remote.com {1234,1235}
  • tnl your.remote.com {1234..1236}

Und schließlich töte sie alle mit tnlkill.

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}
Wilfried Kopp
quelle
-1

Sie können diese zsh-Funktion verwenden (funktioniert wahrscheinlich auch mit bash) (Put it in ~/.zshrc):

ashL () {
    local a=() i
    for i in "$@[2,-1]"
    do
        a+=(-L "${i}:localhost:${i}")
    done
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}

Beispiele:

ashL [email protected] 6480 7690 7477

ashL [email protected] {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

Glückliches Gesicht
quelle