Hey all,
I’m setting up a homeserver and trying to figure out the best way to access it remotely. I’ve been looking at different solutions, but I’m a little stuck.
I’ve been looking at VPNs, but it feels weird, to route everything through my home IP when I’m also trying to use a commercial VPN for privacy / to combat services fingerprinting me based on my IP.
I’m currently considering a reverse proxy setup with an authentication provider like authentik or authelia, but as far as I understand, that wouldn’t work well with accessing services through an app on my mobile device (like for jellyfin music for example.) I did think about just opening up the ports and using a DDNS with a reverse proxy, but is’nt that like a big security risk?
Keep in mind I am no network admin, but I don’t have anything against learning if someone can point me in the right direction.
Also I heard some people say that on proxmox you should use unprivileged containers instead of vms for your services, does that hold up?
Any recommendations for tools or approaches?
I went a different path than the VPN route that seems popular in the other comments…
I use a reverse proxy (caddy) with wildcard SSL (so all my hostnames aren’t in the public cert registry) plus port knocking. So normally no outside IPs are allowed to access my internal services, but I can knock and then access anything for a while. Working well so far.
How’d you setup the port knocking? Is that something caddy does?
I’m using haproxy and was thinking of trying the same thing… not sure if haproxy supports it though, or whether I have to do something else …?
I do the port knocking at the firewall level (it’s a pretty simple nft chain setup). Caddy isn’t involved at all. I was thinking about integrating that into my caddy config using something akin to an operator, but I haven’t needed any extra functionality yet.
Thanks for asking! I have the same problem, so eager to read the comments. Could you share what you choose in the end and why?
Tailscale’s free offering goes a long way.
Well, yes I looked at tailscale too, but that would prevent me from using my normal commercial VPN, which I would still like to use. The way I understand it, if I routed my entire network through tailscale to my server, it would essentially make all my internet traffic exit at my server. So, everything would still appear to be coming from my home IP address. I’m trying to get the best of 2 worlds: using the VPN to hide my IP from services that i visit and my ISP, and a secure connection to my home server.
I don’t have an exit node in my tailnet. Through the magic of routing, tailnet stays in tailnet and vpn stays in vpn. I got extra fancy and used gluetun to handle docker vpn traffic, but only for some ports of some containers.
I have all my services spun up in docker containers, which makes it easier to pick and choose which services use Tailscale and which use a VPN. I guess I haven’t yet been put in a position where I wanted one to use both.
I’m trying to get the best of 2 worlds: using the VPN to hide my IP from services that i visit and my ISP, and a secure connection to my home server.
How about Cloudflare Tunnels/Zero Trust? The caveat being that you have to own a domain that you can change the nameservers to the ones Cloudflare assigns you. You can purchase a domain from Cloudflare, but I think a lot of people get one from NamesCheap or PorkBun. I purchased on for less than $5 USD. With Cloudflare Tunnels/Zero Trust, you don’t have to open ports, fiddle with NAT, or any of that. You install it on your server and it punches a hole in to allow communication.
Some people like Cloudflare, some people don’t. Personally, I’ve never had any issues except for a very brief downtime a while back.
Well, yes I looked at tailscale too, but that would prevent me from using my normal commercial VPN
You can split your devices traffic, Tailscale traffic through Tailscale, everything else through your masking VPN.
I’m trying to get the best of 2 worlds: using the VPN to hide my IP from services that i visit and my ISP, and a secure connection to my home server.
For that, what I would do is put the masking VPN (like PIA or whatever) on your router (not all routers can do this) and then have Tailscale on the devices or individual services. In theory, everything would still be able to talk to each other (even if your mobile device is not behind the router), but everything that is behind the router would enter and exit their traffic wherever you have the masking VPN set to. Downside of doing this is that EVERYTHING that is behind that router is also behind that VPN which can cause problems with some services, like banking and streaming.
It would also mean that the only way you could host a public service is to have an external VPS acting as a reverse proxy. Cloudflare might also have something that could work around this setup, but I’m not familiar with their offerings.
This setup also doesn’t mask your traffic (origin and destination) from your mobile provider (just your home ISP), but that is a harder nut to crack as they can see, real time, where you are physically, and depending on your device, may have deeper device access anyways. I’m thinking prepaid phones and phones bought from the carrier (at least here in the US) or if your carrier has “asked” you to install an app to manage your account. My assumption is that my mobile provider can see anything I do while I have my phone or tablet with me, and just work around that.
You might want to ask in !privacy@lemmy.ml and !privacy@lemmy.world, as this is more up their alley.
Wouldn’t a MullvadVPN exit node from Tailscale suit your need perfectly? I’m a noob though.
I’ve been frp to create a reverse proxy between my NAS at home and a DigitalOcean droplet. Been using it for over a year now, and not had any issues.
Personally, i would use VPN, Pihole for Local-DNS Records and a simple Local Reverse Proxy to address my Network-Services. I wouldnt open anything from my Homelab to the Internet.
NGINX Proxy Manager and DuckDNS.
Get DuckDNS set up first.
Then go to DuckDNS.org and register a domain.
Then go into NGINX proxy manager.
It’s pretty straightforward, click “add proxy host”, then type the domain from duckdns (I like to do a different subdomain for each service, ie: calibre.mydomain.duckdns.org, homeassistant.mydomain.duckdns.org, etc.) and point it at your container with the service you want to access remotely.
You’ll want to enable let’s encrypt. But other than that the defaults should be fine.
Don’t do this just use tailscale, it’s 100% easier and very fool proof
What’s wrong with this approach?
I feel that beginners should avoid reverse proxying until they’ve learned more about networking security. Judging by OPs post and consideration of blindly opening ports to wan they seem to have a low level of knowledge about this stuff so a mesh vpn is much safer for them and their network
CGNAT sends its regards.
(Although if you have IPv6 access you might get around this… But even in 2026 you will face issues going only this way).
I am behind GCNAT, and my ISP doesn’t do IPv6. I have a free tier VPS from Oracle that uses wireguard to tunnel packets to my home server.
Ah, if only Oracle could take at least one of my multiple credit/debit cards.
I’ve been using this setup for years, then one day just installed caddyserver. No certbot, no boilerplate nginx config etc.
I was still using nginx for internal services but then replaced it with “fabio lb” because it works well with consul.
I was so happy do discover it that I want to share it with everyone ¯_(ツ)_/¯.
Thank you for your attention on this matter.
I’ve been looking at VPNs, but it feels weird, to route everything through my home IP
You don’t have to route all traffic through the VPN. Only traffic for your home network.
For the unprivileged container thing, containers tend to be lighter on resources than VMs at the cost of a little isolation (they share the same kernel as proxmox which could have security implications).
The ability for lxc containers to run unprivileged with all the restrictions that entails alleviates a bit of that security risk.
Both options are generally considered pretty secure but bugs/vulnerabilities could break isolation in either case. The only real 100% safe isolation is bare metal.
I tend to run containers unless I have a really good reason to need a VM, and run unprivileged unless I have a really really good reason not to.
I’ll recommend netbird as its entirely running on your server, is free, and I found it way easier to set up compared to Tailscale/Headscale
So is this like a Tailscale alternative and not a way to expose your services?
Correct. Its just a mesh VPN
Are the free limits suitable for light media streaming by a few users? I’m currently running a simple setup with Caddy reverse proxy and port knocking, but my ISP doesn’t do static IP and they change my address every few months.
The free version is mainly just a number of user and device limit. Although the relaying service might be limited as well, but that should only matter if both of your clients have strict NAT, otherwise the Wireguard tunnels gets directly connected and no traffic goes through Netbirds managed servers.
You can also self-host the control plane with pretty much no limitations, and I believe you no longer need SSO (which increased the complexity a lot for homelab setups).
I think this may be a your milage may vary thing. I only personally use netbird for remote server management, as I barely consume anything other than streamed music remotely. I host netbird community edition on my server in a VM so the streaming quality isn’t dependent on any tier of service purchased from the company
Depends I just have a proxy and open port 443. Its not wide open but open enough that others can use it. I geo block have IP lists filter through it and suricata. Or use a VPN if others don’t need access.
Its not wide open but open enough that others can use it
How does that work? Are you saying you are filtering with Suricata? Curious as in my mind a port is either on or off. I am always ready to be schooled.
a firewall can be used to filter incoming traffic by its properties. most consumer home routers don’t expose the firewall settings
Your mileage may vary, as it’s a project that doesn’t look to be actively worked on anymore, but selfhosted-gateway is a simple wireguard docker setup that’s relatively easy to set up. It spins up the relevant proxies and tunnel, Doesn’t cost anything, nor is there any signups etc… all you need is a VPS, a domain name and a home machine.
I am using wireguard for this purpose. My router supports that. It’s a very easy setup and works fine in every is case I encountered except for android car. You do not expose anything to the outside. It’s kind of like logging in to your home network.
I heard you need to exclude Android auto in the WireGuard settings, then it should work.
The reason is that the car communicates via IP with your phone. But when all phone traffic is routed through your home, it can not reach the car.
Oh thanks. I knew the reason for the issue but had not thought of looking for a solution. Well I thought there was none.
Personally, I use headscale (self-hosted tailscale) that is open to the internet. Then my phone and all other devices use tailscale clients to connect to that. All my other services are accessed through the tailscale magic DNS service.
Nothing except headscale is open to the internet, and I can access anything I need on the server and other devices. It also doesn’t just route All traffic through my server, only the stuff to other tailscale nodes.
Then just recently I’ve been using Nginx proxy manager and my DNS to make nicer names instead of memorizing a dozen ports for random services I host :p
My Ubiquity Dream Machine has Wireguard integrated. So it’s literally just a few clicks to spin up a server. I use it in combination with a port forward on my FritzBox and a dyn ip using https://dynv6.com/ and a domain i had laying around anyways.
Regarding Wireguard: Wireguards (imho) best feature is split tunneling. You can decide which ips or subnets to route through the tunnel. See
AllowedIPs.As a default it says something like
AllowedIPs = 0.0.0.0/0Which means “just route everything through me”.
However you could allow your subnets only. Like this I use my private and my business vpn at the same time.
AllowedIPs = 10.0.0.0/24,10.0.1.0/24,10.0.2.0/24,10.0.3.0/24You mentioned, that you have not a lot experience with networking, so your subnet may look like that. Just check your local ip and replace the last digit with
0/24AllowedIPs = 192.168.2.0/24If you’re running insecure services, you can restrict them to be accessible by vpn. I have a mix of internet accessible and vpn accessible services using the tailscale nginx plugin.
If you want to send all your traffic over a vpn, you will either need to route all your traffic through your own vpn or use some sort of multiplexed vpn. tailscale can do this with mullvad, but it’s not yet possible with headscale.









