Skip Navigation

Access home server from anywhere

Hi, I know this topic has been talked about 70 thousand times but I’m still not sure.

I have home server on an intel NUC behind the ISP router. On it I have the standard arr apps, jellyfin, pi-hole etc etc. I would like to access them through a domain rather than an IP. So I set them up in docker, behind traefik, behind authelia and behind cloudflare. I am the only one that uses it.

Now, I’m worried about the security of it all. I’ve been searching here and there and I’ve read about cf tunnels, wireguard server, vps, vlan, OPNsense etc etc. I still don’t know what would be the most secure. Should I just stay with what I have?

EDIT: I'm not behind CGNAT

81 comments
  • Yes, you can use a Cloudflare tunnel but why? Since you're into self-hosting why should you depend on some random company to tunnel your traffic when you most likely don't need it? You also have all the potential tracking, spyware, risks and "being hostage" scenarios that may come with that choice.

    The following assumes your use case is a simple home server for "standard arr apps, jellyfin, pi-hole" for personal usage that sits inside your network and your objetive is to be able to access those services. If you're instead trying to host a game server / few services for friends (that doesn't really need to be "inside" your home network) there's a more complete comment with other security considerations and recommendations here.

    Your basic requirements are:

    • Some kind of domain / subdomain payed or free;
    • Preferably Home ISP that has provides public IP addresses - no CGNAT BS;
    • Ideally a static IP at home, but you can do just fine with a dynamic DNS service such as https://freedns.afraid.org/.

    Quick setup guide and checklist:

    1. Create your subdomain for the dynamic DNS service https://freedns.afraid.org/ and install the daemon on the server - will update your domain with your dynamic IP when it changes;
    2. List what ports you need to access remote;
    3. Setup Wireguard VPN on the server. There's also this nice UI that can be used to do most of the setup and create client config files;
    4. For the VPN use custom ports with 5 digits - something like 23901 (up to 65535) to make your service harder to find;
    5. Configure your ISP router to assign a static local IP to the server and port forward the VPN port to the server IP;
    6. Only expose absolutely required services (the VPN port in this case) to the Internet. Any service the server provides, SSH, configuration interfaces and whatnot can accessed through the WireGuard VPN;
    7. In the server consider setting up nftables / iptables / another firewall 10 minute guide;
    8. Configure nftables to only allow traffic coming from public IP addresses (IPs outside your home network IP / VPN range) to the Wireguard port - this will protect your server if by some mistake the router starts forwarding more traffic from the internet to the server than it should;
    9. Configure nftables to restrict what countries are allowed to access your server. Most likely you only need to allow incoming connection from your country (https://wiki.nftables.org/wiki-nftables/index.php/GeoIP_matching).

    Since you're only allowing access to your services through the VPN and you've heavily restricted access to the VPN port you'll be safe. Just a side note, don't be afraid to expose the Wireguard port because if someone tried to connect and they don't authenticate with the right key the server will silently drop the packets.

    Now if your ISP doesn't provide you with a public IP / port forwarding abilities you may want to read this in order to find why you should avoid Cloudflare and how to setup and alternative / more private solution.

  • As said in the thread, you need some kind of tunnel that stays up and doesn't need to be fixed if the internet goes down.

    Wireguard, or if wanting super easy setup, Tailscale version of Wireguard is great for this. Now you have a private IP address in your VPN network to your home server, that stays up and answers to HTTP. Next thing you need is a cheap VPS somewhere with a public IP address. When that is running, and is in the Wireguard network so you can access your home server from the VPS, you need a Nginx proxy in the public server. Either do it by hand, or use a service such as the Nginx Proxy Manager to handle the proxy setup.

    How it basically works is you register a domain name (A, CNAME) to the public VPS service, then with Nginx you setup that anything coming in to the domain X should be proxied to the VPN IP address Y and port Z. Now you can add HTTPS to this domain and get a Let's Encrypt certificate for it. You can, again, do this manually with Nginx, or let Nginx Proxy Manager handle it for you.

    Finally. Stay safe. If you really open services to public internet from your home, be very sure to have all the latest updates and use strong passwords in all of them. Additionally, you can use the home services directly from the Wireguard/Tailscale network by accessing them using the private IP addresses. Your computer should just be in the same network with them.

  • I'd say to start with CF tunnels unless you need non-web based applications. Cloudflare tunnels require you to have a domain, though.

    It has the added benefit that you have network monitoring, logging and some filtering for security that they do on top and you get to manage everything from their web interface.

    be warned that the first time can be a bit confusing, but since it's done using their web interface it's easier than if you have a problem making wireguard work.

    1. Create a tunnel with a public hostname that will be the url to access that service. During the creation of the hostname specify you want it protected by L7 application firewall.
    2. Create a new self-hosted application in cloudflare application section and for starters use the default login email and in rules specify the list of emails that are allowed to login

    you should now be able to access your application from anywhere.

    Alternatively, if you have a DNS server in your home network you can add a private IP range to your tunnel. Let's say 192.168.0.0/24. Then when you connect with their pseudo-VPN (cloudflare warp or cloudflare ONE) you can directly use your home network's ip address from that device. If you tell your device to use a local DNS server that resolves your internal services, you'll be able to connect to them that way.

  • First off, don't expose anything that doesn't need exposed. If your the only one using it you could use a VPN or ssh.

    Second off, make sure you isolate everything with firewalls. Your reverse proxy should only have access to each service and each service should only have access to the reverse proxy. You should also block non essential ports.

    For the services themselves, make sure you use strong passwords and keep them updated. For docker you can use watchtower to automatically pull and deploy software.

81 comments