Wie leite ich einen Port von einem Computer zu einem anderen weiter?

19

Betrachten Sie die folgende Situation:

Zu Hause habe ich einen Router (der mit dem Internet verbunden ist), einen Server (S) und mein Hauptgerät (M). S ist über das Internet erreichbar (es hat eine statische IP-Adresse) und ist rund um die Uhr erreichbar, während M dies nicht ist.

Manchmal möchte ich eine App (die an einem Port auf M lauscht, z. B. 8888) über das äußere Internet zugänglich machen.

Dafür wollte ich einen Port auf S (2222) einrichten, um zu Ms Port 8888 weiterzuleiten, damit jeder, der auf S: 2222 zugreift, das Gefühl hat, auf M: 8888 zuzugreifen.

Ich habe versucht, die SSH-Portweiterleitung zu verwenden. Mein bester Versuch war:

ssh -L 2222:M:8888 -N M

Damit kann ich jedoch nur vom Server selbst auf den 2222-Port zugreifen, nicht von anderen Computern.

Gibt es eine Möglichkeit, es richtig zu machen? Am liebsten wäre es ein einfacher Befehl, den ich mit ^ C starten und beenden könnte, wenn ich diese Weiterleitung nicht mehr benötige.

Rogach
quelle
Versuchen Sie localhost.run, eine Website, die Sie unter localhost.run finden können. Ich glaube, es gibt eine Möglichkeit, Ihr Produkt dort herauszubringen.
Angelena Neilsomt,

Antworten:

16

Ja, dies wird GatewayPortsin SSH aufgerufen . Ein Auszug aus ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

Und Sie können localhostanstelle von Min der Weiterleitung verwenden, wie Sie auf den gleichen Computer weiterleiten, zu dem Sie SSH-ing ausführen - wenn ich Ihre Frage richtig verstehe.

Der Befehl lautet also:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

und wird so aussehen in netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Jetzt spricht jeder, der über Port 2222 TCP auf diesen Computer zugreift, tatsächlich mit localhost: 8888, wie in Computer M zu sehen.

gertvdijk
quelle
1
Vielen Dank! Das funktioniert! Aber es gibt einige Seltsamkeiten - aus irgendeinem Grund enthält die Ausgabe die Zeile "bind: Address already in use". Was könnte das heißen?
Rogach
1
Auf diesem Port läuft bereits ein Prozess. Verwenden Sie den gleichen netstatBefehl, um herauszufinden, was genau ist. Wahrscheinlich läuft noch eine ähnliche SSH im Hintergrund und tötet sie mit Hilfe der PID netstat.
gertvdijk
Es macht Spaß, dass ich das schon getan habe - keine Prozesse an diesen Ports, sowohl an S als auch an M. Wenn es welche gegeben hätte, dann wäre die gesamte Konstruktion wahrscheinlich gescheitert.
Rogach
10

Es geht auch anders. Sie können die Portweiterleitung von S: 2222 nach W: 8888 mit iptables einrichten. Einzelbefehl:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

wobei 1.2.3.4 die IP-Adresse von M ist. Es heißt NAT (Network Address Translation).

Gevial
quelle
1
Da Sie hier nur Ziel-NAT ausführen (im Gegensatz zu Quell-NAT), funktioniert dies nur in bestimmten Situationen zuverlässig und erfordert möglicherweise das Ändern von Routingtabellen. Für die Weiterleitung an virtuelle Maschinen (M), die auf dem Host (S) ausgeführt werden, kann dies jedoch gut funktionieren.
Gertvdijk
Dieser Befehl sollte auf dem Gateway ausgegeben werden. Ich gehe davon aus, dass sich S und M im selben LAN befinden. Quell-NAT würde in modernen Linux-Kerneln automatisch vom Connection Tracker durchgeführt. Ich habe eine solche Konfiguration in meinem Büronetzwerk und sie funktioniert einwandfrei. Es ist jedoch möglich, den Befehl genauer zu definieren (z. B. iptables -i eth0 mit eth0 als äußerer Schnittstelle).
Gevial
Wenn sich S und M im selben LAN befinden, ist dort keine Portweiterleitung erforderlich, da kein Datenverkehr zwischen ihnen über das Gateway geleitet wird.
Gertvdijk
1
Ja, aber die Verbindung zu M: 8888 wird vermutlich über das Internet hergestellt. Jemand aus dem Internet -> S: 2222 -> M und S LAN Router mit Iptables -> M: 8888
Gevial