<?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: Siddesh Bathi</title>
    <description>The latest articles on DEV Community by Siddesh Bathi (@sidbathi).</description>
    <link>https://dev.to/sidbathi</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1016804%2Fc3e84142-4dfd-4f33-b20c-e003a3eaccf8.png</url>
      <title>DEV Community: Siddesh Bathi</title>
      <link>https://dev.to/sidbathi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sidbathi"/>
    <language>en</language>
    <item>
      <title>I Could Block Ads. I Had No Idea What Else Was Happening.</title>
      <dc:creator>Siddesh Bathi</dc:creator>
      <pubDate>Tue, 31 Mar 2026 08:37:55 +0000</pubDate>
      <link>https://dev.to/sidbathi/i-could-block-ads-i-had-no-idea-what-else-was-happening-2ijc</link>
      <guid>https://dev.to/sidbathi/i-could-block-ads-i-had-no-idea-what-else-was-happening-2ijc</guid>
      <description>&lt;p&gt;By the end of my last post, the setup looked pretty solid.&lt;/p&gt;

&lt;p&gt;Pi-hole blocking ads. Unbound resolving DNS privately. Tailscale keeping everything accessible without exposing anything publicly.&lt;/p&gt;

&lt;p&gt;From the outside, the network looked healthy.&lt;/p&gt;

&lt;p&gt;The problem was I had absolutely no idea what was actually going on inside it.&lt;/p&gt;

&lt;p&gt;Pi-hole showed me DNS queries. That was it.&lt;/p&gt;

&lt;p&gt;Bandwidth? No idea. Traffic patterns? No idea. Which devices were chatting at 2am without telling anyone? Absolutely no idea.&lt;/p&gt;

&lt;p&gt;For someone who spends their working day talking about observability, visibility, and “you cannot manage what you cannot measure” — this was a bit embarrassing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Obvious Answer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search for “Raspberry Pi network monitoring” and the internet will confidently point you at two things.&lt;/p&gt;

&lt;p&gt;Prometheus. Grafana.&lt;/p&gt;

&lt;p&gt;Rich dashboards. Beautiful graphs. The kind of setup that makes your home network feel like it deserves its own on-call rotation.&lt;/p&gt;

&lt;p&gt;I genuinely considered both.&lt;/p&gt;

&lt;p&gt;Then I did something that saved me a lot of pain.&lt;/p&gt;

&lt;p&gt;I checked how much RAM they actually need.&lt;/p&gt;

&lt;p&gt;Prometheus, even lightly configured, wants a meaningful chunk of memory to store and process metrics. Grafana adds more on top. Together they are designed for machines that have resources to spare.&lt;/p&gt;

&lt;p&gt;The Raspberry Pi Zero 2W has 512 megabytes total. That is not a recommendation. That is the whole machine.&lt;/p&gt;

&lt;p&gt;Pi-hole lives there. Unbound lives there. Tailscale lives there. The operating system lives there.&lt;/p&gt;

&lt;p&gt;There is no spare capacity sitting around waiting to host a metrics pipeline.&lt;/p&gt;

&lt;p&gt;Asking Prometheus and Grafana to run alongside everything else would have been like inviting two large house guests into a studio flat. Technically possible. Practically a disaster for everyone already living there.&lt;/p&gt;

&lt;p&gt;So I asked a more honest question.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;What Do I Actually Need?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not “what would look impressive?”&lt;/p&gt;

&lt;p&gt;What do I actually need to see?&lt;/p&gt;

&lt;p&gt;The answer, when I was honest about it, was pretty simple.&lt;/p&gt;

&lt;p&gt;I wanted to know what traffic was flowing through my network right now. I wanted to know how much bandwidth I was using over time. And I wanted to know which devices were actually on my network.&lt;/p&gt;

&lt;p&gt;Three questions.&lt;/p&gt;

&lt;p&gt;Three lightweight tools. One for each.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;darkstat&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;darkstat watches your network interface passively and builds a picture of what is flowing through it.&lt;/p&gt;

&lt;p&gt;It uses almost no resources. It serves a small web interface. It does not try to be anything more than what it is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install darkstat -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once running, the web interface lives at &lt;code&gt;http://&amp;lt;your-pi-ip&amp;gt;:667&lt;/code&gt;. Nothing to configure. Just open it.&lt;/p&gt;

&lt;p&gt;Getting it installed was easy. Getting it to actually run properly was a different story.&lt;/p&gt;

&lt;p&gt;darkstat ships with an init script that was written before systemd became the standard. The two do not get along well. The service would start, report that everything was fine, and then quietly do nothing at all.&lt;/p&gt;

&lt;p&gt;Port 667 stayed closed. The web interface never appeared. And systemd had no idea anything was wrong because as far as it was concerned, the job was done.&lt;/p&gt;

&lt;p&gt;The fix was to stop trusting the init script entirely and write a proper systemd unit file instead. One that ran darkstat in the foreground, so systemd could actually keep track of it.&lt;/p&gt;

&lt;p&gt;That one change fixed everything.&lt;/p&gt;

&lt;p&gt;This is something I keep learning with older Linux tools. They were written in a different era. They make assumptions that no longer hold. When a service reports success but nothing is actually running, the culprit is usually somewhere in that gap between how the tool was designed and how the system expects it to behave.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoi6wfsym6qa8pzeupry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoi6wfsym6qa8pzeupry.png" alt="Darkstat has been quietly watching 315 million bytes of traffic flow through my network since the day I set it up. I did not ask it to. It just did.&amp;lt;br&amp;gt;
" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;u&gt;vnstat&lt;/u&gt;&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
darkstat tells you what is happening right now.&lt;/p&gt;

&lt;p&gt;vnstat tells you what happened over the last hour, day, week, and month.&lt;/p&gt;

&lt;p&gt;It is the difference between glancing out the window and checking your weather history. Both are useful. They just answer different questions.&lt;/p&gt;

&lt;p&gt;vnstat runs as a tiny background daemon, samples your network interface quietly, and keeps a running record of bandwidth usage over time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install vnstat -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once it has been collecting for a few minutes, these two commands become your best friends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vnstat -i wlan0 -d   # daily breakdown
vnstat -i wlan0 -m   # monthly totals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The daily and monthly breakdowns became something I checked more than I expected.&lt;/p&gt;

