ngrok: tunelowanie ruch lokalnego na zewnątrz – RDP

W jaki sposób szybko, bezpiecznie i bez dodatkowych kosztów udostępnić usługę lokalną na zewnątrz? Jak wystawić swój własny serwer web, połączenie RDP, ftp, SSH do sieci? Jak dostać się na pulpit zdalny bez własnego adresu IP? Z rozwiązaniem przychodzi nam tunelowanie ruch. Użyjemy do tego celu najlepszej dostępnej obecnie usługi a mianowicie ngrok (w opcji darmowej). W naszym przykładzie wystawimy usługę pulpitu zdalnego tak aby była dostępna z każdego miejsca na świecie, bez własnego adres IP, bez własnej domeny czy przekierowań portów w środowisku sieciowym, spróbujemy też zautomatyzować cały proces.

W tym celu tworzymy darmowe konto w usłudze ngrok. Do rejestracji niezbędny jest adres mailowy którym będziemy się logować do panelu usługi. Po jego utworzeniu logujemy się do naszego panelu

Pobieramy instalator dla wersji OS w jakiej mamy system z którego chcemy tunelować ruch usługi RDP – w naszym wypadku Windows . Rozpakowujemy paczkę ZIP w wybranej przez nas lokalizacji

Przechodzimy do katalogu z aplikacją i uruchamiamy program, pojawi się wiersz poleceń opisujący możliwości aplikacji:

Teraz musimy połączyć ngrok’a z naszym kontem w usłudze, wracamy na chwile do panelu dashboard.ngrok.com i odszukujemy polecenie które pozwoli nam dodać token autoryzujący do naszego środowiska:

Kopiujemy zawartość polecenia i wklejamy je do okna naszej otwartej aplikacji:

Wykonujemy polecenie, zostajemy poinformowani od dodani tokena do pliku konfiguracji:

W naszym przykładzie chcemy przekierować ruch usługi RDP – tak aby umożliwć sobie dostęp do środowiska lokalnego z każdego miejsca gdzie mamy dostęp do internetu.

