<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.5l-labs.com/self-hosted-iot</id>
    <title>5L Labs Blog</title>
    <updated>2025-12-01T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.5l-labs.com/self-hosted-iot"/>
    <subtitle>5L Labs Blog</subtitle>
    <icon>https://www.5l-labs.com/img/favicon.svg</icon>
    <entry>
        <title type="html"><![CDATA[NetworkManager and VPN Tunneling]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates"/>
        <updated>2025-12-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A technical guide to configuring NetworkManager, static IPs, and WireGuard VPN tunneling on Debian Bookworm/Trixie for private home networking.]]></summary>
        <content type="html"><![CDATA[<p>With the cold and the early darkness, it's time for more TV than less. With that in mind, I needed to fix a few things that "broke" over the last few months. This entry is a technical "brain dump" to document the NetworkManager and WireGuard configurations required to maintain a private, multi-site network.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-architecture-vlan-trunking">Future Architecture: VLAN Trunking<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#future-architecture-vlan-trunking" class="hash-link" aria-label="Direct link to Future Architecture: VLAN Trunking" title="Direct link to Future Architecture: VLAN Trunking" translate="no">​</a></h2>
<p>The goal is to move to an <strong>802.1Q trunked VLAN</strong> on the Raspberry Pi, allowing a single ethernet cable to carry multiple isolated networks. The Pi would then act as a central DHCP and VPN gateway for each, providing a clean and scalable home networking backbone.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="networkmanager-on-debian-trixie">NetworkManager on Debian Trixie<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#networkmanager-on-debian-trixie" class="hash-link" aria-label="Direct link to NetworkManager on Debian Trixie" title="Direct link to NetworkManager on Debian Trixie" translate="no">​</a></h2>
<p>I thought it was Debian Bookworm, but Trixie finally forced me into a shotgun wedding with <strong>NetworkManager (NM)</strong>. While I initially resisted, the unified CLI (<code>nmcli</code>) for managing Wi-Fi, ethernet, and VPN interfaces is actually quite powerful once you get past the initial learning curve.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="static-ip-configuration-with-nmcli">Static IP Configuration with nmcli<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#static-ip-configuration-with-nmcli" class="hash-link" aria-label="Direct link to Static IP Configuration with nmcli" title="Direct link to Static IP Configuration with nmcli" translate="no">​</a></h3>
<p>To set up a reliable static IP for a local gateway:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ nmcli con add con-name my-con-em1 ifname em1 type ethernet \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ip4 192.168.100.100/24 gw4 192.168.100.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ nmcli con mod my-con-em1 ipv4.dns "1.1.1.1 8.8.8.8"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ nmcli con up my-con-em1</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dhcp-and-network-forwarding">DHCP and Network Forwarding<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#dhcp-and-network-forwarding" class="hash-link" aria-label="Direct link to DHCP and Network Forwarding" title="Direct link to DHCP and Network Forwarding" translate="no">​</a></h3>
<p>A nice feature of the Ubiquiti ecosystem is that it can act as a meshed AP, allowing a Raspberry Pi to serve as the DHCP server and gateway for a specific VLAN. This requires enabling IPv4 forwarding:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sysctl -w net.ipv4.ip_forward=1</span><br></span></code></pre></div></div>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-other-problems">The Other Problem(s)<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#the-other-problems" class="hash-link" aria-label="Direct link to The Other Problem(s)" title="Direct link to The Other Problem(s)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stale-wireguard-connections">Stale WireGuard Connections<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#stale-wireguard-connections" class="hash-link" aria-label="Direct link to Stale WireGuard Connections" title="Direct link to Stale WireGuard Connections" translate="no">​</a></h3>
<p>When a remote endpoint changes its public IP, the WireGuard tunnel can become stale. While I've been manual about restarts so far, a <a href="https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html" target="_blank" rel="noopener noreferrer" class="">Systemd Timer</a> combined with a simple health check script (pinging the remote gateway) could easily automate this recovery workflow.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="wireguard-configuration-the-gateway-entrance">WireGuard Configuration: The Gateway Entrance<a href="https://www.5l-labs.com/self-hosted-iot/network-manager-forced-updates#wireguard-configuration-the-gateway-entrance" class="hash-link" aria-label="Direct link to WireGuard Configuration: The Gateway Entrance" title="Direct link to WireGuard Configuration: The Gateway Entrance" translate="no">​</a></h3>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Interface]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Address = 10.253.120.7/32</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ListenPort = 21001</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PrivateKey = &lt;local-private-key&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Peer]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Endpoint = &lt;gateway-domain&gt;:21001</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PublicKey = &lt;remote-public-key&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">AllowedIPs = 0.0.0.0/0, ::/0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PersistentKeepalive = 25</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="homekit" term="homekit"/>
        <category label="homebridge" term="homebridge"/>
        <category label="pihole" term="pihole"/>
        <category label="ubiquiti" term="ubiquiti"/>
        <category label="network" term="network"/>
        <category label="dnsmasq" term="dnsmasq"/>
        <category label="nmcli" term="nmcli"/>
        <category label="wireguard" term="wireguard"/>
        <category label="debian" term="debian"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Overlord - Home Network Kill Switch]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/updated-network-controls</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls"/>
        <updated>2025-10-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Updates on the Overlord Network Kill Switch project, supporting Pi-hole v6 and Ubiquiti 9.4.19 for simple, one-tap parental controls in HomeKit.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-exactly-zero-users-or-maybe-just-me-and-my-family">For exactly zero-users (or maybe just me and my family),<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#for-exactly-zero-users-or-maybe-just-me-and-my-family" class="hash-link" aria-label="Direct link to For exactly zero-users (or maybe just me and my family)," title="Direct link to For exactly zero-users (or maybe just me and my family)," translate="no">​</a></h2>
<p>I've spent some time firming up the <strong>Overlord</strong> Home Network Kill Switch project due to some breaking changes in Pi-hole v6 and Ubiquiti Control 9.4.19. It’s a home project that uses iOS HomeKit buttons, backed by a Ubiquiti and Pi-hole setup, to simplify parental controls. I suspect others might appreciate a one-tap solution for managing network access, especially one that's easy enough for less technical family members to use.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-i-built-this">Why I Built This<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#why-i-built-this" class="hash-link" aria-label="Direct link to Why I Built This" title="Direct link to Why I Built This" translate="no">​</a></h2>
<p>The UniFi app is powerful, but I found it took too many clicks to quickly block the internet or specific services like YouTube. This project creates simple "on/off" switches in Apple HomeKit, saving me from needing to open the app or connect to a VPN for simple tasks. For those using Home Assistant, integration should also be straightforward.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-does">What It Does<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#what-it-does" class="hash-link" aria-label="Direct link to What It Does" title="Direct link to What It Does" translate="no">​</a></h2>
<p>I built a small <strong>FastAPI</strong> application that works with HomeKit (via MQTT and Node-RED) to:</p>
<ul>
<li class="">Enable or disable predefined firewall rules on your Ubiquiti network.</li>
<li class="">Block or unblock specific devices by their MAC address.</li>
<li class="">Allow non-technical users to create schedules and automations for these actions directly in the Home app.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-get-it">Where to Get It<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#where-to-get-it" class="hash-link" aria-label="Direct link to Where to Get It" title="Direct link to Where to Get It" translate="no">​</a></h2>
<p>You can find all the specifics on the GitHub repo:
<a href="https://github.com/5L-Labs/overlord-network-kill-switch" target="_blank" rel="noopener noreferrer" class="">https://github.com/5L-Labs/overlord-network-kill-switch</a></p>
<p>To get started quickly with <strong>Podman</strong>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">podman run -d --replace --name=overlord-dns -p 19000:19000 --env-file=./etc/envfile ghcr.io/5l-labs/overlord-network-kill-switch:2.5</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-was-hard-about-this">What was hard about this?<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#what-was-hard-about-this" class="hash-link" aria-label="Direct link to What was hard about this?" title="Direct link to What was hard about this?" translate="no">​</a></h2>
<p>Testing, testing, testing. Time management was also a challenge—this took far longer than planned for the limited time I had.</p>
<ul>
<li class="">Not DOSing the Ubiquiti Controller while trying to validate code paths.</li>
<li class="">Ensuring Pi-hole v6 API calls were working as expected.</li>
<li class="">Adding in edge-case/race-condition checks.</li>
<li class="">Making it proper, releasable code that someone else might actually use.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="did-ai-help">Did AI Help?<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#did-ai-help" class="hash-link" aria-label="Direct link to Did AI Help?" title="Direct link to Did AI Help?" translate="no">​</a></h2>
<p>No, not really. It did some scaffolding and documentation, but the core logic was still human-led. I am currently using <a href="https://jules.google.com/session" target="_blank" rel="noopener noreferrer" class="">Jules</a> to keep ripping out dead code paths and maintain the FastAPI backend, which has significantly lowered the "toil" of this side project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recent-changes">Recent Changes<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#recent-changes" class="hash-link" aria-label="Direct link to Recent Changes" title="Direct link to Recent Changes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Pi-hole v6 API Integration</strong>: The project now uses the new <code>pihole6api</code> library to interact with the Pi-hole v6 API. This allows for more reliable and efficient management of blocklists.</li>
<li class=""><strong>Ubiquiti Control 9.4.19 Support</strong>: The project has been updated to support the latest version of Ubiquiti Control.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works-the-background">How It Works (The "Background")<a href="https://www.5l-labs.com/self-hosted-iot/updated-network-controls#how-it-works-the-background" class="hash-link" aria-label="Direct link to How It Works (The &quot;Background&quot;)" title="Direct link to How It Works (The &quot;Background&quot;)" translate="no">​</a></h2>
<p>I use the firewall rules on my Ubiquiti gear to enforce blocks on devices (like school-issued laptops) that are configured to bypass my local Pi-hole DNS. This setup allows for creating network-level blocks for common services, providing a more robust solution for locked-down devices. It was a fun project, and it gives my family an easier way to manage internet access as my kids get older.</p>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="homekit" term="homekit"/>
        <category label="homebridge" term="homebridge"/>
        <category label="pihole" term="pihole"/>
        <category label="ubiquiti" term="ubiquiti"/>
        <category label="network" term="network"/>
        <category label="kill-switch" term="kill-switch"/>
        <category label="fastapi" term="fastapi"/>
        <category label="podman" term="podman"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Almost Bricking a v3 Wyze Cam (and back again...)]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze-camv3</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze-camv3"/>
        <updated>2025-05-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A personal account of flashing the custom Thingino firmware onto a Wyze Cam v3 to achieve local-only control and escape the cloud.]]></summary>
        <content type="html"><![CDATA[<p>Wyze integrates and resells IoT cameras and devices for low capital cost, but they have been under increasing pressure to generate monthly recurring revenue. This shift has led to more aggressive cloud-only features and forced firmware updates.</p>
<ul>
<li class="">In addition, your data goes to the Wyze Cloud Infrastructure on AWS, where security incidents have happened—most notably the Feb 2024 event where users could inadvertently see into others' homes. I'm not judging, but if you value your privacy, it's time to take control of your hardware.</li>
<li class="">I'm not opposed to paying for good software, but I'm already paying Apple and Google for their ecosystems. Do I really need to pay Wyze just to see my own front porch?</li>
<li class=""><a href="https://www.scrypted.app/" target="_blank" rel="noopener noreferrer" class="">Scrypted</a> and <a href="https://frigate.video/" target="_blank" rel="noopener noreferrer" class="">Frigate</a> are excellent open-source options for private camera management, streaming over the local LAN via <strong>ONVIF</strong>.</li>
<li class="">These tools work with the Wyze API, but Wyze's recent firmware changes have made local-only access increasingly difficult, forcing my hand to replace the firmware entirely.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nat-at-the-router-fool-didnt-work-why">NAT at the Router, Fool (didn't work... why?)<a href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze-camv3#nat-at-the-router-fool-didnt-work-why" class="hash-link" aria-label="Direct link to NAT at the Router, Fool (didn't work... why?)" title="Direct link to NAT at the Router, Fool (didn't work... why?)" translate="no">​</a></h2>
<p>Initially, I tried to block Wyze's cloud heartbeats at the firewall level. This failed because the stock Wyze firmware is designed to "fail closed" or enter a reboot loop if it cannot reach its AWS-based authentication servers. The only way to truly own the hardware is a complete firmware replacement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-thingino-adventure">The Thingino Adventure<a href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze-camv3#the-thingino-adventure" class="hash-link" aria-label="Direct link to The Thingino Adventure" title="Direct link to The Thingino Adventure" translate="no">​</a></h3>
<p>Flashing the <a href="https://thingino.com/" target="_blank" rel="noopener noreferrer" class="">Thingino</a> firmware onto a Wyze Cam v3 is not for the faint of heart. The device uses an <strong>Ingenic T31</strong> processor, and the "almost bricking" experience happened while using the <a href="https://github.com/themactep/thingino-firmware/wiki/Ingenic-USB-Cloner" target="_blank" rel="noopener noreferrer" class="">Ingenic USB Cloner</a> tool.</p>
<p>If you don't get the driver and the "vibe" of the bootloader sequence just right, the device remains in a dead state. It took three attempts and a dedicated Windows VM to finally get the firmware to take. But once it did? Total local control, no cloud heartbeats, and a beautiful RTSP stream directly into Scrypted.</p>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="homekit" term="homekit"/>
        <category label="wyze" term="wyze"/>
        <category label="scrypted" term="scrypted"/>
        <category label="quartz" term="quartz"/>
        <category label="thingino" term="thingino"/>
        <category label="ingenic" term="ingenic"/>
        <category label="cloner" term="cloner"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Wyzely Saying Goodbye to Wyze!]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze"/>
        <updated>2025-05-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Transitioning away from Wyze's cloud-dependent cameras to a local-only setup using Scrypted, ONVIF, and HomeKit for better privacy and control.]]></summary>
        <content type="html"><![CDATA[<p>Transitioning away from Wyze's cloud-dependent firmware toward local-only protocols is a major step in building a private home. The goal is to eliminate the need for external servers for live feeds and motion alerts, ensuring that my data stays under my roof.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conversion-strategy">Conversion Strategy<a href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze#conversion-strategy" class="hash-link" aria-label="Direct link to Conversion Strategy" title="Direct link to Conversion Strategy" translate="no">​</a></h3>
<ul>
<li class=""><strong>Battery Cam Protocol</strong>: Moving to cameras that support local RTSP/ONVIF streams instead of proprietary battery-saving protocols that require cloud-based "wake-ups" to function.</li>
</ul>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><ul>
<li class=""><strong>NOTE</strong> battery-backed cameras have not been cracked yet.</li>
</ul></div></div>
<ul>
<li class=""><strong>Legacy Support</strong>: Repurposing older hardware with <a href="https://thingino.com/" target="_blank" rel="noopener noreferrer" class="">Thingino</a> or <a href="https://www.scrypted.app/" target="_blank" rel="noopener noreferrer" class="">Scrypted</a> to bypass the manufacturer's cloud limits and proprietary app requirements.</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-role-of-the-scrypted-hub">The Role of the Scrypted Hub<a href="https://www.5l-labs.com/self-hosted-iot/getting-off-of-wyze#the-role-of-the-scrypted-hub" class="hash-link" aria-label="Direct link to The Role of the Scrypted Hub" title="Direct link to The Role of the Scrypted Hub" translate="no">​</a></h3>
<p>The "Hub" in the diagram represents <a href="https://www.scrypted.app/" target="_blank" rel="noopener noreferrer" class="">Scrypted</a>, which acts as a bridge between my local IP cameras and HomeKit. It handles the local heavy lifting of motion detection and recording (HKSV), ensuring zero-latency access within the Apple ecosystem without any data ever leaving the house. This setup allows me to use any high-quality IP camera as if it were a native, high-privacy HomeKit device.</p>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="homekit" term="homekit"/>
        <category label="wyze" term="wyze"/>
        <category label="scrypted" term="scrypted"/>
        <category label="onvif" term="onvif"/>
        <category label="privacy" term="privacy"/>
        <category label="local-only" term="local-only"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[My Private Home]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/what-is-my-private-home</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/what-is-my-private-home"/>
        <updated>2025-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Defining the architecture of a private home network across multiple locations, focusing on Ubiquity hardware, traffic routing, and privacy-first IoT.]]></summary>
        <content type="html"><![CDATA[<p>This post defines the architecture of a private home network that spans multiple locations. By using <strong>Site-to-Site VPNs</strong> (specifically WireGuard) and rigorous packet inspection with <a href="https://www.wireshark.org/" target="_blank" rel="noopener noreferrer" class="">Wireshark</a>, I can ensure that sensitive IoT traffic remains entirely within my controlled environment.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware-and-privacy-strategy">Hardware and Privacy Strategy<a href="https://www.5l-labs.com/self-hosted-iot/what-is-my-private-home#hardware-and-privacy-strategy" class="hash-link" aria-label="Direct link to Hardware and Privacy Strategy" title="Direct link to Hardware and Privacy Strategy" translate="no">​</a></h3>
<p>All routers are currently <strong>Ubiquity</strong>. While they offer a great balance of performance and ease of use, I maintain a strict egress-filtering policy to block any "phone-home" telemetry to Ubiquity's servers. Should any issues with unsolicited data sharing be discovered, these will be replaced with more privacy-focused alternatives like OPNsense or pfSense.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-components">Key Components<a href="https://www.5l-labs.com/self-hosted-iot/what-is-my-private-home#key-components" class="hash-link" aria-label="Direct link to Key Components" title="Direct link to Key Components" translate="no">​</a></h3>
<ul>
<li class=""><strong>Local Mesh</strong>: A cluster of Raspberry Pi devices running Home Assistant and Homebridge to bridge Zigbee and Tasmota devices into HomeKit.</li>
<li class=""><strong>Traffic Routing</strong>: Custom firewall rules ensure that IoT devices (VLAN 40) are completely isolated from the main network and have zero internet access unless explicitly whitelisted for firmware updates.</li>
<li class=""><strong>Verification</strong>: Periodic Wireshark captures verify that no unauthorized traffic is leaking from the "Private Home" to external cloud providers.</li>
</ul>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="homekit" term="homekit"/>
        <category label="home-assistant" term="home-assistant"/>
        <category label="homebridge" term="homebridge"/>
        <category label="network-security" term="network-security"/>
        <category label="zigbee" term="zigbee"/>
        <category label="tasmota" term="tasmota"/>
        <category label="ubiquity" term="ubiquity"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[School Laptop - When You Don't Have Control]]></title>
        <id>https://www.5l-labs.com/self-hosted-iot/school-chromebook-bypassing-content-filters</id>
        <link href="https://www.5l-labs.com/self-hosted-iot/school-chromebook-bypassing-content-filters"/>
        <updated>2024-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tackling the challenges of managing school-issued Chromebooks that bypass home network controls using TLS 1.2 fallback and enterprise-managed proxies.]]></summary>
        <content type="html"><![CDATA[<p>School-issued Chromebooks present unique challenges for parents trying to manage screen time and content access at home. In this post, I'll share how I tackled a persistent problem: a school Chromebook that bypassed our home network controls and allowed unrestricted video streaming despite our best efforts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-school-devices-with-their-own-rules">The Problem: School Devices with Their Own Rules<a href="https://www.5l-labs.com/self-hosted-iot/school-chromebook-bypassing-content-filters#the-problem-school-devices-with-their-own-rules" class="hash-link" aria-label="Direct link to The Problem: School Devices with Their Own Rules" title="Direct link to The Problem: School Devices with Their Own Rules" translate="no">​</a></h2>
<p>Many schools now provide Chromebooks for students to use both in class and at home. While these devices offer valuable educational benefits, they come with an unexpected challenge for parents trying to maintain healthy digital boundaries at home.</p>
<p>School-issued Chromebooks are typically configured with enterprise management tools that enforce the school's policies—including their internet filtering system. Products like Lightspeed filter proxy initial connection requests through school servers, effectively bypassing any local DNS or content filtering you might have configured on your home network.</p>
<p>To complicate matters further, tech-savvy students quickly discover proxy websites and workarounds that circumvent even the school's filtering systems. In our household, this meant homework time was regularly derailed by YouTube videos, despite our network-level content restrictions that worked perfectly on other devices.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="regaining-control-falling-back-on-tls-12">Regaining Control: Falling Back on TLS 1.2<a href="https://www.5l-labs.com/self-hosted-iot/school-chromebook-bypassing-content-filters#regaining-control-falling-back-on-tls-12" class="hash-link" aria-label="Direct link to Regaining Control: Falling Back on TLS 1.2" title="Direct link to Regaining Control: Falling Back on TLS 1.2" translate="no">​</a></h3>
<p>One of the most effective, if blunt, ways to regain control is by "falling back on TLS 1.2" at the firewall level. By disabling TLS 1.3 for specific school-managed MAC addresses, we can force the device's traffic through a local inspection point (like a MITM proxy with a root CA) that the school's enterprise policy might otherwise bypass.</p>
<p>The key takeaway is that you cannot rely on DNS alone for managed devices. You must use a combination of MAC-based IP static assignments and Layer 7 firewall rules to identify and shunt this traffic into a restricted VLAN. This enforces your home rules over the school's proxy, ensuring that homework time remains productive and focused.</p>]]></content>
        <author>
            <name>Nick Lange</name>
            <uri>https://github.com/NickJLange</uri>
        </author>
        <category label="k12-tech" term="k12-tech"/>
        <category label="network-security" term="network-security"/>
        <category label="parental-controls" term="parental-controls"/>
        <category label="chromebooks" term="chromebooks"/>
        <category label="content-filtering" term="content-filtering"/>
        <category label="tls-1-2" term="tls-1-2"/>
    </entry>
</feed>