&lt;p&gt;There is something grounding about seeing actual numbers. Not estimates. Not assumptions. Just a record of what moved through the network and when.&lt;/p&gt;

&lt;p&gt;One small surprise: vnstat automatically tracked both my main Wi-Fi interface and the Tailscale VPN interface separately. I had not asked it to. It just did. That turned out to be more useful than I anticipated, because now I could see VPN traffic independently from everything else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjdaz0xiu36i79qay80y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjdaz0xiu36i79qay80y.png" alt="Ten days of bandwidth history, logged automatically. That spike on 22nd March? That was the day I installed everything. The Pi had a busy day." width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;nmap&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The third question was the one I had been quietly avoiding.&lt;/p&gt;

&lt;p&gt;Which devices are actually on my network?&lt;/p&gt;

&lt;p&gt;I knew the ones I had deliberately connected. But modern homes are messier than that. Smart TVs. Printers that update themselves overnight. Devices from visitors that technically never left. Things that connect to Wi-Fi without making a sound about it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install nmap -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running a quick scan answered the question immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nmap -sn 192.168.*.*/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time I did this, I counted more devices than I expected.&lt;/p&gt;

&lt;p&gt;I thought I had about eight.&lt;/p&gt;

&lt;p&gt;That is not a rounding error. That is a visibility problem.&lt;/p&gt;

&lt;p&gt;Some I recognised straight away. Some took a moment. A couple made me walk around the house and think harder than felt entirely comfortable.&lt;/p&gt;

&lt;p&gt;That last part is not paranoia. It is just what happens when you go from zero visibility to any visibility at all. You find things you did not know were there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc6qo58omtumwh727ydo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc6qo58omtumwh727ydo.png" alt="Fourteen devices on my network at 11pm on a Sunday. I only consciously remember connecting about eight of them." width="800" height="1142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I set this up to run automatically every hour via cron and write results to a log file.&lt;/p&gt;

&lt;p&gt;Now there is a timestamped record of every device that has appeared on my network, every hour of every day. If something new shows up at 3am, I will know about it. Eventually.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;What This Actually Cost&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After all three tools were running alongside Pi-hole, Unbound, and Tailscale, I checked the memory.&lt;/p&gt;

&lt;p&gt;The combined overhead was under 10 megabytes.&lt;/p&gt;

&lt;p&gt;To put that in perspective: a single Chrome tab uses more memory than this entire monitoring stack.&lt;/p&gt;

&lt;p&gt;The Pi-hole kept running. Unbound kept resolving. Nothing noticed anything had changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdxegwinsan4gu8v0unl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdxegwinsan4gu8v0unl.png" alt="Three monitoring tools running alongside Pi-hole, Unbound, and Tailscale. 197 megabytes still available. The Pi is fine. Prometheus would not have been." width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That last part matters more than it might sound.&lt;/p&gt;

&lt;p&gt;The Pi-hole is not optional. Every device in the house depends on it for DNS. If it struggles, the internet stops working for everyone. Everything else on this machine runs at the Pi-hole’s pleasure, not the other way around.&lt;/p&gt;

&lt;p&gt;A monitoring stack that threatens the thing it is supposed to monitor is not a monitoring stack. It is a liability.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;What Chagned?&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before this: DNS was visible. Everything else was dark.&lt;/p&gt;

&lt;p&gt;After this: I could see live traffic. I had bandwidth history going back weeks. I knew every device on my network by IP and MAC address.&lt;/p&gt;

&lt;p&gt;And I got there without adding anything that put meaningful load on a machine that was already doing important work.&lt;/p&gt;

&lt;p&gt;The right tool for the constraints you actually have, rather than the constraints you wish you had, is not a glamorous engineering lesson. Nobody writes conference talks about it.&lt;/p&gt;

&lt;p&gt;But it shows up in every system that actually keeps running.&lt;/p&gt;




&lt;p&gt;&lt;u&gt;&lt;em&gt;&lt;strong&gt;What Is Next&lt;/strong&gt;&lt;/em&gt;&lt;/u&gt;&lt;br&gt;
Three tools. Three data sources. Three separate places to look.&lt;/p&gt;

&lt;p&gt;The obvious next step was to pull all of that into one place.&lt;/p&gt;

&lt;p&gt;So I built a small dashboard in Flask that brought everything together in a single page.&lt;/p&gt;

&lt;p&gt;If you think “a dashboard sounds like a small project”, I admire your confidence.&lt;/p&gt;

&lt;p&gt;It was not a small project.&lt;/p&gt;

&lt;p&gt;That is next.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>networking</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>Running DNS Is Easy. Trusting It Is Not.</title>
      <dc:creator>Siddesh Bathi</dc:creator>
      <pubDate>Wed, 04 Feb 2026 10:49:39 +0000</pubDate>
      <link>https://dev.to/sidbathi/running-dns-is-easy-trusting-it-is-not-52g5</link>
      <guid>https://dev.to/sidbathi/running-dns-is-easy-trusting-it-is-not-52g5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This post was originally published on Medium.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;You can find the original version here:&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://medium.com/@sidbathi/running-dns-is-easy-trusting-it-is-not-e5eec77b2d50" rel="noopener noreferrer"&gt;https://medium.com/@sidbathi/running-dns-is-easy-trusting-it-is-not-e5eec77b2d50&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By the end of my last post, DNS in my home was &lt;em&gt;working&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pi-hole was up.&lt;br&gt;&lt;br&gt;
Ads were blocked.&lt;br&gt;&lt;br&gt;
The internet felt faster.&lt;br&gt;&lt;br&gt;
Everything looked fine.&lt;/p&gt;

&lt;p&gt;And that was exactly the problem.&lt;/p&gt;

&lt;p&gt;Because when I stepped back and actually thought about what was happening, I realised something uncomfortable:&lt;/p&gt;

&lt;p&gt;DNS was running — but I didn’t really trust it.&lt;/p&gt;

&lt;p&gt;Not the way I’d trust infrastructure that people depend on every day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Control is not the same as ownership
&lt;/h2&gt;

