Skip Navigation

Is it safe to open ports 80 and 443 in my home network?

Hi all, I'm running a small website off of a raspberry pi in my house. I have opened ports 80 and 443 and connected my IP to a domain. I'm pretty confident in my security for my raspberry pi (no password ssh, fail2ban, nginx. Shoutout networkchuck.). However, I am wondering if by exposing my ports to the raspberry pi, I am also exposing those same ports to other devices in my home network, for example, my PC. I'm just a bit unsure if port forwarding to an internal IP would also expose other internal IP's or if it only goes to the pi. If you are able to answer or have any other comments about my setup, I would appreciate your comment. Thanks!

38 comments
  • If you port forward to your Pi, only your Pi will be exposed. But, if your Pi gets pwned, it can in turn attack anything next to it. Safest is to isolate the Pi on it's own subnet or a DMZ if your router has the functionality.

    Of note, many home ISPs block standard server ports like 80 and 443. You might need to use non standard ports like 8080 and 8443

  • The port forward only forwards to a single device so you aren't exposing your PC (directly anyway). Sounds like you have the pi good and secured but if you wanted to add another layer you could segment it out into a DMZ or its own VLAN. That way if something did happen with it an attacker couldn't move laterally inside your network.

    Realistically though you're in good shape.

  • I would suggest signing up for a free Cloudflare account and setting up any DNS for your Pi through there, using the Cache feature.

    Once that is done, setup an automated script that will pull down Cloudflare IPs into a file (you can use a cronjob to run this daily):

     bash
        
    #!/bin/bash
    
    set -e
    
    cf_ips() {
      echo "# https://www.cloudflare.com/ips"
    
      for type in v4 v6; do
        echo "# IP$type"
        curl -sL "https://www.cloudflare.com/ips-$type/" | sed "s|^|allow |g" | sed "s|\$|;|g"
        echo
      done
    
      echo "# Generated at $(LC_ALL=C date)"
    }
    
    cf_ips > allow-cloudflare.conf
    (cf_ips && echo "deny all; # deny all remaining ips") > allow-cloudflare-only.conf
    
      

    Then in your web server config to only accept connections from Cloudflare IPs:

     conf
        
    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name example.com;
            root /var/www/html;
    
        include /etc/nginx/allow-cloudflare-only.conf;
    }
    
      

    I prefer this method over UFW/iptables block as it allows you to control the IP block per web config, so if needed, you can make exceptions by not adding the include /etc/nginx/allow-cloudflare-only.conf; into that specific site's conf file.

  • It should be safe, as it just exposes the Raspberry Pi. Make sure you've configured fail2ban to also watch the logs of all your webapps and ban people that try to brute force them (for example, if you host your own Vaultwarden instance, fail2ban should be configured to watch the Vaultwarden log for authentication failures).

    For web apps that only you need to access (i.e. they do not have to be exposed publicly), consider using a VPN to access them remotely, instead of exposing the apps publicly. Wireguard and Tailscale work well for this. Tailscale is built on top of Wireguard and makes it very easy to get up and running.

38 comments