<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LXC on Kabelbruch</title><link>https://kabelbruch.de/tags/lxc/</link><description>Recent content in LXC on Kabelbruch</description><image><title>Kabelbruch</title><url>https://kabelbruch.de/og-image.png</url><link>https://kabelbruch.de/og-image.png</link></image><generator>Hugo</generator><language>de-DE</language><lastBuildDate>Sun, 01 Nov 2026 22:50:00 +0100</lastBuildDate><atom:link href="https://kabelbruch.de/tags/lxc/index.xml" rel="self" type="application/rss+xml"/><item><title>DNS im Heimnetz: zwei Technitium-Server und eine Firewall, die aufpasst</title><link>https://kabelbruch.de/posts/dns-heimnetz-technitium-fortigate/</link><pubDate>Sun, 01 Nov 2026 22:50:00 +0100</pubDate><guid>https://kabelbruch.de/posts/dns-heimnetz-technitium-fortigate/</guid><description>Zwei Technitium-DNS-Server mit Filterlisten und DoT, eine FortiGate, die kein DNS an ihnen vorbeilässt – und was ich dabei übersehen habe.</description><content:encoded><![CDATA[<p>Jedes Gerät im Haus fragt DNS – und manche fragen, wen sie wollen. Bei mir antworten zwei eigene Technitium-Server, die Firewall sorgt dafür, dass niemand an ihnen vorbeikommt, und ein Feature habe ich dabei glatt übersehen.</p>
<h2 id="worum-gehts">Worum geht&rsquo;s?</h2>
<p><strong>DNS</strong> ist das Telefonbuch des Internets: Ein Gerät fragt „Welche IP hat <code>example.com</code>?“ und bekommt eine Adresse zurück. Wer diese Fragen beantwortet, sieht ziemlich genau, was im Haus los ist – und kann entscheiden, welche Antworten es überhaupt gibt.</p>
<p>Bisher hat das bei mir der alte Router erledigt. Ein Pi-hole-Container lief früher auch mal, ist aber seit September abgeschaltet. Mit dem Umstieg auf eine FortiGate als Firewall wollte ich DNS sauber neu aufziehen. Meine Wunschliste:</p>
<ul>
<li><strong>Eigene Namen fürs Homelab</strong>, damit ich Dienste unter <code>dienst.home.example.com</code> erreiche statt unter einer IP.</li>
<li><strong>Werbung und Tracker filtern</strong>, für alle Geräte im Haus, ohne dass ich auf jedem etwas installieren muss.</li>
<li><strong>Verschlüsselt nach außen</strong>, damit mein Provider nicht mitlesen kann, welche Namen ich auflöse.</li>
<li><strong>Ausfallsicher</strong>: Wenn ein DNS-Server ausfällt, geht im Haus gefühlt das Internet aus. Also zwei.</li>
<li><strong>Keine Schlupflöcher</strong>: Geräte, die sich ihren eigenen DNS-Server aussuchen, sollen trotzdem bei mir landen.</li>
</ul>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li><strong>Proxmox VE</strong> als Hypervisor</li>
<li><strong>Technitium DNS Server</strong> 15.6.1 (eingerichtet mit 15.6), in zwei LXC-Containern mit Debian 12, je 1 vCPU und 512 MB RAM</li>
<li><strong>FortiGate</strong> als Firewall mit mehreren VLANs (getrennten Netzen) für Server, Clients, IoT-Geräte, Gäste und so weiter</li>
<li><strong>Quad9</strong> als Upstream-Resolver per DNS-over-TLS</li>
<li><strong>Nginx Proxy Manager</strong> als Reverse Proxy für die internen Dienste</li>
</ul>
<p>Warum Technitium und nicht Pi-hole oder AdGuard Home? Technitium ist ein vollwertiger DNS-Server: Er kann echte Zonen verwalten, Zonentransfers, DNS-over-TLS nach außen, Filterlisten – alles in einem. Bei Pi-hole und AdGuard Home fehlten mir genau diese Einstellmöglichkeiten. Und der Abgleich zwischen zwei Servern war bei beiden nicht optimal, das läuft dort meist über zusätzliche Werkzeuge.</p>
<h2 id="der-aufbau">Der Aufbau</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">             Clients, IoT, Gäste, Server …
</span></span><span class="line"><span class="cl">                        │  DNS (Port 53)
</span></span><span class="line"><span class="cl">          ┌─────────────┴─────────────┐
</span></span><span class="line"><span class="cl">          ▼                           ▼
</span></span><span class="line"><span class="cl">   dns-01 (Primary)  ── Zonentransfer ──▶  dns-02 (Secondary)
</span></span><span class="line"><span class="cl">          │                           │
</span></span><span class="line"><span class="cl">          └──────── DNS-over-TLS ─────┘
</span></span><span class="line"><span class="cl">                        ▼
</span></span><span class="line"><span class="cl">                      Quad9
</span></span></code></pre></div><p>Beide Server laufen als LXC-Container auf Proxmox, mit fester IP im Server-Netz (im Beispiel <code>10.0.10.53</code> und <code>10.0.10.54</code>), und starten beim Booten des Hosts als Erste. Der DHCP-Server der FortiGate verteilt in allen Netzen <strong>beide</strong> Adressen als DNS-Server. Fällt einer aus, fragen die Geräte einfach den anderen.</p>
<h3 id="die-interne-zone">Die interne Zone</h3>
<p>Auf dns-01 liegt die Zone <code>home.example.com</code> als <strong>Primary</strong>, also als Original. Der wichtigste Eintrag ist ein Wildcard:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">*.home.example.com.   300   IN   A   10.0.10.80
</span></span></code></pre></div><p>Jeder Name unter <code>home.example.com</code> zeigt damit auf den Reverse Proxy, der die Anfrage an den richtigen Dienst weiterreicht. Für einen neuen Dienst muss ich nur im Proxy etwas eintragen, nicht im DNS. Ein paar Namen, die nicht über den Proxy laufen, stehen zusätzlich als eigene A-Einträge drin.</p>
<p>dns-02 hält dieselbe Zone als <strong>Secondary</strong>: Er holt sie sich per <strong>Zonentransfer</strong> von dns-01. Damit Änderungen nicht erst beim nächsten regulären Abgleich ankommen, schickt dns-01 bei jeder Änderung ein <strong>Notify</strong> – eine kurze Nachricht „Hey, es gibt was Neues“, worauf dns-02 sofort nachlädt.</p>
<h3 id="filterlisten">Filterlisten</h3>
<p>Auf beiden Servern sind dieselben Listen eingetragen:</p>
<ul>
<li><strong>HaGeZi Multi PRO</strong>: blockt Werbung, Tracker und bekannte Schaddomains. Die Liste wird alle 24 Stunden aktualisiert.</li>
<li><strong>HaGeZi „Encrypted DNS Bypass“</strong>: blockt bekannte Anbieter von DNS-over-HTTPS (DoH). Dazu gleich mehr.</li>
<li><strong><code>use-application-dns.net</code></strong>: Das ist eine „Kanarienvogel-Domain“. Firefox fragt sie ab, bevor er von sich aus DoH einschaltet. Bekommt er keine Antwort, lässt er es bleiben und nutzt das DNS des Netzes.</li>
</ul>
<h3 id="verschlüsselt-nach-außen">Verschlüsselt nach außen</h3>
<p>Was Technitium nicht selbst weiß, fragt er bei <strong>Quad9</strong> nach – und zwar per <strong>DNS-over-TLS</strong> (DoT). DoT ist normales DNS, nur in einem verschlüsselten Tunnel über Port 853. Mein Provider sieht dann nur noch, dass ich mit Quad9 rede, aber nicht mehr, worüber.</p>
<p>Wie viel da zusammenkommt, zeigt das Dashboard von dns-01: In 24 Stunden kamen rund <strong>92 000 Anfragen</strong> von 40 Geräten an. Knapp <strong>16 Prozent</strong> davon hat Technitium geblockt, also ungefähr jede sechste. Einen Teil der Anfragen beantwortet außerdem dns-02, die echte Gesamtzahl im Haus liegt also noch etwas höher.</p>
<p><img alt="Das Technitium-Dashboard von dns-01 über 24 Stunden: Anfragen insgesamt, beantwortet, aus dem Cache und geblockt" loading="lazy" src="/posts/dns-heimnetz-technitium-fortigate/technitium-dashboard.png"></p>
<h2 id="die-firewall-passt-auf">Die Firewall passt auf</h2>
<p>Eigene DNS-Server bringen wenig, wenn Geräte einfach woanders fragen. Und das tun erstaunlich viele.</p>
<h3 id="regel-1-dns-nur-an-die-eigenen-server">Regel 1: DNS nur an die eigenen Server</h3>
<p>Auf der FortiGate gibt es zwei Regeln, sinngemäß:</p>
<table>
	<thead>
			<tr>
					<th>Von</th>
					<th>Nach</th>
					<th>Was</th>
					<th>Erlaubt?</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Clients, IoT, Gäste, Server …</td>
					<td>die beiden DNS-Server</td>
					<td>DNS</td>
					<td>ja</td>
			</tr>
			<tr>
					<td>dieselben Netze, außer den DNS-Servern selbst</td>
					<td>Internet</td>
					<td>DNS (53) und DoT (853)</td>
					<td><strong>nein</strong></td>
			</tr>
	</tbody>
