Jak skonfigurować tunel ssh do przekazywania ssh?

13

Mam komputer z Ubuntu za routerem, którego nie mogę skonfigurować. Jednak chcę mieć dostęp ssh do tego komputera. Myślę, że jest to możliwe dzięki tunelowaniu ssh, ale nie wiem, jak to zrobić. Mam inny serwer, do którego chciałbym skonfigurować tunelowanie. Jak to zrobić? A może masz inny pomysł na rozwiązanie tego problemu?

Próbowałem:

ssh -N user@my_server -L 22/localhost/8090

ale mówi:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
Klew
źródło

Odpowiedzi:

18

Pytasz, czy nasłuchuje na lokalnym porcie 22 i przekierowuje połączenia na port 8090 systemu zdalnego. Nie możesz tego zrobić, ponieważ lokalny port 22 jest już zajęty przez lokalny serwer SSH.

Myślę, że to, czego szukasz, to przekazywanie zdalne. Wymiana -L 22:localhost:8090z -R 8090:localhost:22powie zdalnego hosta, aby nasłuchiwać na porcie 8090 i przekazuje żądania do serwera SSH.

Jeśli pozostawiasz uruchomione połączenie, aby móc później wejść ze zdalnej witryny, musisz upewnić się, że połączenie nie przekroczy limitu czasu z powodu braku aktywności, dodając odpowiednie opcje ( -o TCPKeepAlive=yeslub -o ServerAliveInterval=30)

Więc skończysz z czymś takim jak:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30

Ponadto, jeśli jeden z przeskoków sieciowych między tobą a serwerem zostanie przerwany w dowolnym momencie, połączenie zostanie przerwane pomimo określonych opcji KeepAlive, więc możesz chcieć dodać to polecenie do inittab lub zajrzeć do pakietu daemontools lub dystrybucji równoważne, aby zawsze uruchamiał się przy rozruchu i był restartowany, gdy kończy działanie z innego powodu niż zamknięcie systemu (lub można go uruchomić ze skryptu powłoki, który zapętla się w nieskończoność, ale init lub daemontools są czystszymi rozwiązaniami).

David Spillett
źródło
To prawie działa. Mogę połączyć się z komputerem, ale mogę to zrobić tylko wtedy, gdy jestem zalogowany na serwerze. Chciałbym połączyć się przez ten port z dowolnego miejsca.
klew
3
Jeśli dodasz adres publiczny serwera lub symbol zastępczy do definicji przekierowania portów (-R 111.222.333.444:8090:localhost:22 lub -R *: 8090: localhost: 22), może to działać, chociaż tego rodzaju rzeczy można wyłączyć na serwerze. Jeśli serwerem jest serwer, który kontrolujesz, upewnij się, że opcja GatewayPorts jest włączona w sshd_config.
David Spillett
Napisałem skrypt, który pomaga mi w tunelowaniu ssh, możesz to sprawdzić na stronie: github.com/gdbtek/ssh-tunneling
Nam Nguyen
Dodanie GatewayPorts Yesdo mojego sshd_config pomogło mi otworzyć port dla publiczności.
Adam F.
8

Nie możesz tego zrobić, ponieważ próbujesz przekierować port 22 na komputerze lokalnym do portu 8090 na serwerze zdalnym, a coś już działa na porcie 22 na serwerze lokalnym. Najprawdopodobniej masz uruchomiony serwer SSH. Możesz to naprawić, zmieniając 22 na inną wartość. Możesz sprawdzić, czy port jest wolny, uruchamiając:

# netstat -lep --tcp

Wyświetla listę wszystkich gniazd nasłuchujących, więc jeśli portu nie ma na liście, oznacza to, że jest bezpłatny.

David Pashley
źródło
3

Używam polecenia lsof -i: PortNumber, aby sprawdzić, czy port jest wolny:

# lsof -i :2272

jeśli port jest wolny, nic nie zobaczysz w danych wyjściowych.

Taras
źródło