> TAKE IT BACK STEP 04 / 06
root@takeitback:~/guide/04-isp$ cat readme.md
STEP 04

When your ISP blocks you

Home internet is sold to consumers, not participants. Blocked ports, shared addresses, and no-server clauses are business decisions — and all of them can be routed around without fighting your provider.

DIFFICULTYBeginner
TIME20–30 min
COST$0
REPLACESPort-forwarding · static IP fees

The two doors a website needs

A web server listens on numbered ports — think of them as doors into your machine, each one agreed in advance so browsers know where to knock. Hosting a homepage needs exactly two:

Caddy uses both: it takes the certificate challenge on 80, redirects visitors from 80 to 443 automatically, and serves everything encrypted on 443. That's why step 03 has you forward both, not just the one you think of as "the web".

// why these numbersThey're conventions, not requirements — a browser assumes 80 for http:// and 443 for https:// so nobody has to type them. You can serve on port 8000 like the quick test does, but then every visitor has to append :8000 to the address, which no real site expects.

What they actually do to you

Before reaching for a fix, work out which problem you have — they need different answers.

// which do you have?Compare the address your router reports on its WAN interface with what curl ifconfig.me returns. If they differ, you're behind CGNAT and port-forwarding will never work — skip straight to Tailscale.

Tailscale: stop asking permission

Tailscale builds an encrypted private network between your own devices. Each machine gets a stable address that works from anywhere, and connections are established outbound — so blocked inbound ports, CGNAT, and dynamic addresses all simply stop mattering. Nothing is exposed to the public internet, and there is no port to forward.

It's free for personal use, and built on WireGuard, which is open source. The coordination service is proprietary; if that bothers you, Headscale is a self-hosted replacement for it.

Install it on the box

root@box:~$ curl -fsSL https://tailscale.com/install.sh | sh
root@box:~$ sudo tailscale up
# prints a login URL — open it, sign in, done

The installer detects your distribution and adds the right repository, so updates arrive through apt like everything else.

you@mac:~$ brew install tailscale
you@mac:~$ sudo tailscaled install-system-daemon
you@mac:~$ sudo tailscale up

There's also a Mac App Store version with a menu-bar UI, which is easier if this Mac is your everyday machine rather than a server.

Tailscale has a proper native Windows client — this is one of the few places you don't need WSL2. Install it on the Windows host itself:

PS> winget install tailscale.tailscale
# then sign in via the system-tray icon

If your server is running inside WSL2, install Tailscale on the Windows host rather than inside WSL — the host handles the networking for both.

Add your other devices

Install Tailscale on your laptop and phone from tailscale.com/download and sign in with the same account. They appear on the same private network automatically. From then on your server is reachable at a stable name — http://arbiter — whether you're at home, at work, or on mobile data.

check what's on your network root@box:~$ tailscale status 100.x.y.z arbiter linux - 100.x.y.a laptop macOS active

Serve your site over real HTTPS

This is where it beats port-forwarding outright. Tailscale issues genuine, publicly-trusted certificates for a *.ts.net hostname — no browser warnings, no domain purchase, and the machine stays unreachable from the open internet.

expose your local web server inside the tailnet root@box:~$ sudo tailscale serve --bg 80 # now: https://arbiter.your-tailnet.ts.net # valid cert, private network, nothing port-forwarded

Point it at whatever is already serving locally — Caddy on port 80 from step 03, or a test server on 8000. The certificate is fetched and renewed automatically.

When you want it genuinely public

Everything above keeps the site private to your devices. To publish it to the world despite a hostile ISP, you have a few options:

// tailscale funnelThe same tool, one step further: sudo tailscale funnel --bg 80 makes that HTTPS URL reachable by anyone, still with no open ports. The simplest way to publish from a blocked connection.

What about the DNS problem?

If you do have unblocked ports but a changing address, you don't need any of the above — just a dynamic DNS client that updates your record when the IP moves. Providers like No-IP and DuckDNS are free, and Caddy will then fetch certificates normally.

debian/ubuntu root@box:~$ sudo apt install ddclient # configure /etc/ddclient.conf with your provider + key, # then verify it once in the foreground: root@box:~$ sudo ddclient -daemon=0 -debug -verbose -noquiet
// keys, not passwordsUse a provider's scoped DDNS key rather than your account password where possible. If the box is ever compromised, that key updates one DNS record — it doesn't hand over your whole account.

Before you move on

With the network problem solved, the next rung is the one that depends on it most — mail.