<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Networking on Journals of a Naïve Technologist</title><link>https://blog.naivete.win/categories/networking/</link><description>Recent content in Networking on Journals of a Naïve Technologist</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>2025 Naivete Webdev Studios</copyright><lastBuildDate>Fri, 14 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.naivete.win/categories/networking/index.xml" rel="self" type="application/rss+xml"/><item><title>Reverse Proxies 101: A Homelab Example</title><link>https://blog.naivete.win/posts/2026/08/14/reverse-proxies-101-a-homelab-example/</link><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.naivete.win/posts/2026/08/14/reverse-proxies-101-a-homelab-example/</guid><description>&lt;h1 id="reverse-proxies-101"&gt;Reverse Proxies 101&#10;&lt;/h1&gt;&lt;h2 id="what-is-a-reverse-proxy"&gt;What is a Reverse Proxy?&#10;&lt;/h2&gt;&lt;p&gt;A network with a subnet mask of &lt;code&gt;/24&lt;/code&gt; has 254 usable hosts, each host has A reverse proxy sits between clients (browsers, apps) and backend servers. So do you have to open up &lt;code&gt;16,645,890&lt;/code&gt; ports on your network? Is that the magic upper limit of how many services you can host on a single IP?&lt;/p&gt;&#10;&lt;p&gt;No, because you have reverse proxies. A reverse proxy is a service that sits at the edge of your network with ports 80/443 open. When a client requests a service via networking, the client connects to the reverse proxy instead of the application. The reverse proxy decides which backend server should handle the request and forwards the appropriate request and as for the client, it has no qualms as 80/443 ports are the standard ports for web traffic.&lt;/p&gt;&#10;&lt;h2 id="why-use-a-reverse-proxy"&gt;Why Use a Reverse Proxy?&#10;&lt;/h2&gt;&lt;h3 id="multiple-services-on-one-ip"&gt;Multiple Services on One IP&#10;&lt;/h3&gt;&lt;p&gt;Most home internet connections give you one public IP. With a reverse proxy, you can run many services and route based on hostname:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloud.example.com -&amp;gt; Nextcloud&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jelly.example.com -&amp;gt; Jellyfin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git.example.com -&amp;gt; Gitea&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;All on the same IP, same ports (80, 443).&lt;/p&gt;&#10;&lt;h3 id="ssltls-termination"&gt;SSL/TLS Termination&#10;&lt;/h3&gt;&lt;p&gt;Instead of configuring SSL on each service, the proxy handles it once:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;One certificate to manage&lt;/li&gt;&#10;&lt;li&gt;One place to configure HTTPS settings&lt;/li&gt;&#10;&lt;li&gt;Centralized security policies&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="security-benefits"&gt;Security Benefits&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;Backend services are not directly exposed&lt;/li&gt;&#10;&lt;li&gt;Can add authentication, rate limiting, IP filtering&lt;/li&gt;&#10;&lt;li&gt;Hides internal network structure&lt;/li&gt;&#10;&lt;li&gt;Logs and monitoring in one place&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="my-setup-traefik-with-docker"&gt;My Setup: Traefik with Docker&#10;&lt;/h2&gt;&lt;p&gt;I use Traefik because of its excellent Docker integration - its killer feature is that each container can be addressed via labels.&lt;/p&gt;&#10;&lt;h3 id="basic-architecture"&gt;Basic Architecture&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Internet&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Router (ports 80, 443 forwarded)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Host&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traefik (published ports 80, 443)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── service1 (Nextcloud)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── service2 (Gitea)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── service3 (Jellyfin)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── service4 (Portainer)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion&#10;&lt;/h2&gt;&lt;p&gt;Many applications in your homelab are fighting for the singular port 80/443 - a reverse proxy transforms a homelab from a bunch of services on random ports to a polished, production-like setup with HTTPS and proper routing.&lt;/p&gt;&#10;</description></item></channel></rss>