Part 4 — The Battle Against CGNAT
There are moments in self-hosting where everything suddenly becomes very real.
For me, that moment was realizing my ISP had quietly placed me behind CGNAT.
At first glance, everything looked normal.
The DDNS updater reported a public IP.
DNS records updated successfully.
The internet appeared reachable.
Except one tiny detail:
My router’s WAN address began with:
10.x.x.x
That was the giveaway.
Because despite appearances, the homeserver was not truly reachable from the internet.
The ISP had effectively placed multiple customers behind a shared public address.
This led to one of the more satisfying support emails I have ever written:
“Could you please provide a public IPv4 address not behind CGNAT?”
To my surprise, the answer arrived quickly.
And suddenly:
Everything changed.
DNS records now pointed to an actually reachable public IP.
The homeserver became publicly addressable.
And the project crossed another invisible threshold:
It was no longer merely self-hosted.
It was internet-facing.
That realization immediately triggered a new wave of concerns:
security
reverse proxies
HTTPS
attack surfaces
port forwarding
infrastructure ownership
This was also the moment I decided against relying heavily on Cloudflare tunnels and third-party routing.
Not because Cloudflare is bad.
But because the entire philosophy behind the project increasingly revolved around ownership and control.
If I was going to build this ecosystem properly, I wanted:
my domain
my DNS
my routing
my certificates
my infrastructure
That decision led directly into the most educational part of the entire journey:
Reverse proxies.
And, eventually:
The Great nginx vs Caddy War.