<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Devi D.</title>
    <description>The latest articles on DEV Community by Devi D. (@apitala0091).</description>
    <link>https://dev.to/apitala0091</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4069103%2F8aa5ad3d-bf52-4251-95db-309cb975b914.png</url>
      <title>DEV Community: Devi D.</title>
      <link>https://dev.to/apitala0091</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apitala0091"/>
    <language>en</language>
    <item>
      <title>Hosting from Home Without Exposing Your IP (4 Real Methods, 2026)</title>
      <dc:creator>Devi D.</dc:creator>
      <pubDate>Mon, 31 Aug 2026 15:01:22 +0000</pubDate>
      <link>https://dev.to/apitala0091/hosting-from-home-without-exposing-your-ip-4-real-methods-2026-583</link>
      <guid>https://dev.to/apitala0091/hosting-from-home-without-exposing-your-ip-4-real-methods-2026-583</guid>
      <description>&lt;h1&gt;
  
  
  How to Expose Your Home Server to the Surface Web (Without Opening Ports or Using Tor)
&lt;/h1&gt;

&lt;p&gt;If you've asked "can I use Tor to publish my home server as a regular .com website," you've already found the right problem — you want your home server reachable from the internet, without exposing your home IP, without dealing with your ISP's NAT or CGNAT, and without paying for a VPS.&lt;/p&gt;

&lt;p&gt;The answer isn't Tor. Tor exit nodes are for anonymous browsing, not for hosting. What you actually want is a tunnel — a persistent outbound connection from your server to a public endpoint, which forwards traffic back in. Your server initiates the connection, so no inbound ports need to be open, and your home IP stays hidden.&lt;/p&gt;

&lt;p&gt;This article covers four approaches, from the simplest to the most controlled, with real configuration examples for each.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core problem: why your home server isn't reachable
&lt;/h2&gt;

&lt;p&gt;Before picking a solution, it helps to understand exactly what's blocking you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT (Network Address Translation)&lt;/strong&gt; — your router has one public IP, and all devices on your home network share it. Incoming connections have no way to know which internal device to reach unless you manually configure port forwarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CGNAT (Carrier-Grade NAT)&lt;/strong&gt; — many ISPs, especially on mobile and some residential plans, put you behind a second layer of NAT at the ISP level. Even if you configure port forwarding on your router, you still don't have a routable public IP. There's nothing to forward to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic IP&lt;/strong&gt; — even if you have a real public IP, it changes. You can work around this with dynamic DNS (DDNS), but it's another moving part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Port 80/443 blocking&lt;/strong&gt; — some ISPs block inbound connections on ports 80 and 443 for residential accounts. You can change the port, but then visitors need to type &lt;code&gt;yoursite.com:8080&lt;/code&gt;, which isn't practical.&lt;/p&gt;

&lt;p&gt;Tunnels solve all of these simultaneously. Your server makes an outbound connection to a relay node. Traffic destined for your domain hits the relay, gets forwarded through the tunnel to your server, your server responds, and the response goes back the same way. No inbound ports. No public IP requirement. No CGNAT problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 1: Cloudflare Tunnel (easiest, free)
&lt;/h2&gt;

&lt;p&gt;Cloudflare Tunnel (formerly Argo Tunnel) is the lowest-friction option. It's free, requires no open ports, and handles HTTPS automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; A domain whose DNS is managed by Cloudflare (free plan works).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install &lt;code&gt;cloudflared&lt;/code&gt; on your server:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb &lt;span class="nt"&gt;-o&lt;/span&gt; cloudflared.deb
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; cloudflared.deb

&lt;span class="c"&gt;# Or via package manager&lt;/span&gt;
wget &lt;span class="nt"&gt;-q&lt;/span&gt; https://pkg.cloudflare.com/cloudflare-main.gpg &lt;span class="nt"&gt;-O&lt;/span&gt; /usr/share/keyrings/cloudflare-main.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/cloudflared.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Authenticate and create a tunnel:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel login
&lt;span class="c"&gt;# Opens browser for Cloudflare auth&lt;/span&gt;

cloudflared tunnel create my-home-server
&lt;span class="c"&gt;# Creates tunnel, outputs a UUID like: a1b2c3d4-...&lt;/span&gt;

