Ací t'explique com m'he muntat un túnel segur per a protegir el meu servidor FreeBSD 15 en una Raspberry Pi darrere d'un router 4G on no puc obrir ports ni fer NAT i no tinc IP fixa.
Fa uns dies per 39 euros vaig comprar el router Cudy LTE N300 4G que vull ficar en una segona vivenda per a temes d'IOT, càmeres web i també voldria muntar-me un servidor FreeBSD aprofitant que tindria un router connectat a internet 24x7. El problema és que aquest tipus de router 4G funciona amb una SIM amb internet ilimitat, però per a la companyia (la meua és DIGI) és com una línea de telèfon més i per telèfon em van confirmar que no puc fer NAT amb eixa connexió ja que no és fibra sinó un 4G com si fora un mòbil.
Aleshores, analitzant la situació en la que em trobava, la solució que he trobat ha segut mitjançant un tunnel invers del servei DNS de Cloudflare fins la Raspberry Pi amb FreeBSD 15. En certa manera, puc dir adéu al Port Forwarding i fins i tot a la IP fixa perquè aquesta és una solució definitiva per a muntar-nos servidors amb routers 4G encara que estiguen en un CG-NAT.
De manera bàsica, la meua idea és:
Internet > túnel > router 4G > Raspberry Pi
Tècnicament necessitaré configurar:
Internet > HTTPS (443) > Cloudflare > Túnel > router 4G > HTTP (80) > Raspberry Pi > Nginx
Per a la navegació https (en el port 443) normalment necessitem un certificat DV/SSL però Cloudflare fa del nostre proxy i ell és qui entrega el certificat al navegador web, nosaltres ja podem tenir 2 webs o totes les que vullgues, no té un límit tècnic. Per tant no cal preocupar-nos per la gestió i actualització dels certificats DV/SSL i les nostres webs simplement aniran al port 80. El navegador mai parlarà amb la nostra Raspberry Pi, sinó amb Cloudflare.
Anem a implementar açò seguint els següents passos:
1 - Dos dominis especialment fàcils de recordar
2 - Configuració dels DNS dels dominis a Cloudflare
3 - Configuració del servidor web Nginx
4 - Configuració del túnel en la Raspberry Pi
5 - Configuració del túnel en Cloudflare
6 - Servei a FreeBSD per a que es cree el túnel a l'inici del sistema
1 - DOS DOMINIS ESPECIALMENT FÀCILS DE RECORDAR
Recentment vaig registrar al registrador de dominis www.gandi.net dos nous dominis per als meus projectes personals, dos dominis difícils d'oblidar ja que formen la paraula de manera natural :) El primer es benicass.im,el domini superior geogràfic (ccTLD) per a la Illa de Man i el segon és alcosseb.re, el domini superior geogràfic (ccTLD) per a la illa de la Reunió.
Aleshores tinc dos dominis molons ja en la meua propietat: benicass.im i alcosseb.re.
2 - CONFIGURACIÓ DELS DNS DELS DOMINIS A CLOUDFLARE
Una vegada ja tinc els dos dominis registrats, és el moment de configurar els DNS en Cloudflare, que funcionarà com el meu proxy invers privat perquè rebrà tot el tràfic web i el canalitzarà per el túnnel fins a la Raspberry Pi amb FreeBSD situada darrere del router cudy 4G.
Per a poder crear un túnnel amb Cloudflare i que ens faça de proxy de totes les peticions webs dels 2 dominis, és imprescindible configurar els DNS de Cloudflare en els 2 dominis, d'aquesta manera manarà Cloudflare i s'en farà càrreg del tràfic web.
He de dir que una de les coses que més m'agraden d'aquest projecte és el manifest de Transparència.
Doncs bé, començarem creant-nos un compte de Cloudflare des de la url https://dash.cloudflare.com/login
Afegiré el domini "benicass.im" i el domini "alcosseb.re" per a gestionar-los posteriorment en el Dashboard de la seua web. A Cloudflare he triat el plan gratuit (Free) perquè eixe pla té tot el que necessitem per a:
A - Fer servir Cloudflare DNS → gestionar els teus dominis
B - Fer Cloudflare Tunnel (Argo Tunnel/cloudflared) per exposar serveis des de darrere CG-NAT
C - Tenir certificats SSL/TLS automàtics
D - Protecció bàsica atacs DDoS i un WAF bàsic
Anirem al nostre registrador de dominis (en el meu cas és www.gandi.net des de fa molts anys) i canviarem els DNS, i en comptes de tenir els propis del registrador configurarem els DNS externs de Cloudflare. Així que ara manarà Cloudflare.
A continuació, des de la web de Cloudflare, afegirem les entrades DNS de tipo A de "benicass.im" i de "alcosseb.re" a la IPv4 192.0.2.1, que es una IP reservada per a documentació, no apunta a res real. En el camp TTL deixarem "Auto". Veurem que en el camp "proxy status" diu que esta proxificat.
I per últim, configurarem una regla (des del menu de l'esquerra Rules) i triarem "Redirect Rules", per a fer que redirigisca sempre el domini http://domini.net al subdomini www., es a dir, que si algu escriu http://alcosseb.re le reenvie, automàticament, a http://www.alcosseb.re. Açò fara una redirecció 301 (permanent) sense perdre rutes.
Per a fer-ho, farem click en l'apartat Rules i ara a "Redirect Rules". Crearem una nova regla i li ficarem de nom "redirect-root-to-www" i seleccionarem la segona opció "Custom filter expression" i ficarem:
Hostname + Equals + alcosseb.re
Hostname + Equals + benicass.im
Important, sense http, ni https, ni "/". A continuació podem fer la prova escrivint al navegador http://alcosse.bre/ieeeee, i veurem que ens redirigeix automaticament a http://www.alcosseb.re/ieeeee, encara que no existisca eixa pagina ens haura afegit el 'www'.
I la mateixa prova faré amb el segon domini, provaré a escriure http://benicass.im/ViscaValència i veurem que ens redirigeix automàticament a http://www.benicass.im/ViscaValència encara que no funcione la pàgina, aleshores la redirecció funciona perfectament :)
3 - CONFIGURACIÓ DEL SERVIDOR WEB NGINX
No cal explicar massa aquest punt perquè, personalment, ho tinc ampliament documentat ací en la meua web i hi ha moltíssima documentació a internet, però bàsicament: creem els dos sites en la configuracio d'Nginx, a FreeBSD a la ruta /usr/local/etc/nginx/sites_enabled, i ho farem amb:
$ touch /usr/local/etc/nginx/sites-enabled/benicass.im
$ touch /usr/local/etc/nginx/sites-enabled/alcosseb.re
Afegirem la configuració per al domini 'benicass.im':
server {
server_name benicass.im www.benicass.im; # Replace with your IP or hostname
root /usr/local/www/benicass.im;
index index.html index.htm;
#
location / {
try_files $uri $uri/ =404;
}
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
I la documentació per al domini 'alcosseb.re' serà:
server {
server_name alcosseb.re www.alcosseb.re; # Replace with your IP or hostname
root /usr/local/www/alcosseb.re;
index index.html index.htm;
#
location / {
try_files $uri $uri/ =404;
}
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
I ara creem un directori per a l'arrel web:
$ doas mkdir /usr/local/www/benicass.im
$ doas mkdir /usr/local/www/alcosseb.re
Ací afegirem un fitxer index.html amb algun text i avant. (Més endavant configuraré l'Nginx amb PHP 8 i Drupal, però ara de moment així està bé.)
I reiniciem Nginx i provem si funciona:
$ doas service nginx restart
Podem fer les proves en local amb lynx o elinks escrivint la IP i dominis en el fitxer /etc/hosts de FreeBSD.
4 - CONFIGURACIÓ DEL TUNNEL EN LA RASPBERRY PI
Instal·lem el programari de cloudflared en FreeBSD:
$ doas pkg install cloudflared
Comprovarem la versió:
$ cloudflared version
cloudflared version 2025.8.0 (built unknown)
Ara autentiquem la Raspberry 2 amb Cloudflare, això ens deixarà un codi que confirmarem en un navegador per a donar-li autoritzacio del tunnel:
$ cloudflared tunnel login
Això ens ha creat un certificat privat en la ruta ~/.cloudflared/
5 - CONFIGURACIÓ DEL TUNNEL EN CLOUDFLARE
Anem a crear el tunel anomenat "casa" de la seguent manera:
$ cloudflared tunnel create casa
Ara hem creat:
- un Tunnel ID
- un fitxer JSON de credencials dins del directori ~/.cloudflared/
Assignarem dominis i/o subdominis al tunel "casa" de la seguent manera:
$ cloudflared tunnel route dns casa www.alcosseb.re
2025-12-27T14:30:47Z INF Added CNAME www.alcosseb.re which will route to this tunnel tunnelID=XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX
$ cloudflared tunnel route dns casa www.benicass.im
2025-12-27T14:49:58Z INF www.benicass.im.alcosseb.re is already configured to route to your tunnel tunnelID=XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX
Açò ens crea les entrades DNS automaticament en el dashboard de la web de Cloudflare com un CNAME intern al t'unel. No exposa IPs ni necessita un registre A perque ja ho tenim ben configurat en el panel de control de Cloudflare.
Si ara anem a la configuració del domini veurem que ens ha generat una nova entrada 'www'.
En el segon domini "www.benicass.im", afegirem manualment una entrada DNS de tipo CNAME amb el nom "www" i el valor: XXXXXXXXX-XXXX-XXXX-XXXX-XXX.cfargotunnel.com (on XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX és el ID del tunnel anteriorment mencionat) i ja la tindrem proxyficada també, com el primer domini 'www.alcosseb.re'.
Ara anem a configurar el tunel. Editarem el fitxer ~/.cloudflared/config.yml
tunnel: XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
credentials-file: /joan/.cloudflared/XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX.json
#
ingress:
- hostname: www.alcosseb.re
service: http://localhost:80
#
- hostname: www.benicass.im
service: http://localhost:80
#
- service: http_status:404
Iniciem el túnel manualment amb:
$ cloudflared tunnel run casa
Quan ho executem tenim un resultat així en la terminal:
I, en obrir un navegador web, veig que ja funciona. Tinc ja les dos webs en internet!
6 - SERVEI A FREEBSD PER A QUE ES CREE EL TÚNEL A L'INICI DEL SISTEMA
Crearem un fitxer en /usr/local/etc/rc.d/ on tenim els serveis a FreeBSD:
$ doas vi /usr/local/etc/rc.d/cloudflared_tunnel
I afegirem el següent:
#!/bin/sh
#
# PROVIDE: cloudflared_tunnel
# REQUIRE: NETWORKING
# KEYWORD: shutdown
#
. /etc/rc.subr
#
name="cloudflared_tunnel"
rcvar="cloudflared_tunnel_enable"
#
# CANVI CLAU: Ara el 'command' és el daemon de FreeBSD
command="/usr/sbin/daemon"
#
# L'usuari que executa el túnel
cloudflared_tunnel_user="joan"
#
# L'arxiu on es guardarà el ID del procés
pidfile="/home/joan/.cloudflared/${name}.pid"
#
# CANVI CLAU: Posem els flags al daemon (-f per a segon pla)
# i després la ruta del binari i els seus arguments.
command_args="-f -p ${pidfile} /usr/local/bin/cloudflared --config /home/joan/.cloudflared/config.yml tunnel run casa"
#
# Necessitem això per a que el sistema sàpiga quin és el procés real a monitoritzar
procname="/usr/local/bin/cloudflared"
#
load_rc_config $name
: ${cloudflared_tunnel_enable:="NO"}
#
run_rc_command "$1"
Li donem permisos d'execució:
$ doas chmod +x /usr/local/etc/rc.d/cloudflared_tunnel
Gestionem el servei amb:
$ doas service cloudflared_tunnel start #Si el volem iniciar
$ doas service cloudflared_tunnel stop #Si el volem aturar
$ doas service cloudflared_tunnel status #Si volem saber l'estat
Escrivim en el fitxer rc.conf per a que el túnel Cloudflare s'active quan iniciem la Raspberry Pi:
$ doas sysrc cloudflared_tunnel_enable="YES"
I ja ho tenim tot, ara encara que hi haja un tall de llum temporal, la Raspberry Pi tornarà a crear el túnel i reconnectar automàticament.
CONCLUSIONS FINALS
És una meravella poder crear-me un túnel tan fàcilment i fer que el meu servidor FreeBSD es torne "invisible" a internet de manera que Cloudlfare em serveix d'escut contra atacs de col·lapse (DDoS), a més a més em fa de filtre de gent dolenta (WAF), també gestiona els certificats SSL de tots els dominis i subdominis que vullga mantenir en el servidor de manera ilimitada, i sobre tot perquè em salta el CG-NAT i no cal fer redirecció de ports ni tampoc configurar una IP a internet que refresca de tant en tant.
I com pots veure funciona molt ràpid per a ser un router 4G modest amb una Raspberry Pi 4:
- http://alcosseb.re
- http://benicass.im
Ara fins a l'infinit i més enllà... PHP, Python, Drupal i a fer funcionar tot el que vullga :)
Per acabar, una frase de Kevin Mitnick: "La seguretat és un procés, no un producte.". Amén, Kevin.







