2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

Jak uczynić tunel ssh otwartym dla publiczności?

Cóż, wracając do tego pytania, uruchamiam polecenie

ssh -R 8080:localhost:80 -N root@example.com

na Macu. Jednak port, który jest tunelowany nie działa publicznie. Uruchamiam taką komendę, aby można było otworzyć lokalny port na zdalnym komputerze. I to działa podczas otwierania portu na localhost na zdalnym komputerze, ale kiedy próbuję uzyskać dostęp do publicznego adresu IP zdalnego komputera z mojego lokalnego komputera, port nie wydaje się być otwarty. Jak mógłbym sprawić, by tunel był publiczny na IP, aby każdy miał do niego dostęp?

EDIT: Wygląda na to, że strona zdalna wiąże się tylko z localhost zamiast ze wszystkimi interfejsami.

EDIT 2: Klient to Mac OS X 10.6, a serwer to Linux Mint, ale oba są OpenSSH.

Odpowiedzi (7)

368
368
368
2013-05-06 06:11:42 +0000

Jeśli sprawdzisz stronę man dla ssh, zobaczysz, że składnia dla -R brzmi:

-R [_bind\_address_:]_port_:_host_:_hostport_

Gdy `bindaddress`_ jest pominięte (jak w twoim przykładzie), port jest związany tylko na interfejsie loopback. Aby powiązać go ze wszystkimi interfejsami, użyj

ssh -R \*:8080:localhost:80 -N root@example.com

lub

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

lub

ssh -R "[::]:8080:localhost:80" -N root@example.com

Pierwsza wersja wiąże się z wszystkimi interfejsami indywidualnie. Druga wersja tworzy ogólny bind IPv4-only, co oznacza, że port jest dostępny na wszystkich interfejsach poprzez IPv4. Trzecia wersja jest prawdopodobnie technicznie równoważna pierwszej, ale ponownie tworzy tylko pojedynczy bind do ::, co oznacza, że port jest dostępny przez IPv6 natywnie i przez IPv4 poprzez adresy IPv4-mapowane IPv6 (nie działa na Windows, OpenBSD).   (Potrzebujesz cudzysłowu, ponieważ [::] mogłoby być interpretowane jako glob.)

Zauważ, że jeśli używasz serwera OpenSSH sshd, opcja GatewayPorts serwera musi być włączona (ustawiona na yes lub clientspecified), aby to działało (sprawdź plik /etc/ssh/sshd_config na serwerze). W przeciwnym razie (domyślna wartość dla tej opcji to no), serwer zawsze wymusi powiązanie portu tylko z interfejsem loopback.

40
40
40
2013-04-28 03:34:48 +0000

Edycja:

-g działa dla lokalnych portów przekierowanych, ale to, czego chcesz, to odwrotny / zdalny port przekierowany, który jest inny.

To, czego chcesz, to to .

Zasadniczo, na example.com, ustaw GatewayPorts=clientspecified w /etc/ssh/sshd_config.

— poprzednia (błędna) odpowiedź —

Użyj opcji -g. Ze strony man ssh:

-g Allows remote hosts to connect to local forwarded ports.
```.
15
15
15
2013-10-29 12:09:40 +0000

Oto moja odpowiedź do uzupełnienia:

Skończyło się na użyciu ssh -R ... do tunelowania i użyciu socat na wierzchu, aby przekierować ruch sieciowy do 127.0.0.1:

tunnel binded to 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Inną opcją jest zrobienie na wierzchu tunelu tylko lokalnego, ale uważam to za dużo wolniejsze

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

10
10
10
2016-08-01 22:37:07 +0000

Możesz również użyć podwójnego forwarda, jeśli nie chcesz lub nie możesz zmienić /etc/ssh/sshd_config.

Najpierw przekieruj na tymczasowy port (np. 10080) na urządzeniu loopback na zdalnym komputerze, a następnie użyj lokalnego forwarda, aby przekierować port 10080 na 80 na wszystkich interfejsach:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
8
8
8
2013-04-28 13:58:50 +0000

Użyj opcji “gateway ports”.

ssh -g -R REMOTE_PORT:HOST:PORT ...

Aby tego użyć, prawdopodobnie będziesz musiał dodać “GatewayPorts yes” do /etc/ssh/sshd_config twojego serwera.

2
2
2
2019-06-03 20:09:02 +0000

Jump hosts ](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#Jump_Hosts_–_Passing_Through_a_Gateway_or_Two) są dość nowym dodatkiem do OpenSSH. Wymaga to dostępu SSH do pośrednika, ale powinno działać bez dodatkowej konfiguracji.

ssh -J root@example.com remoteuser@localhost -p 8080

To polecenie nakazuje SSH najpierw połączyć się z root@example.com, a następnie, z tej maszyny, zainicjować połączenie na port 8080 w localhost (tj. port, który jest tunelowany z hosta przeskakującego do zdalnego hosta) pod nazwą użytkownika remoteuser.

0
0
0
2018-08-26 15:50:49 +0000

Jeśli chciałbyś umieścić konfigurację w swoim ~/.ssh/config zamiast używać parametrów linii poleceń, możesz spróbować czegoś takiego jak

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80 Pamiętaj, aby firewall twojego zdalnego hosta zezwalał na połączenia z 8080 i upewnij się, że opcja GatewayPorts w twoim /etc/ssh/sshd configu nie jest ustawiona na no.