Blog / Tunneling · Developer Tools · Lokale Ontwikkeling

ngrok alternatieven vergelijken: welke tunnel tool past bij jouw workflow

P
Pim vd Molen

Soms zit je midden in een integratieproject waarbij je een externe dienst toegang moet geven tot je lokale machine. Denk aan een betalingsprovider die callbacks stuurt, een OAuth-flow die een publieke redirect-URL verwacht, of een klant die even wil meekijken terwijl je iets demonstreert. De meeste developers grijpen dan naar ngrok, want dat is al jaren het meest bekende hulpmiddel voor dit soort situaties. Maar ngrok is allang niet meer de enige optie, en eerlijk gezegd ook niet altijd de beste keuze.

Waarom ngrok zijn vanzelfsprekende positie verliest

Jarenlang was ngrok de standaard. Je downloadt de binary, draait één commando, en je hebt een publieke URL die doorverwijst naar poort 8000 op je laptop. Het werkt. Maar de gratis laag van ngrok heeft beperkingen die je in de praktijk snel tegenkomt: sessies die verlopen na een bepaalde tijd, willekeurig gegenereerde subdomeinen die bij elke herstart veranderen, en een limiet op het aantal gelijktijdige verbindingen. Voor een snelle test is dat prima. Zodra je een vaste URL nodig hebt, of als je met meerdere services tegelijk werkt, loopt het vast.

Bovendien heeft ngrok zijn prijsstelling flink aangepast. Wat vroeger gratis was, vereist nu een betaald plan. Dat is begrijpelijk voor een bedrijf, maar het heeft ook de deur opengezet voor alternatieven die dezelfde of betere functionaliteit leveren voor minder geld, of zelfs gratis.

Cloudflare Tunnel als serieuze optie

Cloudflare Tunnel is een van de interessantste alternatieven. Het werkt anders dan ngrok: in plaats van een tijdelijke verbinding via een externe relay, installeer je cloudflared op je machine en koppel je dat aan je Cloudflare-account. Verkeer loopt via Cloudflare's netwerk naar jouw lokale dienst, zonder dat je een open poort in je firewall nodig hebt.

# Installeer cloudflared via Homebrew
brew install cloudflare/cloudflare/cloudflared

# Log in en link je account
cloudflared tunnel login

# Maak een tunnel aan
cloudflared tunnel create mijn-dev-tunnel

# Start de tunnel naar je lokale server
cloudflared tunnel run --url http://localhost:8000 mijn-dev-tunnel

Wat dit in de praktijk betekent: je subdomein blijft stabiel zolang je de tunnel niet verwijdert. Dat maakt het een stuk prettiger als je een webhook-endpoint hebt geconfigureerd bij een externe dienst. Je hoeft niet telkens de callback-URL bij te werken. Bovendien levert de Cloudflare-integratie gratis TLS-terminatie, wat voor HTTPS-vereisten erg handig is. Het nadeel is dat de initiële setup wat meer stappen vraagt dan simpelweg een binary downloaden en een commando uitvoeren.

Localtunnel en bore als lichtgewicht keuzes

Niet elke situatie vraagt om de volledige infrastructuur van Cloudflare. Soms wil je gewoon snel iets laten zien aan een collega, of een lokale frontend testen via een mobiel apparaat op een ander netwerk. Localtunnel is daarvoor een goede keuze: het draait volledig via npm, heeft geen account nodig, en is in tien seconden actief.

# Installeer localtunnel globaal
npm install -g localtunnel

# Start een tunnel naar poort 3000
lt --port 3000 --subdomain mijn-project

Met de --subdomain vlag probeer je een vast subdomein te reserveren, al is dat niet gegarandeerd omdat andere gebruikers hetzelfde kunnen proberen. De service draait op gedeelde publieke servers, wat betekent dat je er niet op moet rekenen voor iets dat langer dan een sessie meegaat. Voor een demonstratie of een snelle test is het ideaal, maar zet er geen productiematige webhook op.

Bore is een alternatief dat anders is ingestoken: het is een open-source tool geschreven in Rust, bedoeld voor mensen die hun eigen tunnelserver willen draaien. Als je een VPS hebt staan, is dit een elegante manier om van externe afhankelijkheden af te komen. Je draait bore server op je VPS en bore local op je ontwikkelomgeving.