&lt;p&gt;At a glance, it felt like I was “running my own DNS”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queries flowed through Pi-hole
&lt;/li&gt;
&lt;li&gt;I had visibility into requests
&lt;/li&gt;
&lt;li&gt;I could block, allow, and tweak behaviour
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But under the hood, most DNS queries were still being forwarded elsewhere. I was filtering traffic, not resolving it. Trust was being outsourced.&lt;/p&gt;

&lt;p&gt;If my upstream resolver lied, failed, or behaved unexpectedly, I had no real way of knowing — or proving it.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;DNS sits at an unforgiving layer of the network. It’s invisible when it works, catastrophic when it doesn’t, and deeply sensitive from both a privacy and security perspective. If you’re going to run it yourself, you need to be honest about where trust actually lives.&lt;/p&gt;

&lt;p&gt;That’s where things started to feel fragile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why forwarding DNS never felt “done”
&lt;/h2&gt;

&lt;p&gt;Forwarding DNS is convenient. It’s also easy to forget what you’re implicitly trusting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External resolvers you don’t control
&lt;/li&gt;
&lt;li&gt;Network paths you don’t see
&lt;/li&gt;
&lt;li&gt;Policies you didn’t design
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is &lt;em&gt;wrong&lt;/em&gt;. But it is a trade-off.&lt;/p&gt;

&lt;p&gt;At this point, I wanted fewer assumptions — not better ones.&lt;/p&gt;

&lt;p&gt;That led me to recursive resolution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unbound: fewer shortcuts, more responsibility
&lt;/h2&gt;

&lt;p&gt;Adding Unbound wasn’t about performance or optimisation. It was about changing the trust model.&lt;/p&gt;

&lt;p&gt;Instead of forwarding queries upstream, Unbound resolves them recursively, validating responses along the way. The resolver stops being a middleman and starts being the authority that decides what to trust.&lt;/p&gt;

&lt;p&gt;The first time I realised my Raspberry Pi was now responsible for resolving the internet, it stopped feeling like a fun project.&lt;/p&gt;

&lt;p&gt;A few things changed immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS resolution stayed inside my network for longer
&lt;/li&gt;
&lt;li&gt;DNSSEC validation became explicit, not assumed
&lt;/li&gt;
&lt;li&gt;Failure modes became clearer — and closer to home
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also increased complexity, and that part matters.&lt;/p&gt;

&lt;p&gt;Running a recursive resolver means accepting more responsibility. Latency can increase slightly. Debugging becomes more subtle. There are more moving parts that can fail quietly.&lt;/p&gt;

&lt;p&gt;But the mental model improved.&lt;/p&gt;

&lt;p&gt;DNS stopped feeling like a feature and started feeling like infrastructure.&lt;/p&gt;

&lt;p&gt;That shift changed how seriously I treated everything that came after.&lt;/p&gt;




&lt;h2&gt;
  
  
  Secure access is not “opening a port”
&lt;/h2&gt;

&lt;p&gt;Once DNS became more critical, another question followed naturally:&lt;/p&gt;

&lt;p&gt;How do I access and manage this safely when I’m not at home?&lt;/p&gt;

&lt;p&gt;The obvious — and dangerous — answer is port forwarding. It works, and it also quietly turns internal services into public attack surfaces.&lt;/p&gt;

&lt;p&gt;That’s when I introduced Tailscale.&lt;/p&gt;

&lt;p&gt;Not because it’s trendy or “easy”, but because it forces a different way of thinking about access.&lt;/p&gt;

&lt;p&gt;With Tailscale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nothing is exposed publicly
&lt;/li&gt;
&lt;li&gt;Access is identity-based, not network-based
&lt;/li&gt;
&lt;li&gt;Devices authenticate to each other directly
&lt;/li&gt;
&lt;li&gt;The Pi-hole admin interface stays private
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remote access stopped feeling risky.&lt;/p&gt;

&lt;p&gt;I wasn’t punching holes in my router anymore. I was shrinking the blast radius.&lt;/p&gt;

&lt;p&gt;This wasn’t about convenience. It was about removing entire classes of mistakes.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu8g9nyqfmmkd23xjehs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu8g9nyqfmmkd23xjehs.png" alt="Security comparison — Port forwarding vs identity-based access" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Exposure versus identity. One of these removes an entire category of risk.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The cost of doing this properly
&lt;/h2&gt;

&lt;p&gt;It would be dishonest to pretend this simplified things.&lt;/p&gt;

&lt;p&gt;Adding Unbound and Tailscale introduced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More dependencies
&lt;/li&gt;
&lt;li&gt;More configuration surface
&lt;/li&gt;
&lt;li&gt;More subtle failure modes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system became safer — but also less forgiving.&lt;/p&gt;

&lt;p&gt;That’s the trade-off real infrastructure always makes. Safety doesn’t come from fewer components. It comes from clearer boundaries and deliberate design.&lt;/p&gt;

&lt;p&gt;What changed wasn’t just the setup.&lt;/p&gt;

&lt;p&gt;It was how I thought about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A mental model of DNS ownership
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrdykpdxs1ltrl603fuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrdykpdxs1ltrl603fuq.png" alt="Conceptual architecture — DNS ownership and trust boundary" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A mental model, not a wiring diagram.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This isn’t an implementation diagram.&lt;br&gt;&lt;br&gt;
It’s a way of thinking about responsibility and trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this unlocked (quietly)
&lt;/h2&gt;

&lt;p&gt;After this phase, something shifted.&lt;/p&gt;

&lt;p&gt;I wasn’t just blocking ads anymore. I was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Owning DNS resolution end-to-end
&lt;/li&gt;
&lt;li&gt;Making trust decisions explicitly
&lt;/li&gt;
&lt;li&gt;Accessing critical infrastructure securely, from anywhere
&lt;/li&gt;
&lt;li&gt;Thinking about failure &lt;em&gt;before&lt;/em&gt; it happened
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system still looked small. Still ran on a Raspberry Pi.&lt;/p&gt;

&lt;p&gt;But the mindset had changed.&lt;/p&gt;