W tym celu sprawdzamy czy mamy włączoną usługę pulpitu zdalnego w naszym serwerze – jeżeli nie musimy ją uruchomić (w menu start wpisujemy sysdm.cpl otwieramy element panelu sterowania i na zakładce Zdalny weryfikujemy czy mamy zaznaczoną opcje „Zezwalaj na połączenia zdalne z tym komputerem

Połączenia pulpitu zdalnego domyślnie realizowane są na porcie 3389 zatem taki port musimy tunelować z użyciem usługi ngrok, wróćmy do naszej aplikacji. Otwieramy wiersz poleceń w katalogu gdzie jest zainstalowany ngrok i używamy polecenia:

ngrok tcp 3389

Pojawi się informacja o zestawieniu tunelu:

Czas sprawdzić czy tunel działa, z innej maszyny spróbujemy nawiązać połączenie używając w/w adresu i portu czyli w naszym przypadku:

6.tcp.eu.ngrok.io:14972

logujemy się i działa 🙂

Prawda że prosto i szybko? Tunel jest szyfrowany więc również bezpiecznie – sprawdźmy czy jest on widoczny w naszym panelu usługi:

Mamy działające rozwiązanie dzięki któremu możemy dostać się po RDP niezależnie od miejsca gdzie przebywa maszyna docelowa. Ważne aby miała dostęp do internetu który nie blokuje używanych połączeniu portów po stronie dostawcy czyli np TCP 3389

UWAGA: pamiętajcie że adres tunelu zmienia się przy każdym uruchomieniu aplikacji ngrok – ale za to można go zweryfikować po stronie panelu naszej usługi:

Darmowa wersja usługi pozwala na tylko jeden aktywny tunel:


Jak zatem zestawić takie połączenie na stałe? Musimy utworzyć skrypt który będzie uruchamiał nasz tunel z każdym uruchomieniem maszyny – a my po stronie panelu uzyskamy aktywny adres.

Zacznijmy od dodania aplikacji ngrok do zmiennych środowiskowych, w menu start wpisujemy „zmienne” i wybieramy najlepszy wynik – jeżeli mamy problem to ponownie wpisujemy sysdm.cpl i wybieramy zakładkę Zaawansowane i natępnie „Zmienne środowiskowo”

W nowo otwartym oknie wybieram zmienną systemową Path i edytujemy jej zawartość

Dodajemy nową pozycje i wprowadzamy ścieżkę gdzie zainstalowaliśmy ngrok’a:

Darmowe konto ngrok nie pozwala na uruchomienie aplikacji jako usługi (o czym na końcu tego wpisu). Dlatego kolejny sprawdzony sposób jak to zrobić w darmowej wersji znajdziecie poniżej.

Będziemy więc musieli trochę pobawić się notatnikiem. Najpierw tworzymy plik .bat zawierający nasze polecenie uruchamiające tunel RDP:

ngrok tcp 3389

Plik dla ułatwienia zapisujemy w katalogu instalacyjnym ngrok, sprawdzamy czy nasz skrypt ngrok.bat działa uruchamiając go. Działa, tunel się zestawia i jest tak długo otwarty jak mamy otwarte okno konsoli.

My będziemy jednak chcieli aby okno konsoli było ukryte, pamiętacie nasz wpis o tym jak ukrywać okno skryptów?

Dokładnie tak samo zrobimy tym razem aby nic nam nie przeszkadzało w pracy albo żeby użytkownik o fakcie zestawienia tunelu nie wiedział.

Ponownie uruchamiamy notatnik i tworzymy nowy plik z podaną niżej zawartością:

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\Program Files\ngrok\ngrok.bat" & Chr(34), 0
Set WshShell = Nothing

Plik zapisujemy z rozszerzeniem VBS. Znowu sprawdzamy jak działa (zamykając wcześniej otwarte CMD z ngrok). Tym razem nie mamy okna konsoli, w menadżerze zadań pojawia się jednak ngrok – sprawdźmy jeszcze w panelu czy tunel jest zestawiony:

Działa pozostaje dodać nam plik ngrok.vbs do autostartu. Uruchamiamy przystawkę autostart z polecenia Urcuhom

shell:startup

lub przechodzimy do naszego katalogu autostartu

i wklejamy nasz plik ngrok.vbs. następnie restartujemy nasz komputer i sprawdzamy czy działa.

Widzimy tunel w panelu a w menadżerze zadań widać uruchomiony proces. Prawda że proste?

UWAGA: można dużo prościej ale warunkiem jest konto płatne w usłudze ngrok, wtedy wystarczy uruchomić aplikacje jako usługę. Przechodzimy do katalogu gdzie mamy umieszczony config naszego ngroka, w naszym wypadku jest to katalog:

C:\Users\Administrator\AppData\Local\ngrok

Otwieramy plik ngrok.yml do edycji i wprowadzamy poniżej tokenu autoryzacyjnego definicje tunelu:

tunnels:
    default:
        proto: tcp
        addr: 3389

Następnie w wierszu poleceń jako administrator wydajemy komendę instalacji usługi ngrok’a:

ngrok service install --config=C:\Users\Administrator\AppData\Local\ngrok\ngrok.yml

i uruchamiamy usługę:

ngrok service start

Od jej chwili jest to zwykła usługa. Pamiętajcie że ta opcja dostępna jest tylko w płatnej wersji konta.

Zastosowań może być sporo – od zdalnego dostępu do środowisk serwerowych. Przez dostęp do własnego laptopa pozostawionego w pracy, aż przez zdalne wsparcie użytkowników.

Sam ngrok ma dużo więcej opcji – developerzy wystawiają na nim swoje testowe aplikacje web, usługi ssh, ftp czy webhook’i. Powyższy sprawdzony sposób da radę!