# Op je VPS
bore server --min-port 7000

# Op je lokale machine, doorsturen naar poort 8080
bore local 8080 --to jouw-vps-ip --port 7000

Zelf heb ik dit opgezet op een kleine VPS die ik toch al draaide voor andere zaken. De overhead is minimaal, en het geeft me een stabiele tunnel die ik zelf beheer. Er is geen gratis laag die plots verandert, geen account om te beheren, en geen willekeurig subdomein. Het vraagt wel dat je zelf zorgt voor DNS als je een leesbaar domein wil.

Expose.dev versus deze alternatieven

Expose.dev verdient een aparte vergelijking omdat het specifiek voor PHP-developers is gebouwd door Marcel Pociot, bekend van zijn Laravel-gerelateerde projecten. Het integreert netjes in een workflow waarbij je al met Laravel Herd of Valet werkt. Je krijgt een overzichtelijke webinterface op localhost:4040 (vergelijkbaar met ngrok's dashboard) waar je inkomend verkeer kunt inspecteren, inclusief headers en request bodies.

# Installeer expose via Composer
composer global require beyondcode/expose

# Start een tunnel
expose share http://localhost

Waar expose.dev zich onderscheidt ten opzichte van bore en localtunnel is de inspectie-interface. Als je een webhook debugt en precies wil zien welke payload binnenkomt, is dat dashboard onmisbaar. Je kunt requests zelfs herspelen, wat enorm scheelt als je de externe dienst niet telkens opnieuw wil triggeren. Vergeleken met Cloudflare Tunnel is expose.dev lichter op te zetten, maar minder geschikt als je de tunnel langdurig actief wil houden of als je meerdere services tegelijk doorverwijst.

Het onderscheidende nadeel van expose.dev in de gratis versie is dat subdomeinen ook hier willekeurig zijn. Met een betaald account reserveer je een eigen subdomein op het expose.dev domein, of je koppelt het aan een eigen domein via een zelfgehoste instantie.

# Zelfgehoste expose server installeren
composer create-project beyondcode/expose-server expose-server

# Start de server
php artisan serve --port=443

Een zelfgehoste expose-server combineer je prima met een eigen domein en een wildcard-certificaat. Dat geeft je de inspectie-functionaliteit van expose.dev gecombineerd met de controle van bore. Het vraagt wel meer beheerwerk vooraf.

Welke tool kies je waarvoor

De keuze hangt af van wat je wil bereiken. Soms is het antwoord simpel: localtunnel voor een vijf-minuten-demo, bore of Cloudflare Tunnel voor een stabiele webhook-URL die meerdere dagen actief blijft, en expose.dev als je specifiek in een PHP/Laravel-omgeving werkt en de debuginterface een rol speelt. Ngrok blijft relevant als je een bestaand account hebt of als de Windows- of macOS-desktop-app aantrekkelijk is, maar voor nieuwe projecten is het zelden mijn eerste keuze.

# Snel overzicht: start ngrok, expose en cloudflared naast elkaar vergelijken
# ngrok
ngrok http 8000

# expose
expose share http://localhost:8000

# cloudflared (na setup)
cloudflared tunnel run --url http://localhost:8000 mijn-tunnel

Al drie commando's doen in essentie hetzelfde, maar wat er daarna gebeurt verschilt: hoe stabiel de URL is, wat je ziet in een dashboard, of je een account nodig hebt, en wat het kost bij langdurig gebruik. Ik raad aan om ze alle drie een keer te proberen in een echte situatie, want de voorkeur verschilt per developer. Zelf gebruik ik Cloudflare Tunnel voor projecten waarbij een externe dienst webhooks stuurt die ik langdurig moet testen, en expose.dev als ik snel iets wil inspecteren tijdens een debugsessie. Bore staat op een VPS klaar als backup, en dat geeft een goed gevoel: ik ben niet afhankelijk van één dienst die zijn gratis laag kan wijzigen zodra het hen uitkomt.

// VEELGESTELDE VRAGEN