<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DHCP | Antoine Weill--Duflos</title>
    <link>https://antoine.weill-duflos.fr/en/tag/dhcp/</link>
      <atom:link href="https://antoine.weill-duflos.fr/en/tag/dhcp/index.xml" rel="self" type="application/rss+xml" />
    <description>DHCP</description>
    <generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 11 Jun 2026 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://antoine.weill-duflos.fr/media/icon_hu_d686267daab28486.png</url>
      <title>DHCP</title>
      <link>https://antoine.weill-duflos.fr/en/tag/dhcp/</link>
    </image>
    
    <item>
      <title>So You&#39;ve Decided to Become Your Home&#39;s IT Department</title>
      <link>https://antoine.weill-duflos.fr/en/post/home-it-department/</link>
      <pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoine.weill-duflos.fr/en/post/home-it-department/</guid>
      <description>&lt;p&gt;Nobody hired me. There was no interview, no offer letter, no salary negotiation. One day I installed a NAS, and somewhere between the third Docker container and the first VLAN, I had silently become the Head of IT of a small but extremely demanding organization: my home.&lt;/p&gt;
&lt;p&gt;The job comes with everything a real IT department has, except the parts that make it survivable. There is a helpdesk (it&amp;rsquo;s me), a security operations center (also me), a change advisory board (me, talking to myself in the shower), and an escalation path (me, but more stressed). There is also a user base with a zero-tolerance SLA, whose entire ticketing system consists of one sentence: &amp;ldquo;the WiFi doesn&amp;rsquo;t work.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Today I want to share two recent incidents from this prestigious career. Both are entirely self-inflicted. Both taught me something. Neither was the WiFi&amp;rsquo;s fault, although you can guess what the tickets said.&lt;/p&gt;
&lt;h2 id=&#34;incident-1-my-security-system-arrested-my-security-system&#34;&gt;Incident 1: My security system arrested my security system&lt;/h2&gt;
&lt;p&gt;I run &lt;a href=&#34;https://frigate.video/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Frigate&lt;/a&gt; as my NVR, with a handful of Tapo cameras streaming RTSP over a dedicated camera VLAN. I&amp;rsquo;ve &lt;a href=&#34;https://antoine.weill-duflos.fr/en/post/frigate/&#34;&gt;written about this setup before&lt;/a&gt;, it works great. The whole stack is deployed via &lt;a href=&#34;https://antoine.weill-duflos.fr/en/post/komodo/&#34;&gt;Komodo&lt;/a&gt;, my GitOps control plane, so updating a service is a one-click &amp;ldquo;pull and restart.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;On the firewall side, my OPNsense box runs &lt;strong&gt;CrowdSec&lt;/strong&gt;, an intrusion prevention system that watches traffic and bans IPs that behave suspiciously. It does an excellent job of dispatching the endless parade of bots knocking on the WAN side, and it acts as a nice layer of protection for my self-hosted websites. I was very proud of it. Remember that, it matters for what comes next.&lt;/p&gt;
&lt;p&gt;One evening, I open Frigate and every single camera says &lt;strong&gt;&amp;ldquo;No frames received.&amp;rdquo;&lt;/strong&gt; All of them. At the same time.&lt;/p&gt;
&lt;p&gt;Now, one camera down is a camera problem. All cameras down is a &lt;em&gt;me&lt;/em&gt; problem. So I started digging, in the order any seasoned home IT professional would: blame the cameras, blame the switch, blame the NAS, blame Frigate, restart things at random, and only then, look at actual evidence.&lt;/p&gt;
&lt;p&gt;The evidence was in the OPNsense firewall logs. There it was, a rule quietly dropping hundreds of connection attempts from my NAS toward the cameras on port 554, the RTSP port. The rule&amp;rsquo;s name? &lt;strong&gt;&amp;ldquo;CrowdSec (IPv4) out.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is what had happened, in the dry language of a post-mortem:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Komodo did a routine pull-and-restart of the Frigate stack.&lt;/li&gt;
&lt;li&gt;On startup, Frigate&amp;rsquo;s ffmpeg processes all tried to reconnect to every camera at once, and retried aggressively when the streams weren&amp;rsquo;t instantly back. Roughly 770 connection attempts to port 554 in a short burst.&lt;/li&gt;
&lt;li&gt;CrowdSec looked at this flood of connection attempts and concluded, quite reasonably, that an attack was in progress.&lt;/li&gt;
&lt;li&gt;CrowdSec banned the cameras. Not the machine doing the hammering: the machines being hammered. It looked at a mugging and arrested the victims.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My intrusion prevention system had decided my security cameras were the threat and thrown them in jail. The cameras had done nothing. They were sitting quietly on their VLAN, minding their own business, when my NVR started knocking on their door a few hundred times a minute. The guard had handcuffed the witnesses.&lt;/p&gt;
&lt;p&gt;The fix took one line on the firewall, once per camera:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cscli decisions delete --ip &amp;lt;camera IP&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;followed by the step I should have done on day one: whitelisting my own LAN subnets so CrowdSec focuses its zeal on the actual internet, where the actual attackers are.&lt;/p&gt;
&lt;p&gt;In a real company, this is the moment where the security team and the infrastructure team have a tense meeting with a slide titled &amp;ldquo;Lessons Learned.&amp;rdquo; In my company, both teams are me, so I just sighed in two different tones.&lt;/p&gt;
&lt;h3 id=&#34;epilogue-once-bitten-twice-wrong&#34;&gt;Epilogue: once bitten, twice wrong&lt;/h3&gt;
&lt;p&gt;Two days later, one camera dropped off Frigate again. Armed with my hard-won experience, I knew &lt;em&gt;exactly&lt;/em&gt; what this was. CrowdSec. Again. The overzealous guard had struck once more. I went straight to the firewall, ready to deliver justice.&lt;/p&gt;
&lt;p&gt;The firewall logs showed zero dropped packets. The ARP table showed the camera wasn&amp;rsquo;t even on the network. It had simply&amp;hellip; gone offline. A power cycle of the camera fixed it in thirty seconds.&lt;/p&gt;
&lt;p&gt;This is the other trap of being your own IT department: after your first dramatic incident, every new symptom looks like the last root cause. The previous outage doesn&amp;rsquo;t just cost you an evening, it installs a bias in your head, free of charge, forever.&lt;/p&gt;
&lt;h2 id=&#34;incident-2-the-automation-server-that-politely-refused-every-ip-address-in-the-house&#34;&gt;Incident 2: The automation server that politely refused every IP address in the house&lt;/h2&gt;
&lt;p&gt;Second story. I run &lt;a href=&#34;https://n8n.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;n8n&lt;/a&gt;, a workflow automation tool, in a small container on my Proxmox cluster. It triages my email, files notes, does glue work I&amp;rsquo;d otherwise do by hand. It is, ironically, supposed to &lt;em&gt;save&lt;/em&gt; me time. It had been running flawlessly for six days. Remember the cameras? Same energy.&lt;/p&gt;
&lt;p&gt;The first symptom arrived through the usual enterprise-grade monitoring channel: people in the house reporting that the WiFi was acting up. Devices that were already online were fine, but anything new (a phone waking from sleep, a laptop coming home) just would not connect. The general &amp;ldquo;internet feels haunted&amp;rdquo; vibe that users report as, you guessed it, &amp;ldquo;the WiFi doesn&amp;rsquo;t work.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The WiFi was innocent. The radios were radioing. The problem was one layer up: new devices couldn&amp;rsquo;t get an IP address anymore, because there were, technically speaking, no IP addresses left.&lt;/p&gt;
&lt;p&gt;A quick search suggested a known compatibility issue between my DHCP server (Kea, on the OPNsense firewall) and WireGuard. The internet was confident. The internet was also wrong, which is worth remembering: when you are the entire IT department, your only coworker is a search engine, and that coworker has strong opinions and zero accountability.&lt;/p&gt;
&lt;p&gt;The lease table, on the firewall at 192.168.1.1, told the real story. Of the 253 usable addresses in the pool, &lt;strong&gt;224 were marked DECLINED&lt;/strong&gt;. Not in use. Not expired. Declined, as in: the server had offered them to someone, and that someone had said &amp;ldquo;no thanks, this one&amp;rsquo;s taken.&amp;rdquo; Two hundred and twenty-four times in a row.&lt;/p&gt;
&lt;p&gt;Here is the loop that one single machine had been running, one address every ten seconds or so, for 75 minutes straight:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ask for an IP address.&lt;/li&gt;
&lt;li&gt;Receive an offer.&lt;/li&gt;
&lt;li&gt;Probe the network to check the address is actually free (a responsible, standards-compliant thing to do).&lt;/li&gt;
&lt;li&gt;Hear its own probe echoed back by a confused virtual bridge, and conclude the address is taken.&lt;/li&gt;
&lt;li&gt;DECLINE the address, which the server then quarantines for 24 hours.&lt;/li&gt;
&lt;li&gt;Go back to step 1, with the next address.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It worked its way through the entire pool like that, politely refusing every single IP address in the house and getting each one locked away for the day. By 12:21 the server&amp;rsquo;s log said it all: allocation failed, subnet empty. Devices holding an existing lease never noticed a thing. Anything new got silence. (Which looks like DNS being down. Which looks like the WiFi. Which is what the ticket said.)&lt;/p&gt;
&lt;p&gt;All that remained was finding &lt;em&gt;who&lt;/em&gt;. The lease table only had a MAC address with a Proxmox vendor prefix, so I went hunting through all 49 VMs and containers in the cluster. The culprit: container 152. The n8n machine. My automation server. The machine whose entire job is doing things for me had spent its lunch break doing this to me.&lt;/p&gt;
&lt;p&gt;The fix had two parts: bulk-delete the 224 quarantined leases on the DHCP server and restart it, then restart the n8n container so its network plumbing got rebuilt. And here the story delivered its best plot twist: n8n refused to start. Why? Its disk was full. Why was its disk full? Because it had spent 75 minutes writing log lines about every IP address it was declining. The machine had documented its own rampage so thoroughly that it bricked itself with the paperwork. The arsonist died of smoke inhalation. One disk resize later, it booted, took an address, kept it, and went back to sorting my email like nothing had happened.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;So, does any of this stop me? Not even a little.&lt;/p&gt;
&lt;p&gt;The learning is part of the fun. That&amp;rsquo;s the whole deal with running your own infrastructure: every incident is stressful for an hour and fascinating forever. A cloud camera that stops working is a mystery you&amp;rsquo;ll never solve. My cameras stopped working and I got a detective story with firewall logs, wrongly accused cameras, and a confession. My IP addresses vanished and I got a whodunit with a MAC address for a fingerprint and a lineup of 49 virtual machines.&lt;/p&gt;
&lt;p&gt;Sure, it gets a bit stressful in the moment. There are people waiting on that WiFi, and the person who broke it, statistically speaking, is me. But the moment the cause finally clicks into place, when the weird symptom, the misleading theory, and the innocent-looking log line suddenly snap into one coherent story, that feeling is hard to beat. You don&amp;rsquo;t get it from things that just work, and you definitely don&amp;rsquo;t get it from things that break somewhere you&amp;rsquo;re not allowed to look.&lt;/p&gt;
&lt;p&gt;The helpdesk remains open. The tickets remain &amp;ldquo;the WiFi doesn&amp;rsquo;t work.&amp;rdquo; And the Head of IT remains, despite everything, happily unfired.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
