Jak udostępnić tunel ssh publicznie?


174

Wracając do tego pytania, uruchamiam polecenie

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

na komputerze Mac. Jednak tunelowany port nie działa publicznie. Wykonuję takie polecenie, aby umożliwić otwarcie lokalnego portu na komputerze zdalnym. Działa to podczas otwierania portu na hoście lokalnym na komputerze zdalnym, ale kiedy próbuję uzyskać dostęp do publicznego adresu IP komputera zdalnego z mojego komputera lokalnego, port nie wydaje się być otwarty. Jak upublicznić tunel w sieci IP, aby każdy mógł uzyskać do niego dostęp?

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

EDYCJA 2: Klientem jest Mac OS X 10.6, a serwerem Linux Mint, ale oba są OpenSSH.


Co oznacza publiczne IP? Jeśli próbujesz połączyć się z komputerem lokalnym za pośrednictwem routera i Internetu, większość routerów nie zezwala na takie sprzężenie zwrotne.
harrymc 30.04.13

Odpowiedzi:


350

Jeśli sprawdzisz stronę podręcznika dla ssh, przekonasz się, że składnia -Rodczytuje:

R [ bind_address :] Port : gospodarza : hostPort

Kiedy bind_addresszostanie pominięty (jak w twoim przykładzie), port jest związany tylko z interfejsem pętli zwrotnej. Aby powiązać wszystkie interfejsy, 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ę indywidualnie ze wszystkimi interfejsami. Druga wersja tworzy ogólne powiązanie tylko IPv4, co oznacza, że ​​port jest dostępny na wszystkich interfejsach przez IPv4. Trzecia wersja jest prawdopodobnie technicznie równoważna z pierwszą, ale ponownie tworzy tylko pojedyncze powiązanie ::, co oznacza, że ​​port jest dostępny natywnie przez IPv6 i przez IPv4 poprzez adresy IPv6 odwzorowane na IPv4 (nie działa w systemie Windows, OpenBSD) . (Potrzebujesz cudzysłowów, bo [::]inaczej można by je interpretować jako glob).

Pamiętaj, że jeśli używasz sshdserwera OpenSSH , GatewayPortsopcja serwera musi być włączona (ustawiona na yeslub clientspecified), aby to działało (sprawdź plik /etc/ssh/sshd_configna serwerze). W przeciwnym razie (wartość domyślna dla tej opcji to no) serwer zawsze wymusi powiązanie portu tylko w interfejsie pętli zwrotnej.


12
O mój Boże, zadziałało !!!!! Zrobiłem dokładnie 1 milion razy !! Właśnie zapomniałem, że *w bash da pliki i potrzebowałem\*
Trevor Rudolph

4
Tak, właśnie dlatego zawsze wolę 0.0.0.0- to tylko IPv4, ale przez większość czasu to zrobi :)
Stefan Seidel

34
GatewayPorts tak rozwiązał mój problem.
Sunry

4
GatewayPorts = tak (na zdalnej konfiguracji sshd) naprawiłem to również dla mnie
Phil_1984_

3
„GatewayPorts tak” sprawiło, że mój dzień, dzięki @StefanSeidel
karser

37

Edytować:

-g działa dla lokalnych portów przekierowanych, ale to, czego potrzebujesz, jest portem przekierowanym / zdalnym, który jest inny.

Co chcesz jest to .

Zasadniczo na example.comustawić GatewayPorts=clientspecifiedw /etc/ssh/sshd_config.

--- poprzednia (niepoprawna) odpowiedź ---

Użyj opcji -g. Ze strony podręcznika ssh:

-g     Allows remote hosts to connect to local forwarded ports.

wydaje się nie działać ... uruchamia się, ale nie mogę połączyć się zdalnie
Trevor Rudolph

2
Spróbuj uruchomić netstat -elnptz osobnego terminalu, aby dowiedzieć się, które porty są powiązane z danym adresem. Bez -gniego port powinien być związany 127.0.0.1:PORT. Za pomocą -gnależy go powiązać 0.0.0.0:PORT, co czyni go dostępnym zdalnie.
snapshoe


2
GatewayPorts=clientspecifiedlubGatewayPorts clientspecified
Trevor Rudolph

i czy mogę to dodać do klienta lub pilota?
Trevor Rudolph

14

Oto moja odpowiedź na zakończenie:

Skończyło się ssh -R ...na tym, że użyłem do tunelowania i dodatkowo socatdo przekierowania ruchu sieciowego do 127.0.0.1:

tunel powiązany z 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 wykonanie tunelu tylko lokalnego, ale uważam to za znacznie wolniejsze

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


Podoba mi się fakt, że nie mam do czynienia z konfiguracją sshd i że mogę to wszystko zrobić bez sudo. Plus dowiaduję się, że socat istnieje. Dzięki!
BrutusCat

+ w górę idź dobry panie. Próbowałem powiedzieć ssh, aby powiązał się z 0.0.0.0 bez powodzenia .. potem zobaczyłem składnię *, spróbowałem tego, żadnych kości. Wyobrażam sobie, że może to być jakaś funkcja bezpieczeństwa w konfiguracji sshd lub coś, co na to nie pozwala. W końcu zobaczyłem ten post i socatdziałało niesamowicie. Super przydatne, wkładając to do tylnej kieszeni;]
Jaime

10

Możesz także użyć podwójnego przekazywania, jeśli nie zmienisz / etc / ssh / sshd_config.

Najpierw przekieruj do portu tymczasowego (np. 10080) na urządzeniu sprzężenia zwrotnego na zdalnym komputerze, a następnie użyj lokalnego przekierowania tam, 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"

1
To faktycznie działa w celu ominięcia reguł przekazywania!
Michael Schubert,

Uwielbiam to rozwiązanie. Świetne obejście, gdy nie chcesz zmieniać konfiguracji na komputerze
Grezzo,

8

Użyj opcji „Porty bramy”.

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

Aby tego użyć, prawdopodobnie musisz dodać „ GatewayPorts yes” do serwera /etc/ssh/sshd_config.


Właściwie to zadziałało. To, co robię, polega na tym, że używam instancji EC2 jako usługi przesyłania dalej do mojego serwera REST. W ten sposób nie muszę trzymać mojego serwera w strefie DMZ i nie potrzebuję publicznego adresu IP. Zabawne, że z pierwszą instancją EC2, którą utworzyłem, ssh -R remote_port: localhost: port xxx @ ec2xxx działał dobrze, ale z jakiegoś powodu musiałem później utworzyć inną instancję i od tego momentu zawsze otrzymywałem: połączenie odmówił. Użyłem tcpdump, aby zobaczyć, co otrzymałem i nie było wiele informacji. -g plus GatewayPorts tak, załatwił sprawę.
ET

1

Hosty Jump są dość nowym dodatkiem do OpenSSH. Wymaga to dostępu SSH do półproduktu, ale powinno działać bez dodatkowej konfiguracji.

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

To polecenie instruuje SSH, aby najpierw połączyć się root@example.com, a następnie z tego komputera, aby zainicjować połączenie z portem 8080 na localhost(tj. Port, który jest tunelowany z hosta skoku do hosta zdalnego) pod remoteusernazwą użytkownika.


0

Jeśli chcesz wprowadzić konfigurację ~/.ssh/configzamiast używać parametrów wiersza poleceń, możesz spróbować czegoś takiego

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Pamiętaj, aby mieć zaporę zdalnego hosta zezwalającą na połączenia z 8080 i upewnić się, że GatewayPortsopcja /etc/ssh/sshdkonfiguracji nie jest ustawiona nano

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.