ssh przez router bez przekierowania portów

11

Mam serwer linux i chcę umieścić go w sieci domowej za routerem. Muszę ssh na tym serwerze kiedyś z zewnątrz, ale nie chcę konfigurować przekierowania portów, ponieważ nie mam dostępu do routera i nie znam też adresu IP routera.

Co mogę zrobić, to umieścić jakiś program na serwerze linux, więc kiedy jest podłączony do Internetu, będzie stale wysyłać dane do mojego innego serwera online, więc znam jego adres IP. Ale czy jest sposób na ssh do serwera za routerem z zewnątrz? coś takiego jak NAT lub gniazdo, które utrzymuje połączenie sieciowe?

Wielkie dzięki

Jiechao Li
źródło

Odpowiedzi:

24

To, co chciałbyś zrobić, to ssh Z twojego „serwera linux” DO czegoś na zewnątrz, takiego jak „mój_inny_serwer” lub coś innego, do czego oba serwery mogą się dostać.

Używałbyś zdalnego przekazywania portów ssh.
[user@linux_server]$ ssh -R8022:localhost:22 my_other_server.com
Wyjaśnienie: Połącz się z my_other_server i otwórz tam port 8022, który przekieruje mnie z powrotem na port 22.

Z my_other_server.com będziesz mógł ssh do localhost na porcie 8022, a twój ruch zostanie przekierowany do linux_server piggybacking na linux_server -> my_other_server tunel [user@linux_server]$ ssh -p8022 localhost
Wyjaśnienie: Połącz się ze mną na porcie 8022, który jest przekierowany do linux_server

Jeśli masz problemy z wypadnięciem początkowego tunelu linux_server -> my_other_server, możesz zrobić skrypt, aby go otworzyć, dostosować ustawienia podtrzymania lub użyć autossh.

MattPark
źródło
1
Dzięki, działa świetnie! Chcę użyć skryptu, aby go otworzyć. Drugie pytanie brzmi: co, jeśli mam 1000 takich „serwerów linuksowych” i tylko jeden „mój_inny_serwer”, czy mogę w ten sposób ssh na dowolnym z nich? Zakładam, że wszyscy potrzebują innego portu i czy jest na to lepszy sposób?
Jiechao Li
To zależy. Teraz, kiedy jesteś na serwerze linux_server, czy możesz po prostu ssh do linux_server2 i linux_server3? To byłoby najłatwiejsze. Więc tak, możesz to zrobić kilka razy, zamiast 8022 użyłbyś 8023, 8024. Jeśli pójdziesz tą drogą, zbuduj plik ~ / .ssh / config na „my_other_server”, który zawiera wszystkie numery portów, więc po prostu ssh [alias] zamiast ssh [port] localhost. To stanie się nieporęczne.
MattPark
1
Czy można to skonfigurować za pomocą tylko dwóch maszyn? Podłączyć B do A, a A z powrotem do B przez siebie?
adamyonk
1
Właśnie to zrobiłem. Potwierdza, że ​​to działa. \ o /
adamyonk
Tak stary - najwyraźniej to rozgryzłeś. Możesz użyć czegoś takiego, autosshaby utrzymać to otwarte.
MattPark,
3

Możesz użyć sieci VPN, aby to działało, ale wymagałoby to posiadania serwera, do którego dostęp byłby niedostępny. Następnie możesz skonfigurować OpenVPN na serwerze, komputerze i zaporze ogniowej, włączyć client-to-clienti gotowe. http://openvpn.net/howto.html

Nathan C.
źródło
Dzięki. Patrzę na to, ale wydaje się to trochę skomplikowane. Jeśli dobrze rozumiem, muszę zainstalować OpenVPN na obu serwerach, aby mogły komunikować się bez konfigurowania routera, prawda?
Jiechao Li
Dokładnie. Konfigurujesz serwer jako „serwer”, a następnie dwóch klientów, których chcesz połączyć razem jako „klientów” w konfiguracji. Wspomniany wyżej SSH wydaje się jednak łatwiejszy.
Nathan C
3

Ta odpowiedź jest oparta na zaakceptowanej, ale dodanie szczegółów, które pozwoliły mi to zrobić. Przepraszam za wyjaśnienia dla pieszych, ponieważ to nie moja wiedza.

Załóżmy, że masz dwa komputery Ai B. Chcesz sshod Acelu B, i nie można zrobić żadnego przekierowania portów w routerach podłączonych do nich.

Jak stwierdzono w zaakceptowanej odpowiedzi, potrzebujesz Sdo tego serwera : w komputerze Bzezwolisz na sshpołączenia przychodzące S; a z komputera Auzyskasz dostęp do tunelu w Scelu osiągnięcia B.

Ale jak zdobyć ten serwer S? Znalazłem serveo(link: https://serveo.net/ ). Jest bardzo prosty w użyciu. Nie musisz niczego instalować ani rejestrować, a to jest bezpłatne. Według strony internetowej następujące kroki to:

  1. Pomyśl o aliasie dla komputera B. Na przykład computer_B_alias.

  2. Na komputerze Bwykonaj ssh -R computer_B_alias:22:localhost:22 serveo.net.

  3. Teraz możesz uzyskać dostęp do komputera Bz komputera A, wykonując następujące czynności na komputerze A:, ssh -J serveo.net user@computer_B_aliasgdzie musisz zastąpić usernazwę użytkownika na komputerze B.

PS: Oczywiście czynisz punkt 2 automatycznym zadaniem podczas uruchamiania komputera B.

PSS: zanim spróbujesz, upewnij się, że sshjest zainstalowany na obu komputerach. W przypadku Ubuntu sudo apt-get install sshwystarczy.

Godoy
źródło
1
Dzięki, to był też brakujący link, którego potrzebowałem. Uwaga serwo wydaje się być wyłączone. Znalazłem te dwie alternatywy raczej przydatne: ngrok i localhost.run !
DannyDannyDanny
1

Długi czas na udzielenie odpowiedzi. Nadzieja może pomóc komuś, kto szuka tego samego teraz.

Jeśli chcesz uzyskać dostęp do serwera za NAT i nie chcesz pisać kodu, prawdopodobnie możesz wybrać narzędzie poniżej i użyć dowolnych, które odpowiadają twoim potrzebom.

Oba powyższe narzędzia zakładają, że masz dostęp do komputera z systemem Linux, aby zainstalować klienta Niektóre z ich zalet to:

  • Oba zapewniają dostęp do terminala za pomocą interfejsu internetowego
  • Nie potrzebujesz własnego pośredniego hosta zwrotnego ssh.
  • Bardzo łatwy w instalacji
  • Oba są open source

Osobiście wolę tmate bardziej, ponieważ możesz hostować serwer tmate na swoim własnym serwerze pośrednim (dla odwrotnego ssh), podczas gdy konsola telefoniczna może łączyć się tylko z własnymi serwerami dla odwrotnego ssh.

Ankit Kulkarni
źródło