I set up Nginx Proxy Manager just for general local security, but I’m behind CGNAT so I use ZeroTier (which I’m happy with). I have a Pi with NPM and Adguard plugged into my router, and a bunch of other Docker containers and other self-hosted programs on my main machine. I set up my domain with cloudflare, so mydomain.com points to my local npm address, 192.168.x.x, used the wildcard letsencrypt ssl so i can access my stuff from jellyfin.mydomain.com, adguard.mydomain.com, etc, then set up NPM to point each subdomain to it’s correct service, so 192.168.x.x:8096 => jellyfin.mydomain.com. I also setup adguard with wildcard DNS rewrites.
However, I used wireshark to check if all was well, but the traffic between my main machine and my pi is unencrypted. This makes sense in retrospect, but kind defeats the point of what I was going for, since I have not-so tech savvy family members, and having the password for stuff like guacamole just floating around the LAN in plain text is kind of off-putting. I figured I’ll just centralise the more important services on the pi since it doesn’t have the http issue, or maybe expose the docker socket of my main machine with tls enabled? If there’s another way of doing things, or if I’ve missed something, I’d be grateful for any advice, but I’d rather not have to deal with self-signed certificates.
It’s worth it. At some point you might enconter a service that requires SSL to work even on LAN. I treat them like pipes. The fewer pipes i need to pipe traffic through, the easier it is.
I use split DNS to access services locally, over the internet and via VPN. Everything is behind a Traefik proxy that uses wildcard certs. It enforces SSL for everything and I have just one pipe to think about.
maybe this a dumb point, but you can hide it behind reverse proxy all you want but you will also need to FW off the actual service from the rest of the network, as otherwise it’s still accessible via 192.168.x.x
I do something similar:
Incoming traffic -–[https traffic]—> reverse proxy -–[https traffic]—> real services (emby, etc).
The traffic from my browser to the reverse proxy is encrypted with TLS certs from letsencrypt. Whenever possible (it usually is), I configure the real services to expose HTTPS endpoints even if they are just with self-signed certs. That way the proxy-to-service traffic is also encrypted.
Everything in my LAN is TLS-protected. Primarily because of convenience (no ‘unsafe’ warnings), unification (all I do everywhere is TLS). Also for learning purposes (I like challenges). Security is on the last place here (but is still important to me).
Probably your main threat is not people, but malware. Especially since they are not tech-savy. Remember how $35M of crypto assets were recently stolen: in the beginning it was a LastPass engineer who did not update his Plex instance.
So wait, if you say you got LE certs for mydomain.com why not activate HTTPS in NPM? If you set up the NPM config for jellyfin.mydomain.com with “Force SSL” then you should always have an encrypted connection.