Odwrotne tunelowanie portów

59

Muszę jutro pokazać komuś stronę działającą na moim komputerze lokalnym. Zwykle osiągam to poprzez przekierowanie portów na moim lokalnym routerze, ale dzięki awarii sprzętu i jego wymianie jest okropne, mój obecny router nie pozwala mi na przekierowanie portów.

Utknąłem z tym opóźnieniem i nie chciałem pchać całej sprawy na właściwy serwer, miałem szalony pomysł: czy mogę po prostu przekierować swój port na zewnętrzny serwer przez SSH?

Wcześniej przeprowadzałem tunelowanie portów, ale zwykle robię to we właściwy sposób:

  • Łączę się ze zdalnym urządzeniem i pytam, czy port 12345 pojawia się na moim komputerze lokalnym na porcie 12345.
  • Coś uruchamiam na P12345 na zdalnej maszynie
  • Mogę uzyskać do niego dostęp za pośrednictwem localhost: 12345

Co chcę zrobić:

  • Podłącz do zdalnego komputera i poproś, aby jego lokalny P12345 pobierał rzeczy z mojego lokalnego P12345 (przez tunel)
  • Coś uruchamiam na moim komputerze lokalnym na P12345
  • Inne osoby mogą uzyskać dostęp do zdalnego: 12345 i zobaczyć mój lokalny host: 12345
Oli
źródło

Odpowiedzi:

96

Polecenie przekierowania portu 80 z komputera lokalnego ( localhost) do zdalnego hosta na porcie 8000 to:

ssh -R 8000:localhost:80 oli@remote-machine

Wymaga to dodatkowego dostosowania na serwerze SSH, dodaj linie do /etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

Następnie ponownie załaduj konfigurację, wykonując serwer sudo reload ssh.

Ustawienie GatewayPorts yespowoduje, że SSH wiąże port 8000 z adresem symbolu wieloznacznego, więc staje się dostępny dla adresu publicznego remote-machine( remote-machine:8000).

Jeśli chcesz mieć opcję niewiążącą wszystkiego na adresie wieloznacznym, zmień GatewayPorts yesna GatewayPorts clientspecified. Ponieważ sshdomyślnie wiąże się z adresem pętli zwrotnej, musisz określić pusty bind_addressdla powiązania adresu z symbolem wieloznacznym:

ssh -R :8000:localhost:80 oli@remote-machine

:Zanim 8000jest obowiązkowe, jeśli GatewayPortsjest ustawiony clientspecifiedi chcesz, aby umożliwić dostęp do publicznego remote-machine:8000.

Odpowiednie fragmenty instrukcji:

ssh (1)

-R [adres_powiązania:] port: host: port_portu
Określa, że ​​dany port na hoście zdalnym (serwerze) ma być przekazywany do danego hosta i portu po stronie lokalnej. Działa to poprzez przydzielenie gniazda do nasłuchiwania portu po stronie zdalnej, a po każdym połączeniu z tym portem połączenie jest przekazywane przez bezpieczny kanał, a połączenie z portem hosta jest nawiązywane z komputera lokalnego. Domyślnie gniazdo nasłuchujące na serwerze będzie powiązane tylko z interfejsem sprzężenia zwrotnego. Można to zastąpić, podając adres powiązania. Pusty adres powiązania lub adres „*” wskazuje, że gniazdo zdalne powinno nasłuchiwać na wszystkich interfejsach. Określenie zdalnego adresu powiązania powiedzie się tylko wtedy, gdy włączona jest opcja GatewayPorts serwera (patrz sshd_config (5)).

sshd_config (5)

GatewayPorts
Określa, czy zdalne hosty mogą łączyć się z portami przekierowanymi dla klienta. GatewayPorts może być użyty do określenia, że ​​sshd powinien umożliwiać zdalnym przekierowaniom portów wiązanie się z adresami innymi niż sprzężenie zwrotne, umożliwiając w ten sposób innym hostom połączenie. Argumentem może być „nie”, aby wymusić, aby zdalne przekierowania portów były dostępne tylko dla lokalnego hosta, „tak”, aby wymusić zdalne przekierowanie portów, aby powiązało się z adresem z symbolem wieloznacznym, lub „określone przez klienta”, aby pozwolić klientowi wybrać adres, na który przekazywanie jest związane. Domyślne ustawienie to „nie”.

Zobacz też:

Lekensteyn
źródło
7
GatewayPortsbyła magiczna kula tutaj. Podoba mi się, że znalazłeś wersję, która pozwala mi ograniczyć tę dość zaawansowaną technikę do niektórych użytkowników.
Oli
1
Mylące było dla mnie to, że GatewayPorts muszą być ustawione na maszynie, która uruchamia właściwe polecenie ssh, aby zainicjować tunel zwrotny (lokalny). Moim zdaniem było to bardziej logiczne, że drugi koniec (zdalny) zająłby się miejscem, z którego przyjmować połączenia, ponieważ tam właśnie się łączysz i z którego następuje przekierowanie. Zajęło mi to wieki, aby to obejść.
Ars Magika
2
@ArsMagika Nie jestem pewien, czy cię rozumiem. GatewayPorts należy ustawić na serwerze SSH, a nie na komputerze lokalnym, na którym uruchomiono sshpolecenie. Konfiguruje, czy inni klienci mogą komunikować się z przekierowanymi portami na serwerze.
Lekensteyn
Minusem tego rozwiązania jest utrata możliwości określenia adresu IP klienta w dzienniku dostępu serwera WWW. Jest jakiś sposób na rozwiązanie tego problemu?
Twonky,
@Twonky Jeśli nie musisz znać dokładnego adresu IP klienta (tylko, że był to zdalny, a nie „localhost”), a twój lokalny serwer nasłuchuje na adresie wieloznacznym (tzn. Akceptuje połączenia z dowolnego adresu), możesz spróbować przekierować na -R :8000:127.0.1.1:80(lub inny 127.x.x.xadres). W przeciwnym razie nie, nie będziesz mógł nauczyć się zdalnego adresu IP.
Lekensteyn,
14

Jeśli serwer tak GatewayPorts no, możesz osiągnąć ten sam wynik, wykonując go ssh -g -L 8001:localhost:8000 oli@remote-machinena serwerze po wykonaniu ssh -Rpolecenia na kliencie. Dzięki temu port sprzężenia zwrotnego 8000 na serwerze będzie dostępny we wszystkich interfejsach na porcie 8001.

FaST4
źródło