Ngrok, secure tunnels to your Local Development Environment
…or how I exposed my local services in 3 seconds?
Why?
Stay agile. Expose your local services in seconds. Ngrok describes itself as “expose a local server behind a NAT or firewall to the internet.”
When you use ngrok, you can expose your local web server, APIs, databases, etc. So, It’s easier to expose your services when you don’t have big changes and don’t wanna deploy it to your development environment. In other words, quickly and useful solution to demo without deploying.
My own case is:
I wanna expose my API Rest and Database to use them in a deployed AWS Lambda function.
Spoiler Alert: No more “but it works on my machine!”
Running Ngrok
Ngrok is very easy to install and don’t have run-time dependences. Just unzip it, add to your path and run it on your terminal. [1]
Step 1: Download ngrok
Download ngrok for your favorite OS.
Step 2: Unzip it
Unzip and, if you want, add it to your path (Move it to /usr/local/bin
or use your favorite command)
$ unzip /path/to/ngrok.zip
Step 3: Run it!
Remember, you need to add ngrok to your path or use ./path/to/ngrok
$ ngrok help
Exposing HTTP’s Services
HTTP Tunnels are easier as a piece of cake:
$ ngrok http 8080
Then, you can see the ngrok UI in your terminal, for example:
ngrok by @inconshreveable
Tunnel Status online
Version 2.2.8
Web Interface http://127.0.0.1:4040
Forwarding http://92832de0.ngrok.io -> localhost:8080
Forwarding https://92832de0.ngrok.io -> localhost:8080
Connnections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
In this example, you can access to your service (localhost:8080) throughhttps://92832de0.ngrok.io
Sure, https it’s hot to go!
Now, you can access to your localhost from anywhere, including the International Space Station (ISS). Awesome, right?
What, are you using Virtual Hosts? Not problem.
You just need include the host-header flag:
$ ngrok http -host-header=myservice.local.vh port
For example, if I wanna expose this virtual host: jotarios.local.vh:80
$ ngrok http -host-header=jotarios.local.vh 80
Exposing networked services
TCP tunnels allow you to expose any networked service that runs over TCP. This is commonly used to expose SSH (Yes, SSH!), game servers (e.g. Minecraft), databases and more. Starting a TCP tunnel is easy.
First, you need sign up (for free) to expose this type of services.
Step 1: Sign up
Step 2: Get your authtoken
Step 3: Install your authtoken
$ ngrok authtoken YOUR_TOKEN_HERE
Step 4: Create your secure tunnel
$ ngrok tcp port
For example, I wanna expose a MySQL database, with a port 3306:
$ ngrok tcp 3306
Then, you can see the ngrok UI in your terminal, for example:
Session Status online Account jotarios (Plan: Free) Version 2.2.8 Region United States (us) Web Interface http://127.0.0.1:4041 Forwarding tcp://0.tcp.ngrok.io:14563 -> localhost:3306 Connections ttl opn rt1 rt5 p50 p90 68 0 0.00 0.00 0.89 28.70
In this example, you can access to your database through 0.tcp.ngrok.io:14563
Easy, right?
More information?
You can access to Docs or read FAQs.
Free user plan:
- HTTP/TCP tunnels on random URLs/ports
- 1 online ngrok process
- 4 tunnels per ngrok process
- 40 connections / minute (error 429)
Spoiler alert 2: If you don’t like the random name generated, you can use your own subdomain name (paid plans) to expose your services. Example: myawesomeapi.ngrok.com
Conclusion
Ngrok is a powerful tool to expose your local services through secure tunnels. You can use it to expose web servers, API Rest, SSH, game servers, databases and many others for free.
Thanks for reading ;)!
References
Important note:
ngrok does not log or store any data transmitted through your tunneled connections. ngrok.com does log some information about the connections which are used for debugging purposes and metrics like the name of the tunnel and the duration of connections. For complete end-to-end security, use a TLS tunnel.
About the Author:
I’m a Computer Science student in UTEC and Back-end Developer Jr. in Fandango Lat. Lover of Software development and Quality Education (SDG 4). I research about nodejs and robots, nodebots.
You can see my open-source projects in my account of Github: