{ config, pkgs, ... }: { ######################################## # AdGuardHome (DNS / DNS-Filter) ######################################## services.adguardhome = { enable = true; host = "127.0.0.1"; port = 3000; # Web-UI }; ######################################## # Caddy (Reverse Proxy) ######################################## services.caddy = { enable = true; email = "daniel@lindenfelser.de"; virtualHosts = { "files.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.6:8080 ''; }; "cloud.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.6:8080 ''; }; "dns.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 127.0.0.1:3000 ''; }; "smart.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.30:8123 ''; }; "git.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.6:3000 ''; }; # konnektor-web — Frontend "konnektor.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.49:8082 ''; }; # konnektor-api Frontend REST "api.konnektor.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.49:8080 ''; }; # Zitadel OIDC # Wichtig: `header_up Host {host}` — Zitadel routet anhand des Host- # Headers; ohne das sieht es den Upstream-Container-Hostname und failt. "auth.konnektor.home.lindenfelser.de" = { extraConfig = '' reverse_proxy 10.202.82.49:8081 { header_up Host {host} } ''; }; # Mailpit Web UI — NUR aus dem LAN 10.202.82.0/24 erreichbar. # Alle anderen IPs bekommen 403, ohne dass Mailpit jemals angerufen wird. "mailpit.konnektor.home.lindenfelser.de" = { extraConfig = '' @lan client_ip 10.202.82.0/24 handle @lan { reverse_proxy 10.202.82.49:8025 } handle { respond "forbidden — mailpit ist nur aus dem LAN 10.202.82.0/24 erreichbar" 403 } ''; }; }; }; ######################################## # Firewall ######################################## networking.firewall.enable = true; networking.firewall.allowedTCPPorts = [ 22 # SSH 80 # HTTP (Caddy) 443 # HTTPS (Caddy) 2222 # External SSH to Gitea ]; networking.firewall.allowedUDPPorts = [ 53 # DNS (AdGuardHome) ]; ######################################## # NAT / Port Forwarding ######################################## networking.nat = { enable = true; externalInterface = "ens18"; # Hairpin NAT for LAN clients hitting gateway:2222 so replies go back via gateway extraCommands = '' iptables -t nat -A POSTROUTING -p tcp -d 10.202.82.6 --dport 2222 -j MASQUERADE ''; forwardPorts = [ { proto = "tcp"; sourcePort = 2222; destination = "10.202.82.6:2222"; } ]; }; }