Wprowadzenie
Zdarza się, że potrzebujemy dostać się do jakiejś usługi działającej na komputerze lokalnym z sieci zewnętrznej – na przykład podczas testowania integracji z webhookami wysyłanymi między innymi przez takiego SendGrida. O ile mamy publiczne IP i możemy skonfigurować przekierowanie portów, to nie jest to jakoś mocno problematyczne. Gorzej jak pracujemy w biurze i doproszenie się o to administratorów graniczy z cudem. W takiej sytuacji z pomocą przychodzi tytułowy ngrok.
ngrok
Za pomocą ngrok (https://ngrok.com/) możemy w prosty i szybki sposób tunelować ruch z Internetu do portu w lokalnym komputerze. Przydaje się to w wielu sytuacjach jak wspomniane wcześniej testowanie webhooków, wiadomości wysyłanych przez Event Grida w Azure, czy udostępnianie usług z sieci lokalnej. Sytuacji, kiedy ngrok może nam się przydać, jest wiele, a co ważne uruchomienie i konfiguracja zajmuje dosłownie chwilkę.
Co najfajniejsze, z podstawowej wersji usługi możemy korzystać za darmo. Mamy wtedy dostęp do jednego aktywnego procesu ngrok, który umożliwia postawienie 4 tuneli i obsługę do 40 połączeń na minutę. Jednym z większych minusów darmowej wersji jest to, że każde uruchomienie nowego procesu/tunelu powoduje wygenerowanie nowego adresu publicznego. A to skutkuje tym, że na przykład musimy aktualizować konfigurację webhooków, aby żądania były wysyłane pod nowy adres.
Do celów developerskich takie ograniczenie jest nie dużym problemem. Szczególnie, że wtedy usługa jest za darmo. Zawsze można również skorzystać z płatnych wersji, które znoszą to ograniczenie i dają jeszcze inne funkcjonalności.
Na co dzień korzystam z Windowsa, więc poniższy opis będzie dotyczył tego systemu, ale ngrok może działać również na innych systemach i same kroki są bardzo podobne.
Utworzenie tunelu w ngrok
Utworzenie nowego tunelu jest bardzo proste. Trzeba przede wszystkim założyć konto na stronie https://ngrok.com, a następnie pobrać ngrok.zip. Wypakowujemy plik ngrok.exe i możemy przejść do konfiguracji aplikacji.
Przed pierwszym uruchomieniem aplikacji musimy połączyć ją z naszym kontem. Robimy to uruchamiając komendę:
ngrok authtoken token
Musimy ustawić nasz token, który możemy pobrać z portalu ngrok – https://dashboard.ngrok.com/get-started/setup (tutaj znajduje się również prosty tutorial, jak uruchomić tunelowanie). Powyższa komenda tworzy plik konfiguracyjny, w którym jest token. Plik znajduje się w lokalizacji „C:\Users\[nazwa użytkownika]\.ngrok2”
Po konfiguracji ngrok możemy przejść już do utworzenia nowego tunelu. Robi się to w wierszu poleceń za pomocą komendy (w folderze, gdzie wypakowaliśmy ngrok):
ngrok http 5000
Gdzie 5000 to numer portu, na który chcemy przekierować ruch. W efekcie zobaczymy coś takiego:
W konsoli mamy przede wszystkim informacje o publicznych adresach. Są to dwa adresy – jeden dla protokołu HTTP, a drugi dla HTTPS. Oba są przekierowane do portu 5000, gdzie w momencie tworzenia tego wpisu, była uruchomiona aplikacja z poprzedniego wpisu o SendGrid.
Testowa aplikacja ma skonfigurowanego swaggera i w momencie działania tunelu jest on również dostępny pod adresem: https://58c380b6ab04.ngrok.io/swagger/index.html:
Co fajne, w przypadku adresu HTTPS jest dostępny ważny certyfikat, więc nie musimy się tym przejmować, co miałoby miejsce w przypadku publicznego ip i przekierowania portów. I to nawet w darmowej wersji.
W momencie tunelowania połączeń na konsoli wyświetlają się informacje o kolejnych żądaniach. Poniżej widoczny jest zrzut po wyświetleniu powyższego swagger ui:

W wersji darmowej za każdym razem jak uruchomimy tunel, będziemy mieli zupełnie nowy adres.
Dashboard
Poza samym tunelem lokalnie mamy dostęp do dashboardu (http://127.0.0.1:4040/). Znajdziemy w nim szereg ciekawych informacji.
Przede wszystkim jest to lista przesłanych żądań. Mamy informacje o treści żądania, nagłówki, odpowiedzi i tak dalej. Bardzo przydadzą się do późniejszej analizy:
Na zakładce Status wyświetla się konfiguracja oraz trochę statystyk.
Przykład
Do tego wpisu nie ma dedykowanego przykładu. Aby sprawdzić działanie ngrok możesz na szybko utworzyć prostą aplikację na przykład MVC, uruchomić ją w Visual Studio i do niej przekierować ruch.
Podsumowanie
W dobie chmury bardzo często nie jesteśmy w stanie wszystkiego odpalić lokalnie podczas developmentu. Czasami będziemy potrzebowali w jakiś sposób przekierować ruch z Internetu do naszego lokalnego komputera. W takiej sytuacji ngrok jest bardzo przydatny. W kilka chwili możemy utworzyć tunel i to za darmo. A co fajne, w wersji HTTPS nie będziemy musieli przejmować się posiadaniem ważnego certyfikatu.
A Ty w jaki sposób radzisz sobie w takich sytuacjach?
Wow! Dzięki! Jestem początkującym programistą za granicą i właśnie dziś na spotkaniu deweloperów jeden mówił o ngrok i jego używaniu. I mi się przypomniało że ty pisałeś jakiś czas temu o tym. Dziękuję za wyjaśnienie bo wiadomo że w ojczystym języku lepiej idzie wszystko pojąć 😉
Dzięki, fajnie wiedzieć, że mam czytelników również za granicą 🙂