&lt;p&gt;And that set the stage for the next lesson — one I didn’t see coming at the time:&lt;/p&gt;

&lt;p&gt;Visibility is not awareness.&lt;br&gt;&lt;br&gt;
Dashboards don’t wake you up.&lt;br&gt;&lt;br&gt;
Alerts do.&lt;/p&gt;

&lt;p&gt;That’s where things broke next.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;Hardening DNS solved one problem.&lt;/p&gt;

&lt;p&gt;It quietly created another.&lt;/p&gt;

&lt;p&gt;The system was safer — but still blind.&lt;/p&gt;

&lt;p&gt;That’s where uptime, alerting, and observability enter the story.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>dns</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>The First Thing I Installed on My Raspberry Pi (and how it quietly broke my entire home internet)</title>
      <dc:creator>Siddesh Bathi</dc:creator>
      <pubDate>Tue, 27 Jan 2026 09:07:00 +0000</pubDate>
      <link>https://dev.to/sidbathi/the-first-thing-i-installed-on-my-raspberry-pi-and-how-it-quietly-broke-my-entire-home-internet-59mn</link>
      <guid>https://dev.to/sidbathi/the-first-thing-i-installed-on-my-raspberry-pi-and-how-it-quietly-broke-my-entire-home-internet-59mn</guid>
      <description>&lt;p&gt;Originally published on Medium. Link to medium post - &lt;a href="https://medium.com/@sidbathi/the-first-thing-i-installed-on-my-raspberry-pi-and-how-it-quietly-broke-my-entire-home-internet-f16ba4fb530a" rel="noopener noreferrer"&gt;The First Thing I Installed on My Raspberry Pi (and how it quietly broke my entire home internet)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my previous post, I talked about getting my Raspberry Pi into a clean, predictable state - fresh OS, minimal configuration, no assumptions.&lt;/p&gt;

&lt;p&gt;At that point, the Pi was sitting there quietly.&lt;br&gt;
Healthy. Boring. Useless.&lt;/p&gt;

&lt;p&gt;Which meant it was time to ruin that peace.&lt;/p&gt;

&lt;p&gt;The obvious next question was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should be the first real project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not the flashiest project.&lt;br&gt;
Not the most impressive one.&lt;br&gt;
But the one that would force me to think like an operator instead of a tinkerer.&lt;/p&gt;

&lt;p&gt;That's how I ended up choosing Pi-hole.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Pi-hole? (And why this wasn't about ads)
&lt;/h2&gt;

&lt;p&gt;Let's get one thing out of the way.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I didn't pick Pi-hole because:&lt;/li&gt;
&lt;li&gt;I hate ads (okay, I do)&lt;/li&gt;
&lt;li&gt;I wanted a pretty dashboard&lt;/li&gt;
&lt;li&gt;I needed a "home lab starter project"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I picked Pi-hole because it sits at the most unforgiving layer of the network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DNS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick one-liner for context:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DNS (Domain Name System) is what turns google.com into an IP address your machine can actually talk to.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When DNS works, nobody thinks about it.&lt;br&gt;
When DNS breaks, everyone thinks the internet is down.&lt;/p&gt;

&lt;p&gt;Perfect.&lt;/p&gt;

&lt;p&gt;If I was going to run infrastructure at home, I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;everything depends on&lt;/li&gt;
&lt;li&gt;fails loudly&lt;/li&gt;
&lt;li&gt;teaches lessons fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DNS ticks all the boxes.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z2lt6v9e9d824moxhkh.png" alt=" " width="800" height="533"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Installing Pi-hole (the calm before the storm)
&lt;/h2&gt;

&lt;p&gt;Installing Pi-hole itself is… almost suspiciously easy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -sSL https://install.pi-hole.net | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this were a tutorial blog, I'd now tell you what options to click.&lt;/p&gt;

&lt;p&gt;This is not that blog.&lt;/p&gt;

&lt;p&gt;What mattered to me wasn't how fast it installed, but what changed in the system because of it.&lt;/p&gt;

&lt;p&gt;First thing I checked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl status pihole-FTL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good - it's a service.&lt;br&gt;
Not a script. Not a process I have to babysit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n4mdwrdgei1cwq8de3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0n4mdwrdgei1cwq8de3c.png" alt="Before worrying about DNS behaviour, I wanted to know whether Pi-hole was running as a proper, long-lived service." width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I checked what it was actually listening on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ss -lntp | grep -E ':(53|80)'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's when it really sank in.&lt;/p&gt;

&lt;p&gt;Port 53 - DNS - now belonged to this Raspberry Pi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep0q7dhxyp89mu8sthkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep0q7dhxyp89mu8sthkp.png" alt="Seeing who actually owned port 53 was the moment DNS stopped feeling abstract." width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This wasn't a "project" anymore.&lt;br&gt;
This was a responsibility.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testing Pi-hole: "It works!" (famous last words)
&lt;/h2&gt;

&lt;p&gt;To test Pi-hole, I pointed a client device to use the Pi as its DNS server and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nslookup google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdz3lqfuzvzj16r8y9my.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdz3lqfuzvzj16r8y9my.png" alt="From the client's perspective, DNS resolution was now flowing through the Raspberry Pi - a small change that quietly turned it into a critical dependency." width="552" height="866"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Pi itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig google.com @127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhgqxn5rbb79z4c5om29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhgqxn5rbb79z4c5om29.png" alt="At this point, resolution worked exactly as expected - at least when I was explicit about which DNS server to use." width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything resolved.&lt;br&gt;
Queries showed up in the dashboard.&lt;br&gt;
Ads were getting blocked.&lt;/p&gt;

&lt;p&gt;🎉 Success, right?&lt;/p&gt;

&lt;p&gt;Well… yes. Technically.&lt;/p&gt;

&lt;p&gt;But this was still safe success.&lt;br&gt;
Nothing depended on it yet.&lt;/p&gt;

&lt;p&gt;So I did the thing that turns experiments into infrastructure:&lt;br&gt;
I tried to route my home network through it.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57m4o1utxwf8ya1ggec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj57m4o1utxwf8ya1ggec.png" alt="Turns out my home network talks a lot. Pi-hole just made it impossible to ignore." width="800" height="1243"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The original plan (aka: how it should have worked)
&lt;/h2&gt;

