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?

Antworten:


193

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


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.


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}

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.


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


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 ).


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.


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

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

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"
}

-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 db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

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.