cloudflared tunnel route dns my-home-server yoursite.com
&lt;span class="c"&gt;# Creates CNAME record in Cloudflare DNS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configure the tunnel&lt;/strong&gt; (&lt;code&gt;~/.cloudflared/config.yml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;tunnel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;a1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/span&gt;
&lt;span class="na"&gt;credentials-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/user/.cloudflared/a1b2c3d4-xxxx.json&lt;/span&gt;

&lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yoursite.com&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:80&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.yoursite.com&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:80&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http_status:404&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Run as a system service:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;cloudflared service &lt;span class="nb"&gt;install
sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;cloudflared
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your site is now live at &lt;code&gt;yoursite.com&lt;/code&gt;. Cloudflare handles TLS termination, so your local server can run plain HTTP on port 80 internally while visitors get HTTPS externally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt; Cloudflare sees all your traffic (they're the relay). For most personal projects this is fine. For privacy-sensitive deployments, see options 3 and 4.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 2: Nginx + a lightweight VPS as relay
&lt;/h2&gt;

&lt;p&gt;If you want more control — or if Cloudflare's terms don't suit your use case — a small VPS acting as a relay is the next step. You run an SSH tunnel or WireGuard between your VPS and home server, then use Nginx on the VPS to proxy traffic to your home server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visitor → VPS (yoursite.com, public IP) → SSH/WireGuard tunnel → Home server (nginx/apache)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On the VPS — set up a persistent reverse SSH tunnel:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your home server initiates an outbound SSH connection to the VPS, forwarding a port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On home server — forward local port 8080 to VPS port 9000&lt;/span&gt;
ssh &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 9000:localhost:8080 user@your-vps-ip

&lt;span class="c"&gt;# Make it persistent with autossh&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;autossh
autossh &lt;span class="nt"&gt;-M&lt;/span&gt; 0 &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 9000:localhost:8080 user@your-vps-ip &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"ServerAliveInterval 30"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"ServerAliveCountMax 3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Systemd service for autossh&lt;/strong&gt; (&lt;code&gt;/etc/systemd/system/tunnel.service&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Reverse SSH tunnel to VPS&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;youruser&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/autossh -M 0 -N &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;-R 9000:localhost:8080 user@your-vps-ip &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;-o "ServerAliveInterval 30" &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;-o "ServerAliveCountMax 3" &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;-i /home/youruser/.ssh/id_rsa&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;tunnel
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start tunnel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On the VPS — Nginx reverse proxy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yoursite.com&lt;/span&gt; &lt;span class="s"&gt;www.yoursite.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yoursite.com&lt;/span&gt; &lt;span class="s"&gt;www.yoursite.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/yoursite.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/yoursite.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:9000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Get a free TLS cert on the VPS:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;certbot python3-certbot-nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; yoursite.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.yoursite.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the VPS itself, you want something minimal — the relay only needs to forward traffic, not run your application. A 1-core/512MB instance is sufficient. &lt;a href="https://vpso.cc/#plans" rel="noopener noreferrer"&gt;vpso.cc&lt;/a&gt; has VPS plans that work for this role; the key requirement is a static public IP and reliable uptime, which is standard across most providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 3: WireGuard tunnel (faster, more private)
&lt;/h2&gt;

&lt;p&gt;SSH tunneling works but has overhead. WireGuard is a modern VPN protocol that's faster, more efficient, and cleaner to configure. Same architecture as Option 2, but the tunnel is WireGuard instead of SSH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the VPS — install and configure WireGuard:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;wireguard

&lt;span class="c"&gt;# Generate keys on VPS&lt;/span&gt;
wg genkey | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/wireguard/privatekey | wg pubkey &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/publickey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VPS WireGuard config&lt;/strong&gt; (&lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Interface]&lt;/span&gt;
&lt;span class="py"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10.0.0.1/24&lt;/span&gt;
&lt;span class="py"&gt;ListenPort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;51820&lt;/span&gt;
&lt;span class="py"&gt;PrivateKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;VPS_PRIVATE_KEY&amp;gt;&lt;/span&gt;

&lt;span class="nn"&gt;[Peer]&lt;/span&gt;
&lt;span class="py"&gt;PublicKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;HOME_SERVER_PUBLIC_KEY&amp;gt;&lt;/span&gt;
&lt;span class="py"&gt;AllowedIPs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10.0.0.2/32&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Home server WireGuard config&lt;/strong&gt; (&lt;code&gt;/etc/wireguard/wg0.conf&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Interface]&lt;/span&gt;
&lt;span class="py"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10.0.0.2/24&lt;/span&gt;
&lt;span class="py"&gt;PrivateKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;HOME_SERVER_PRIVATE_KEY&amp;gt;&lt;/span&gt;

&lt;span class="nn"&gt;[Peer]&lt;/span&gt;
&lt;span class="py"&gt;PublicKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;VPS_PUBLIC_KEY&amp;gt;&lt;/span&gt;
&lt;span class="py"&gt;Endpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;your-vps-ip:51820&lt;/span&gt;
&lt;span class="py"&gt;AllowedIPs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10.0.0.1/32&lt;/span&gt;
&lt;span class="py"&gt;PersistentKeepalive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable on both machines&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;wg-quick@wg0
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start wg-quick@wg0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update your Nginx config on the VPS to proxy to &lt;code&gt;10.0.0.2:80&lt;/code&gt; (your home server's WireGuard IP) instead of &lt;code&gt;localhost:9000&lt;/code&gt;. Traffic flows through the encrypted WireGuard tunnel rather than an SSH connection.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 4: ngrok (easiest for testing, not production)
&lt;/h2&gt;

&lt;p&gt;ngrok is useful for development and testing — exposing a local server quickly without any configuration. Not recommended for production because the free tier gives you a random subdomain that changes on restart, and paid tiers are relatively expensive for persistent use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://ngrok-agent.s3.amazonaws.com/ngrok.asc | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/trusted.gpg.d/ngrok.asc &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://ngrok-agent.s3.amazonaws.com buster main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/ngrok.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

&lt;span class="c"&gt;# Authenticate&lt;/span&gt;
ngrok config add-authtoken YOUR_TOKEN

&lt;span class="c"&gt;# Expose local port 80&lt;/span&gt;
ngrok http 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a public HTTPS URL immediately. Good for showing someone a local project, not for running a real site.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the right option
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Privacy&lt;/th&gt;
&lt;th&gt;Setup complexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Tunnel&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Low (CF sees traffic)&lt;/td&gt;
&lt;td&gt;Cloudflare-level&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH reverse tunnel + VPS&lt;/td&gt;
&lt;td&gt;VPS cost&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WireGuard + VPS&lt;/td&gt;
&lt;td&gt;VPS cost&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Best&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ngrok&lt;/td&gt;
&lt;td&gt;Free/paid&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most home server setups: &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; if you don't mind Cloudflare seeing your traffic and you want zero-maintenance. &lt;strong&gt;WireGuard + VPS&lt;/strong&gt; if you want full control and better privacy — the VPS cost is typically $3–6/month for a relay-only instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  What about Tor?
&lt;/h2&gt;

&lt;p&gt;Since this comes up: you can run a Tor hidden service and also expose it to the surface web via a Tor2Web proxy, but this is not recommended for a production site. The latency is significant (300ms+ added per hop), Tor2Web proxies are run by third parties you don't control, and the setup gives you the downsides of both systems without the full benefits of either.&lt;/p&gt;

&lt;p&gt;The tunnel approaches above are faster, more reliable, and easier to maintain. Tor makes sense for anonymity-critical deployments. For a regular home-hosted website, it's the wrong layer to solve this at.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security considerations
&lt;/h2&gt;

&lt;p&gt;A few things worth addressing before you go live:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting on the VPS&lt;/strong&gt; (Nginx):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add to nginx.conf http block&lt;/span&gt;
&lt;span class="k"&gt;limit_req_zone&lt;/span&gt; &lt;span class="nv"&gt;$binary_remote_addr&lt;/span&gt; &lt;span class="s"&gt;zone=one:10m&lt;/span&gt; &lt;span class="s"&gt;rate=10r/s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Add to server block&lt;/span&gt;
&lt;span class="k"&gt;limit_req&lt;/span&gt; &lt;span class="s"&gt;zone=one&lt;/span&gt; &lt;span class="s"&gt;burst=20&lt;/span&gt; &lt;span class="s"&gt;nodelay&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fail2ban on the VPS&lt;/strong&gt; to block repeated bad requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fail2ban
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Keep your home server's SSH port closed to the VPS inbound&lt;/strong&gt; — the tunnel is initiated from your home server outbound, so no inbound SSH from the VPS to home is needed. On your VPS, allow only ports 80, 443, and the WireGuard port (51820):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 51820/udp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your home IP remains hidden as long as your application doesn't leak it (check headers, error pages, and any user-generated content that might reference internal IPs).&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>selfhosted</category>
      <category>networking</category>
      <category>homeserver</category>
    </item>
    <item>
      <title>How I moved from shared hosting to a private VPS — and what I learned about who actually knows you're there</title>
      <dc:creator>Devi D.</dc:creator>
      <pubDate>Sat, 08 Aug 2026 17:59:57 +0000</pubDate>
      <link>https://dev.to/apitala0091/how-i-moved-from-shared-hosting-to-a-private-vps-and-what-i-learned-about-who-actually-knows-37kc</link>
      <guid>https://dev.to/apitala0091/how-i-moved-from-shared-hosting-to-a-private-vps-and-what-i-learned-about-who-actually-knows-37kc</guid>
      <description>&lt;p&gt;For a long time I didn't think much about hosting. Picked a shared plan, paid monthly, forgot about it.&lt;/p&gt;

&lt;p&gt;Then one day I started reading about what hosting providers actually store. Not in a paranoid way. Just curious. And I didn't like what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shared hosting problem
&lt;/h2&gt;

&lt;p&gt;Shared hosting is fine for most things. But the moment you start caring about who has access to your data — it gets uncomfortable fast.&lt;/p&gt;

&lt;p&gt;Your IP, your email, your payment details, your traffic patterns. All sitting in someone's database. Most providers have a privacy policy. Most of them also comply with requests without telling you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm not doing anything illegal. I just don't see why a hosting company needs to know more about me than my ISP already does.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Moving to a VPS
&lt;/h2&gt;

&lt;p&gt;VPS was the obvious next step. More control, root access, you configure what you want.&lt;/p&gt;

&lt;p&gt;But I quickly realized the VPS provider still knows who you are. You sign up with an email. You pay through a payment processor — which means a third party also knows. The server is yours but the account database isn't.&lt;/p&gt;

&lt;p&gt;I started comparing providers specifically on this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Payment&lt;/th&gt;
&lt;th&gt;Account DB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IncogNET&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AlexHost&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1984 Hosting&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FlokiNET&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Processor&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPSO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Direct on-chain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I was skeptical about &lt;a href="https://vpso.cc" rel="noopener noreferrer"&gt;VPSO&lt;/a&gt; at first. Tested it with a small package before committing. Deploy was under two minutes. And there's genuinely nothing attached to me on their end — because there's no account to attach anything to. Your order ID is your identity. Nothing else.&lt;/p&gt;

&lt;p&gt;The downside: costs more than a standard VPS. You're paying for the architecture, not just the compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually learned
&lt;/h2&gt;

&lt;p&gt;The question isn't just "does this provider have a good privacy policy."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do they have that could be handed over if someone asked?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A provider with great policies but an account database still has your email, your IP at signup, your payment history. Policy doesn't delete data. Architecture does.&lt;/p&gt;

&lt;p&gt;Order ID systems, direct on-chain payments, no email signup — these aren't marketing features. They're structural differences in what exists to be found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is this for everyone?
&lt;/h2&gt;

&lt;p&gt;No. If you're running a business site and need a support ticket with your name on it — this isn't for you.&lt;/p&gt;

&lt;p&gt;But if you're self-hosting projects where you'd rather not leave a trail, it's worth understanding the difference between a provider with good policies and a provider with good architecture.&lt;/p&gt;

&lt;p&gt;Those are not the same thing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Providers mentioned: IncogNET, AlexHost, 1984 Hosting, FlokiNET, &lt;a href="https://vpso.cc" rel="noopener noreferrer"&gt;VPSO&lt;/a&gt;. Tested most of these. VPSO linked because it's the one with direct wallet payment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>selfhosted</category>
      <category>devops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