&lt;p&gt;The plan was clean. Elegant. Architecturally sound.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Configure DNS at the router level so every device uses Pi-hole automatically."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No per-device config.&lt;br&gt;
One place to control everything.&lt;br&gt;
Pure network-level enforcement.&lt;/p&gt;

&lt;p&gt;If you've ever designed systems, you already know what comes next.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reality check: ISP routers don't care about your architecture
&lt;/h2&gt;

&lt;p&gt;I'm using a SKY router.&lt;/p&gt;

&lt;p&gt;And here's the short version:&lt;/p&gt;

&lt;p&gt;You don't fully control DNS on it.&lt;/p&gt;

&lt;p&gt;Some settings look configurable.&lt;br&gt;
Some partially apply.&lt;br&gt;
Some get overridden silently.&lt;/p&gt;

&lt;p&gt;The result was… confusing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some devices used Pi-hole&lt;/li&gt;
&lt;li&gt;Some ignored it completely&lt;/li&gt;
&lt;li&gt;Phones behaved differently from laptops&lt;/li&gt;
&lt;li&gt;VPN usage changed things again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this felt like Pi-hole was flaky.&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;This was my first big lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your design can be correct and still be impossible to enforce.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Consumer ISP hardware has opinions.&lt;br&gt;
And those opinions outrank yours.&lt;/p&gt;


&lt;h2&gt;
  
  
  Symptoms that made me doubt my sanity
&lt;/h2&gt;

&lt;p&gt;Things I observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pi-hole dashboard showing fewer queries than expected&lt;/li&gt;
&lt;li&gt;Ads blocked on one device but not another&lt;/li&gt;
&lt;li&gt;Same phone behaving differently on Wi-Fi vs mobile data&lt;/li&gt;
&lt;li&gt;Turning VPN on/off changing DNS behaviour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the point where many people rage-quit.&lt;br&gt;
Instead, I slowed down and asked a better question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which DNS server is this device actually using right now?"&lt;br&gt;
That question alone saved hours.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The pivot: choosing pragmatism over purity
&lt;/h2&gt;

&lt;p&gt;After enough fighting with the router, I made a decision.&lt;/p&gt;

&lt;p&gt;I stopped trying to force DNS centrally and switched to manual DNS configuration per device.&lt;/p&gt;

&lt;p&gt;Yes, it's less elegant.&lt;br&gt;
Yes, it's more work.&lt;/p&gt;

&lt;p&gt;But it has huge advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit behaviour&lt;/li&gt;
&lt;li&gt;predictable results&lt;/li&gt;
&lt;li&gt;easy debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each device now pointed directly to the Raspberry Pi's IP as its DNS server.&lt;/p&gt;

&lt;p&gt;Suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;behaviour made sense&lt;/li&gt;
&lt;li&gt;Pi-hole statistics matched reality&lt;/li&gt;
&lt;li&gt;debugging became sane again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was a mindset shift more than a technical one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Early infrastructure benefits more from visibility than from architectural perfection.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyu32xqo573r5bnl3491.png" alt=" " width="800" height="533"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  What this project actually taught me
&lt;/h2&gt;

&lt;p&gt;Before this, DNS was background noise.&lt;/p&gt;

&lt;p&gt;After running Pi-hole:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS became a dependency chain&lt;/li&gt;
&lt;li&gt;a failure domain&lt;/li&gt;
&lt;li&gt;a trust boundary&lt;/li&gt;
&lt;li&gt;the first thing to verify when "the internet is broken"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My troubleshooting style changed too.&lt;/p&gt;

&lt;p&gt;Instead of guessing, I verified.&lt;/p&gt;

&lt;p&gt;Instead of restarting everything, I checked ownership:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ss -lntp | grep :53
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single command tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who owns DNS&lt;/li&gt;
&lt;li&gt;what's listening&lt;/li&gt;
&lt;li&gt;whether your assumptions are wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Spoiler: they usually are.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Pi-hole was the right first project
&lt;/h2&gt;

&lt;p&gt;This project mattered because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it introduced real consequences&lt;/li&gt;
&lt;li&gt;it exposed real-world constraints&lt;/li&gt;
&lt;li&gt;it forced trade-offs&lt;/li&gt;
&lt;li&gt;it changed how I think about "control"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, it turned the Raspberry Pi into something other devices &lt;strong&gt;depend on.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvgbtnduphxbg11l9d4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvgbtnduphxbg11l9d4e.png" alt="Nothing to look at. Which usually means everything is working." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the moment a system stops being a hobby.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;At this point, DNS was running - but it was fragile.&lt;/p&gt;

&lt;p&gt;Which led to the next uncomfortable question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do I secure this?&lt;br&gt;
And how do I access it safely when I'm not at home?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's where &lt;strong&gt;DNS hardening&lt;/strong&gt; and &lt;strong&gt;secure access&lt;/strong&gt; come in - Unbound, Tailscale, and a whole new set of lessons.&lt;/p&gt;

&lt;p&gt;That's the next post.&lt;/p&gt;




</description>
      <category>raspberrypi</category>
      <category>homelab</category>
      <category>dns</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Preparing a Raspberry Pi Like a Real Server (Before Installing Anything)</title>
      <dc:creator>Siddesh Bathi</dc:creator>
      <pubDate>Fri, 23 Jan 2026 09:53:24 +0000</pubDate>
      <link>https://dev.to/sidbathi/preparing-a-raspberry-pi-like-a-real-server-before-installing-anything-2fl8</link>
      <guid>https://dev.to/sidbathi/preparing-a-raspberry-pi-like-a-real-server-before-installing-anything-2fl8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In my previous post, I wrote about why I enjoy running small pieces of infrastructure at home and pressure-testing ideas outside of work.&lt;br&gt;
This post is where that thinking turns practical - and where I had to actively stop myself from installing everything on day one.&lt;/p&gt;

&lt;p&gt;Before installing any services, I wanted to understand the Raspberry Pi in its most honest, unmodified state - a fresh operating system, minimal configuration, and no assumptions. The goal wasn't to make it useful yet, but to make it predictable.&lt;/p&gt;

