fix(caddy): *arr stack and qBittorrent are LAN-only at the edge

A missing Porkbun record was never the gate: Caddy issues one certificate per
name and every one is in public CT logs, so the *arr hostnames were discoverable
and the edge accepted them. Each of the five vhosts now carries a remote_ip
source gate (LAN proxies through, everything else gets 404) - the posture the
Sonarr comment already claimed. AGENTS.md records the LAN-gate shape as the
required form of internal-only, and Caddy.md records why DNS secrecy is fiction.
This commit is contained in:
Frank committed 2026-11-04 13:45:25 -08:00
1 parent 52d6da4f49
commit b5173033b6
3 files changed
+56 -9

No files matched your search

+42 -7
View File
@@ -303,14 +303,31 @@ jelly.franksdank.cloud {
}
# --- *arr Stack (exempt by construction: own auth) ---
# --- *arr Stack + qBittorrent: LAN-ONLY at the edge (2026-11-04) -----------
# Frank's law: these never leave the home boxes. DNS secrecy is NOT a gate —
# Caddy issues one certificate per name and every one is in public CT logs
# (crt.sh lists prowlarr/radarr/lidarr/readarr/qbittorrent.franksdank.cloud),
# so a stranger can send the Host. The gate is the source address: a LAN client
# proxies through, anything off-LAN gets 404. `remote_ip` reads the real client
# address because the router DNATs the forward (no proxy hop in between).
prowlarr.franksdank.cloud {
reverse_proxy 192.168.0.112:9696
@lan remote_ip 127.0.0.1/32 ::1/128 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12
handle @lan {
reverse_proxy 192.168.0.112:9696
}
handle {
respond 404
}
}
radarr.franksdank.cloud {
reverse_proxy 192.168.0.112:7878
@lan remote_ip 127.0.0.1/32 ::1/128 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12
handle @lan {
reverse_proxy 192.168.0.112:7878
}
handle {
respond 404
}
}
# --- Sonarr: internal-only by construction (retired 2026-09-04) -----------
@@ -321,15 +338,33 @@ radarr.franksdank.cloud {
# zero-auth UI to the internet via manual DNS — retired.
lidarr.franksdank.cloud {
reverse_proxy 192.168.0.112:8686
@lan remote_ip 127.0.0.1/32 ::1/128 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12
handle @lan {
reverse_proxy 192.168.0.112:8686
}
handle {
respond 404
}
}
readarr.franksdank.cloud {
reverse_proxy 192.168.0.112:8787
@lan remote_ip 127.0.0.1/32 ::1/128 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12
handle @lan {
reverse_proxy 192.168.0.112:8787
}
handle {
respond 404
}
}
qbittorrent.franksdank.cloud {
reverse_proxy 192.168.0.112:8080
@lan remote_ip 127.0.0.1/32 ::1/128 192.168.0.0/16 10.0.0.0/8 172.16.0.0/12
handle @lan {
reverse_proxy 192.168.0.112:8080
}
handle {
respond 404
}
}
# --- Internal listener: auth decision layer ---------------------------------