Przypuśćmy, że mamy sieć lokalną za NATem czyli z Internetu się do niej nie dostaniemy (bo admin nie pozwala). Jak się dostać zatem do choć jednego komputera w takiej sieci lokalnej z Internetu (no, może jednak do kilku komputerów)? Rozwiązaniem jest ssh i jego funkcjonalność tunelu zwrotnego.
Tunel zwrotny do hosta źródłowego
W tym przypadku utworzymy tunel zwrotny nazywany wstecznym przekierowaniem (ang. remote forwarding), który pozwoli dostać się ze zdalnego hosta (zdalnej, publicznej sieci) do naszego hosta lokalnego (źródłowego, który jest za NAT np. w sieci lokalnego dostawcy). W tym wypadku musimy dysponować hostem w sieci zdalnej, na którym działa SSH i gdzie mamy konto. Może to być Linux, RouterOS, Windows czy inny system. Schemat taki:
Konfiguracja na Windows za pomocą PuTTY
Ustawiamy adres zdalnego hosta:
W sekcji Connection/SSH/Tunnels ustawiamy porty (i klikamy Add aby je dodać przed połączeniem):
Konfiguracja w konsoli s za pomocą ssh
Pracując na PC (host źródłowy) wydamy następujące polecenie celem zestawienia tunelu:
# ssh admin@83.10.20.30 -R 10000:127.0.0.1:3389 lub # ssh admin@83.10.20.30 -R 10000:localhost:3389
Elementy polecenia:
- admin@83.10.20.30 to połączenie ssh do zdalnego hosta
- -R 10000 otwiera nasłuchujący port na zdalnym hoście na jego interfejsie pętli zwrotnej 127.0.0.1 i porcie 10000
- 127.0.0.1:3389 to jest docelowe gniazdo (z perspektywy hosta zdalnego) na naszym hoście źródłowym (maszyna PC)
Wszystko co wpadnie do 127.0.0.1:10000 na hoście zdalnym jest kierowane do hosta PC na gniazdo 127.0.0.1:3389. Oczywiście na tym gnieździe coś musi nasłuchiwać, a może to być dowolna usługa.
Domyślnie na zdalnym hoście port nasłuchujący jest zawsze tworzony na interfejsie 127.0.0.1. Jeśli na zdalnym hoście chcesz uruchomić nasłuchiwanie na innym interfejsie czy adresie to trzeba zmienić dwie opcje:
- podać inny adres: ssh admin@83.10.20.30 -R retmote_ip:10000:127.0.0.1:3389
- włączyć na zdalnym hoście opcje ‚AllowTcpForwarding yes’ (domyślnie właczona)
- włączyć na zdalnym hoście przekierowanie takiego ruchu zmieniając opcję ‚GatewayPorts’ na ‚yes’ w pliku /etc/ssh/sshd_config (trzeba przeładować ssh: ‚systemctl reload ssh’)
Adres remote_ip to najczęściej 0.0.0.0 jeśli chcesz aby usługa lokalna (ta na maszynie źródłowej) była dostępna dla wszystkich hostów mających dostęp do maszyny zdalnej. Jak usługa ta ma być dostępna tylko ‚wewnątrz’ zdalnego hosta to zmień ‚GatewayPorts’ na ‚no’.
Kolejno na hoście zdalnym (tym w Internecie) można wykonać połączenie RDP (za pomocą np. programu mstsc) do adresu 127.0.0.1 na port 10000. Cały ruch zostanie przekierowany szyfrowanym tunelem do hosta PC na jego wewnętrzny adres 127.0.0.1 i port 3389 (czyli standardowy port RDP). Co ważne, ten host jest za NAT i gdybyśmy tego tuneli nie mieli to trzeba błagać administratora NATa aby dokonał przekierowania portu. Administrator może powiedzieć ‚nie’ i wtedy mamy problem bo do PC się nie dostaniemy.
Tunel zwrotny do hosta innego niż źródłowy
Tutaj mamy bardziej złożony przypadek: chcemy uruchomić połącznie zwrotne przez PC1 ale do innego komputera w jego sieci czyli do PC2.
Program ssh też na na to pozwoli tylko teraz musimy także i na hoście źródłowym włączyć dwie opcje w SSH:
- włączyć na zdalnym hoście opcje ‚AllowTcpForwarding yes’ (domyślnie właczona)
- włączyć na zdalnym hoście przekierowanie takiego ruchu zmieniając opcję ‚GatewayPorts’ na ‚yes’ w pliku /etc/ssh/sshd_config (trzeba przeładować ssh: ‚systemctl reload ssh’)
Teraz można już na hoście źródłowym (PC1) wydać polecenie:
# ssh admin@83.10.20.30 -R 10000:192.168.0.101:3389
Interpretacja będzie taka: z hosta PC1 (sieć lokalna) zaloguj się przez ssh do 80.10.20.30. Tam na interfejsie localhost uruchom nasłuchiwanie na porcie 10000. Wszystko co wpada do tego portu leci do PC1 (przez tunel ssh) a kolejno PC1 prześle to do PC2 na jego adres 192.168.0.101 i na port 3389.
Teraz mała uwaga: jeśli zmienimy naszą sieć lokalną na taką:
To komputer PC1 można nazwać hostem bastionowym. Polecenie będzie identyczne.
Zawsze pamiętaj o opcji ‚GatewayPorts’ – jeśli jest ustawiona na ‚yes’ to na takim hoście ssh przypisze porty nasłuchujące do adresu 0.0.0.0 czyli do wszystkich adresów! To oznacza, że każdy host w sieci będzie mógł połączyć się z Twoim zdalnym hostem przez tunel ssh. Dla bezpieczeństwa zawsze warto sprawdzić ta opcje oraz sprawdzić jak jest port przypisany:
Powyższy opis to tylko fragment tematu i możliwości jakie ma ssh. Świetny opis zagadnienia znajdziesz tutaj.