&lt;p&gt;I approached the Pi the same way I would a new Linux server. establish a clean baseline, observe how it behaves under default conditions, and understand where disk, memory, and network boundaries actually are.&lt;/p&gt;

&lt;p&gt;Before diving into services, I want to document the baseline and mindset that shaped every decision that follows - including the exact steps and commands I ran to get there.&lt;/p&gt;

&lt;p&gt;Nothing runs on this machine yet - and yes, that's a deliberate choice. Because the reliability of everything that comes later depends on the discipline applied at the start.&lt;/p&gt;


&lt;h2&gt;
  
  
  Before we start: prerequisites
&lt;/h2&gt;

&lt;p&gt;Before setting anything up, this is what I used. Nothing fancy -just the basics needed to get a clean, predictable system up and running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raspberry Pi Zero 2 W&lt;/li&gt;
&lt;li&gt;32 GB microSD card&lt;/li&gt;
&lt;li&gt;Power supply for the Raspberry Pi&lt;/li&gt;
&lt;li&gt;Laptop or desktop (macOS / Linux / Windows)&lt;/li&gt;
&lt;li&gt;microSD card reader (if your laptop doesn't have one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raspberry Pi Imager&lt;/li&gt;
&lt;li&gt;Raspberry Pi OS Lite (Debian Bookworm–based)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fda9brk02rafxchv7i6gx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fda9brk02rafxchv7i6gx.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No fancy gear - just the essentials needed to get a Raspberry Pi off the ground.&lt;/p&gt;


&lt;h2&gt;
  
  
  Downloading Raspberry Pi OS and flashing the SD card
&lt;/h2&gt;

&lt;p&gt;To prepare the operating system, I used Raspberry Pi Imager, the officially supported tool from the Raspberry Pi Foundation.&lt;br&gt;
You can download it from:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.raspberrypi.com/software/" rel="noopener noreferrer"&gt;https://www.raspberrypi.com/software/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowsa0rovtjasg5cyujc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowsa0rovtjasg5cyujc9.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how the website looks like! &lt;/p&gt;

&lt;p&gt;After installing Raspberry Pi Imager on my laptop, I followed these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insert the microSD card into the laptop&lt;/li&gt;
&lt;li&gt;Open Raspberry Pi Imager&lt;/li&gt;
&lt;li&gt;Select Raspberry Pi OS (Other) -&amp;gt; Raspberry Pi OS (Legacy, 64-bit) Lite&lt;/li&gt;
&lt;li&gt;Choose the SD card as the target storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before writing the image, I opened the advanced options and configured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH (enabled)&lt;/li&gt;
&lt;li&gt;Username and password&lt;/li&gt;
&lt;li&gt;Wi-Fi SSID and password&lt;/li&gt;
&lt;li&gt;Locale and timezone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the Raspberry Pi to boot and be reachable over the network immediately - no monitor, keyboard, or desk gymnastics required.&lt;/p&gt;

&lt;p&gt;Once configured, I flashed the OS to the SD card and safely ejected it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9x4wldez73bbx7327mlb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9x4wldez73bbx7327mlb.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;br&gt;
Choosing the boring OS on purpose - less UI, fewer surprises later.&lt;/p&gt;

&lt;p&gt;At the time of setup, this option installs a Debian Bookworm–based 64-bit Raspberry Pi OS Lite image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypp7rtkxl28e20vem8my.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypp7rtkxl28e20vem8my.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;br&gt;
Pre-configuring SSH and Wi-Fi to enable a fully headless first boot.&lt;/p&gt;



&lt;p&gt;The rule I set before installing anything&lt;br&gt;
Before touching any services, I set a simple rule for myself:&lt;br&gt;
This Raspberry Pi would be treated like a server, not a project board.&lt;/p&gt;

&lt;p&gt;It's tempting to install DNS filters, VPNs, dashboards, and security tools immediately - especially when every tutorial on the internet starts with "just install this first." But that approach often hides problems rather than solving them.&lt;/p&gt;

&lt;p&gt;I wanted to understand how this system behaves before it does anything useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much disk space is actually available?&lt;/li&gt;
&lt;li&gt;How tight is memory?&lt;/li&gt;
&lt;li&gt;What does a normal idle state look like?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By delaying installations, I could observe the Pi in a clean state and establish a baseline I could trust. That baseline becomes the reference point for every change that follows.&lt;/p&gt;

&lt;p&gt;In practice, this meant resisting progress that only looked like progress - and choosing predictability over speed, even when speed felt more satisfying.&lt;/p&gt;


&lt;h2&gt;
  
  
  First boot and accessing the Raspberry Pi
&lt;/h2&gt;

&lt;p&gt;With the SD card prepared, I inserted it into the Raspberry Pi, connected power, and let it boot.&lt;/p&gt;

&lt;p&gt;Since SSH was already enabled, I connected from my laptop using the pattern below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;hostname-or-ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my setup, the username is &lt;code&gt;sid&lt;/code&gt; and the hostname is &lt;code&gt;pihole.local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once logged in, I confirmed I had stable access and landed in a normal Linux shell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feh3czxof1m3ecv3rwdut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feh3czxof1m3ecv3rwdut.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;br&gt;
Successful SSH access to the Raspberry Pi after first boot.&lt;/p&gt;


&lt;h2&gt;
  
  
  Establishing a baseline I could trust
&lt;/h2&gt;

&lt;p&gt;Before installing anything, I wanted a clear picture of what this Raspberry Pi looked like in a known-good, idle state.&lt;/p&gt;

&lt;p&gt;The first step was updating the system - not because it's exciting, but because debugging problems on an outdated OS is even less exciting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade -y 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once updated, I started checking the basics - not to optimise anything yet, but to understand the constraints I was working within.&lt;/p&gt;




&lt;h2&gt;
  
  
  Disk usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df -h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows how storage is laid out and how much space is genuinely available on a fresh install. On small devices, storage fills up faster than expected, so this becomes an important reference point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmjgxg3hp9o84d83lsap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmjgxg3hp9o84d83lsap.png" alt=" " width="800" height="225"&gt;&lt;/a&gt;&lt;br&gt;
Disk layout and available storage on a Raspberry Pi OS installation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory availability
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;free -m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives a clear picture of RAM and swap usage before any background services are installed. Whatever runs later will eat into these numbers - so this becomes my baseline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vdaymcodhq2vyxbq7m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vdaymcodhq2vyxbq7m1.png" alt=" " width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Memory and swap usage at idle&lt;/p&gt;




&lt;p&gt;At this point, nothing useful was running - but I now had something more important than features: a baseline I could trust.&lt;/p&gt;

&lt;p&gt;From here on, every change could be measured. If disk usage spikes, memory tightens, or latency appears later, I'll know exactly when - and why - it happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  CPU (identity, not usage)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lscpu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirms the system is running on a 64-bit ARM architecture (aarch64) with a small number of CPU cores - exactly what you'd expect from a Raspberry Pi Zero 2 W.&lt;/p&gt;

&lt;p&gt;At this stage, I'm not interested in how busy the CPU is, only in what kind of CPU I'm working with. Actual usage only becomes meaningful once services are running.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I deliberately chose not to install (yet)
&lt;/h2&gt;

&lt;p&gt;At this stage, it would have been very easy to start installing services - and I had to consciously not do that.&lt;/p&gt;

&lt;p&gt;DNS filtering, secure remote access, monitoring, and hardening were all already on my list. But I deliberately held back.&lt;/p&gt;

&lt;p&gt;Installing services before understanding the baseline only creates noise. When something breaks later, it becomes difficult to tell whether the issue lies with the service itself or with assumptions made earlier.&lt;/p&gt;

&lt;p&gt;By stopping here, I kept the system in a known, explainable state - no background daemons doing work I hadn't measured, and no configuration drift I couldn't account for.&lt;/p&gt;

&lt;p&gt;This wasn't a delay. It was a checkpoint.&lt;br&gt;
This was the point where I closed the terminal and walked away - on purpose.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;In the next post, I'll start adding the first real service to this system - DNS.&lt;br&gt;
With a clean baseline in place, it becomes much easier to see what actually changes once something starts running.&lt;br&gt;
That's where things begin to get interesting.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final note
&lt;/h2&gt;

&lt;p&gt;Screenshots in this post are taken from a real, already running system.&lt;br&gt;
Your output may differ depending on hardware, storage size, and usage - and that's expected.&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>linux</category>
      <category>infrastructure</category>
      <category>devops</category>
    </item>
    <item>
      <title>What a Tiny Raspberry Pi Taught Me About DNS, Privacy, and Control at Home</title>
      <dc:creator>Siddesh Bathi</dc:creator>
      <pubDate>Mon, 19 Jan 2026 18:58:05 +0000</pubDate>
      <link>https://dev.to/sidbathi/what-a-tiny-raspberry-pi-taught-me-about-dns-privacy-and-control-at-home-501p</link>
      <guid>https://dev.to/sidbathi/what-a-tiny-raspberry-pi-taught-me-about-dns-privacy-and-control-at-home-501p</guid>
      <description>&lt;p&gt;Originally published on Medium. Link to medium post - &lt;a href="https://medium.com/@sidbathi/what-a-tiny-raspberry-pi-taught-me-about-dns-privacy-and-control-at-home-a1c580271b3f?postPublishedType=initial" rel="noopener noreferrer"&gt;What a Tiny Raspberry Pi Taught Me About DNS, Privacy, and Control at Home&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsvf7vqsksv2yoksqhpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsvf7vqsksv2yoksqhpd.jpg" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most people never think about DNS.&lt;/p&gt;

&lt;p&gt;It’s one of those things that quietly works in the background — like plumbing.&lt;br&gt;
Until one day it doesn’t… and suddenly nothing on the internet makes sense.&lt;/p&gt;

&lt;p&gt;As a Cloud Engineer, I spend a lot of time thinking about systems at organisation scale.&lt;br&gt;
But at home, I realised something ironic — I was blindly trusting my ISP for something as fundamental as DNS, without visibility, without control, and without much thought.&lt;/p&gt;

&lt;p&gt;This blog is about how a tiny Raspberry Pi quietly became my practice ground for real infrastructure ideas — without production incidents, without pressure, and without angry users.&lt;/p&gt;

&lt;p&gt;This is not a polished success story.&lt;br&gt;
It’s the beginning of a learning journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Needed a Raspberry Pi at Home?
&lt;/h2&gt;

&lt;p&gt;I didn’t start this project because I was bored.&lt;br&gt;
And I definitely didn’t start it just to block ads (that was a nice side effect).&lt;/p&gt;

&lt;p&gt;What bothered me was this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ads everywhere&lt;/li&gt;
&lt;li&gt;Tracking everywhere&lt;/li&gt;
&lt;li&gt;DNS requests happening silently&lt;/li&gt;
&lt;li&gt;Zero visibility into where those requests were going&lt;/li&gt;
&lt;li&gt;DNS is the first step of the internet.&lt;/li&gt;
&lt;li&gt;Every website, every app, every API call starts there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At work, we talk about security, observability, trust boundaries, and reliability.&lt;br&gt;
At home, I had none of that.&lt;/p&gt;

&lt;p&gt;So instead of spinning up another cloud VM, I decided to bring those ideas down to home scale — using something small, cheap, and always on.&lt;/p&gt;

&lt;p&gt;That’s when the Raspberry Pi made sense.&lt;/p&gt;

&lt;p&gt;Not as a toy.&lt;br&gt;
But as a tiny piece of infrastructure that other devices would depend on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Raspberry Pi Zero 2W (Not Raspberry Pi 5)?
&lt;/h2&gt;

&lt;p&gt;When people hear “Raspberry Pi”, the conversation often jumps straight to performance.&lt;/p&gt;

&lt;p&gt;“Why not just get a Raspberry Pi 5?”&lt;/p&gt;

&lt;p&gt;Fair question — but the wrong starting point.&lt;/p&gt;

&lt;p&gt;I intentionally chose the Raspberry Pi Zero 2W, and that decision shaped the entire learning experience.&lt;/p&gt;

&lt;p&gt;The Zero 2W is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cheap&lt;/li&gt;
&lt;li&gt;Silent&lt;/li&gt;
&lt;li&gt;Extremely low power&lt;/li&gt;
&lt;li&gt;And very limited
And that’s exactly why it’s such a good teacher.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At work, when something is slow, we add resources.&lt;br&gt;
At home, this Pi politely says: no.&lt;/p&gt;

&lt;p&gt;It forces you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think before installing things&lt;/li&gt;
&lt;li&gt;Understand what each service is doing&lt;/li&gt;
&lt;li&gt;Respect CPU and memory constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need a Ferrari to learn driving.&lt;br&gt;
You need a small car, narrow roads, and a few mistakes you’ll remember forever.&lt;/p&gt;

&lt;p&gt;This Pi gave me all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost Breakdown (Keeping It Honest)
&lt;/h2&gt;

&lt;p&gt;This project didn’t start with a shopping spree.&lt;/p&gt;

&lt;p&gt;All of this runs on hardware that cost roughly £25 — cheaper than most monthly cloud bills.&lt;/p&gt;

&lt;p&gt;It needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One Raspberry Pi Zero 2W&lt;/li&gt;
&lt;li&gt;One SD card — 32GB recommended.&lt;/li&gt;
&lt;li&gt;One power adapter&lt;/li&gt;
&lt;li&gt;Laptop (of course 😄) , don’t bother about Mac or Windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No rack.&lt;br&gt;
No switch.&lt;br&gt;
No cloud bill quietly judging you at the end of the month.&lt;/p&gt;

&lt;p&gt;For a device that runs 24/7, the power cost is almost negligible.&lt;br&gt;
The learning return, on the other hand, shows up every single day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2l0j5c15mbwug85cauja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2l0j5c15mbwug85cauja.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
At a high level, a Raspberry Pi sits between my home devices and the internet, handling DNS requests centrally.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Service: Pi-hole
&lt;/h2&gt;

&lt;p&gt;The first service I installed was Pi-hole.&lt;/p&gt;

&lt;p&gt;Not because it’s fancy — but because it provides immediate, visible value.&lt;/p&gt;

&lt;p&gt;Every device on your network constantly asks:&lt;/p&gt;

&lt;p&gt;“Where is this website?”&lt;/p&gt;

&lt;p&gt;Pi-hole sits in the middle and calmly replies:&lt;/p&gt;

&lt;p&gt;“Sure”&lt;br&gt;
“Okay”&lt;br&gt;
“Absolutely not, that’s an ad tracker”&lt;br&gt;
And it does this before ads even get a chance to load.&lt;/p&gt;

&lt;p&gt;This happens at the DNS level — not in a browser trying its best to block things.&lt;/p&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner browsing&lt;/li&gt;
&lt;li&gt;Faster apps&lt;/li&gt;
&lt;li&gt;And the quiet satisfaction of watching ad counters go up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, the project stopped being “just learning” and started being genuinely useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fma7qu6tgmda2tvk93q63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fma7qu6tgmda2tvk93q63.png" alt=" " width="800" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pi-hole dashboard showing DNS queries and blocked domains across my home network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making It Accessible Anywhere: Tailscale
&lt;/h2&gt;

&lt;p&gt;One small problem remained.&lt;/p&gt;

&lt;p&gt;The Raspberry Pi lives at home.&lt;br&gt;
I don’t.&lt;/p&gt;

&lt;p&gt;Port forwarding was an option — a bad one.&lt;/p&gt;

&lt;p&gt;Instead, I used Tailscale, which creates a private, encrypted network between my devices.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No public IP exposure&lt;/li&gt;
&lt;li&gt;No firewall gymnastics&lt;/li&gt;
&lt;li&gt;No “hope this is secure” feeling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just private access, the way it should be.&lt;/p&gt;

&lt;p&gt;This made the Pi feel less like a local gadget and more like a real, managed system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving Privacy with Unbound&lt;/li&gt;
&lt;li&gt;Blocking ads was great.&lt;/li&gt;
&lt;li&gt;But I still wanted to know where my DNS queries were going.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, many setups forward DNS to public resolvers.&lt;br&gt;
That works — but it’s still outsourcing trust.&lt;/p&gt;

&lt;p&gt;Adding Unbound turned the Raspberry Pi into a recursive DNS resolver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It talks directly to root servers&lt;/li&gt;
&lt;li&gt;It builds trust step by step&lt;/li&gt;
&lt;li&gt;It reduces dependency on third parties
This is where the setup stopped feeling like a hobby
and started feeling like real infrastructure, just smaller.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Proof That It Works
&lt;/h2&gt;

&lt;p&gt;This is where theory turns into confidence.&lt;/p&gt;

&lt;p&gt;I could now actually see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total DNS queries&lt;/li&gt;
&lt;li&gt;Ads being blocked&lt;/li&gt;
&lt;li&gt;Traffic patterns across devices&lt;/li&gt;
&lt;li&gt;DNS was no longer invisible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that visibility alone changed how I thought about my home network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uar3r9jyn74fa9yfezh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uar3r9jyn74fa9yfezh.jpg" alt=" " width="709" height="1536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot without Pi-hole&lt;br&gt;
(using my phone without network-level blocking)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fai8xmvjvwf1w0w9i34xe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fai8xmvjvwf1w0w9i34xe.jpg" alt=" " width="709" height="1536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot with Pi-hole enabled&lt;br&gt;
(using my home DNS setup)&lt;br&gt;
The difference was noticeable immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;At this point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS was running reliably at home&lt;/li&gt;
&lt;li&gt;Ads were being blocked across devices&lt;/li&gt;
&lt;li&gt;Privacy was improved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And this tiny Raspberry Pi had become an always-on system I could learn from.&lt;br&gt;
Nothing here was enterprise-scale — and that was the point.&lt;/p&gt;

&lt;p&gt;This was about practicing real ideas safely, at home, without breaking production.&lt;/p&gt;

&lt;p&gt;There’s still a lot more to explore.&lt;br&gt;
But for now, this was a solid foundation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want to build this exact setup yourself, the next post will walk through the step-by-step installation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>homelab</category>
      <category>networking</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