</table>
<p>Nur dns-01 und dns-02 dürfen also selbst nach draußen. Alle anderen Geräte kommen mit DNS nur noch bis zu ihnen.</p>
<h3 id="regel-2-wer-stur-google-fragt-landet-trotzdem-bei-mir">Regel 2: Wer stur Google fragt, landet trotzdem bei mir</h3>
<p>Ein paar Geräte halten sich nicht an den DNS-Server, den ihnen DHCP mitgibt. Bei mir waren das vor allem die <strong>Echo-Lautsprecher und der Fire TV</strong>: Die fragen fest eingestellt bei Google (<code>8.8.8.8</code> und <code>8.8.4.4</code>). Mit Regel 1 würden sie einfach kein DNS mehr bekommen und nicht mehr funktionieren.</p>
<p>Die Lösung auf der FortiGate ist eine <strong>Umleitung</strong> (dort „VIP“ genannt): Anfragen an Googles DNS-Adressen werden auf meine beiden Server umgeschrieben. Die Geräte glauben, Google habe geantwortet – tatsächlich war es Technitium, inklusive Filterlisten.</p>
<h3 id="regel-3-und-was-ist-mit-dns-over-https">Regel 3: Und was ist mit DNS-over-HTTPS?</h3>
<p>DoH ist der Endgegner dieser Konstruktion: DNS-Anfragen, verpackt in normales HTTPS über Port 443. Für die Firewall sieht das aus wie jeder andere Webseitenaufruf, eine Portsperre greift nicht.</p>
<p>Hier kommen die zweite Filterliste und die Firefox-Kanarienvogel-Domain ins Spiel: Technitium löst die Namen bekannter DoH-Anbieter einfach nicht auf. Ein Gerät, das per DoH an mir vorbei will, findet seinen DoH-Server gar nicht erst – solange es ihn über Namen sucht. Eine Lücke bleibt: Wer seinen DoH-Server fest per IP kennt, kommt durch. Das nehme ich bewusst in Kauf.</p>
<h3 id="bonus-ein-zweiter-filter-auf-der-firewall">Bonus: Ein zweiter Filter auf der Firewall</h3>
<p>Die Regel, mit der die Geräte die DNS-Server erreichen dürfen, hat zusätzlich das <strong>DNS-Filterprofil</strong> der FortiGate. Die FortiGate schaut sich also jede Anfrage auf dem Weg zu Technitium an und blockt Kategorien wie Schadsoftware, Phishing und frisch registrierte Domains anhand der Herstellerdaten. Zwei unabhängige Filter, die sich ergänzen.</p>
<h2 id="die-bewusste-ausnahme-die-firewall-selbst">Die bewusste Ausnahme: die Firewall selbst</h2>
<p>Die FortiGate fragt <strong>nicht</strong> meine Technitium-Server, sondern den DNS-Dienst ihres Herstellers, ebenfalls verschlüsselt per DoT. Das ist Absicht.</p>
<p>Die Firewall braucht DNS für ihre eigenen Updates, für Filterdaten, für Regeln mit Domainnamen und für die Prüfung, ob die Internetleitung läuft. Würde sie Technitium fragen, hinge sie an Proxmox. Startet der Proxmox-Host neu oder hat er ein Problem, stünde auch die Firewall ohne DNS da – genau in dem Moment, in dem ich sie am dringendsten brauche. Also bleibt sie unabhängig.</p>
<h2 id="die-ptr-flut-von-home-assistant">Die PTR-Flut von Home Assistant</h2>
<p>Kurz nach dem Umstieg füllte sich mein Firewall-Log mit Hunderten geblockten Anfragen, immer zur gleichen Minute jeder Stunde. Absender: Home Assistant.</p>
<p>Dessen Geräteerkennung fragt regelmäßig für das <strong>komplette Netz</strong> nach, welcher Name zu welcher IP gehört. Diese Rückwärtsabfragen heißen <strong>PTR-Abfragen</strong>. Gerichtet waren sie an das Gateway, also an die FortiGate – und die hatte keinen DNS-Dienst, also hat sie jede einzelne verworfen. Rund 700 pro Stunde, alle im Log.</p>
<p>Die Lösung: Auf der Schnittstelle zum Server-Netz, und nur dort, beantwortet die FortiGate DNS-Anfragen jetzt selbst, indem sie sie weiterreicht:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">config system dns-server
</span></span><span class="line"><span class="cl">    edit &#34;&lt;SERVER-INTERFACE&gt;&#34;
</span></span><span class="line"><span class="cl">        set mode forward-only
</span></span><span class="line"><span class="cl">    next
</span></span><span class="line"><span class="cl">end
</span></span></code></pre></div><p>Die PTR-Anfragen für private Adressen bekommen damit ein schnelles „gibt es nicht“ (<code>NXDOMAIN</code>), und das Log ist wieder ruhig. Getestet habe ich das mit:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig -x 10.0.10.20 @10.0.10.254
</span></span></code></pre></div><h2 id="stolperfallen--learnings">Stolperfallen &amp; Learnings</h2>
<p><strong>Beim Update braucht Technitium ein paar Sekunden.</strong> Ich habe beide Server mit dem offiziellen Installationsskript aktualisiert und direkt danach getestet: <code>connection refused</code>. Kurzer Schreck – dabei braucht Technitium nach dem Neustart einfach ein paar Sekunden, bis er wieder auf Port 53 lauscht. Seitdem gilt: nach dem Update kurz warten, und <strong>erst den Secondary aktualisieren, testen, dann den Primary</strong>. So beantwortet immer mindestens ein Server die Anfragen.</p>
<p><strong>„Server-Reset“ heißt nicht „blockiert“.</strong> Im Firewall-Log sah ich bei den DoT-Verbindungen zu Quad9 lauter Einträge mit <code>server-rst</code> und dachte zuerst, die Firewall würde DoT blocken. Tatsächlich ist das nur der Grund, warum eine Verbindung beendet wurde: Quad9 hat sie nach getaner Arbeit zugemacht. Ein echter Block steht dort als <code>deny</code>. In den Einträgen standen außerdem übertragene Bytes in beide Richtungen – es lief also alles.</p>
<p><strong>Manche Geräte sind DNS-Querulanten.</strong> Ohne die Umleitung für Googles DNS wären meine Echos nach Regel 1 einfach verstummt. Wer DNS sperrt, sollte vorher ins Log schauen, wer bisher wohin gefragt hat.</p>
<p><strong>Ich habe ein Feature übersehen.</strong> Gebaut habe ich die Redundanz klassisch: Primary, Secondary, Zonentransfer. So habe ich das in meiner Laufbahn irgendwie immer gemacht, und auf den Cluster bin ich schlicht nicht gekommen. Erst beim Schreiben dieses Artikels ist mir aufgefallen, dass Technitium seit Version 14 einen eigenen <strong>Cluster</strong> kann – also schon in der Version, die ich installiert habe.</p>
<p>Der Unterschied ist nicht klein:</p>
<ul>
<li><strong>Zonentransfer</strong> gleicht nur die Zonen ab. Alles andere – Filterlisten, Einstellungen, Benutzer – pflege ich auf beiden Servern doppelt. Dafür ist es Standard-DNS und funktioniert mit jeder DNS-Software.</li>
<li><strong>Ein Cluster</strong> verwaltet die Konfiguration zentral: Filterlisten, Einstellungen, Apps und Benutzer kommen vom primären Knoten, Zonen lassen sich über eine Katalog-Zone mitnehmen. Voraussetzung ist unter anderem HTTPS für die Weboberfläche, und den Cluster-Domainnamen kann man später nicht mehr ändern.</li>
</ul>
<p>Für mein Setup wäre der Cluster vermutlich die bequemere Wahl gewesen – ausgerechnet der Abgleich zwischen zwei Servern war ja einer meiner Gründe für Technitium. Kaputt ist nichts – aber ich pflege seit Wochen Dinge doppelt, die ich nicht doppelt pflegen müsste. Ist blöd, lässt sich aber korrigieren. 😉</p>
<h2 id="fazit">Fazit</h2>
<p>DNS im Heimnetz selbst zu betreiben, ist kein Hexenwerk, aber erst mit der Firewall wird es rund: Die Technitium-Server liefern Namen, Filter und Verschlüsselung, die FortiGate sorgt dafür, dass niemand an ihnen vorbeikommt. Dazu eine bewusste Ausnahme für die Firewall selbst, damit sie nicht von Proxmox abhängt. Und eine Lektion zum Schluss: Was man seit Jahren so macht, ist nicht automatisch der beste Weg. Nachlesen, was die Software inzwischen kann, lohnt sich.</p>
<h2 id="was-als-nächstes-kommt">Was als Nächstes kommt</h2>
<ul>
<li><strong>Umbau auf den Technitium-Cluster</strong> – mit eigenem Artikel, wenn es so weit ist.</li>
<li><strong>AirPrint über VLAN-Grenzen per DNS</strong>: Mein Drucker steht in einem eigenen Netz, und die iPhones finden ihn trotzdem. Wie das mit ein paar DNS-Einträgen klappt, kommt in einem eigenen Artikel.</li>
</ul>
]]></content:encoded></item></channel></rss>