# OPNsense DNS Architecture **Last updated:** 2026-05-28 **Status:** Active ## Overview Two DNS services run on OPNsense: - **Unbound** — primary resolver on port 53, handles all external DNS with DNSSEC, DoT upstreams - **dnsmasq** — local DHCP and host resolution on port 5353, handles `kaburu.lan` records Unbound forwards `kaburu.lan` queries to dnsmasq on 127.0.0.1:5353, so all devices get a single DNS server (OPNsense at 192.168.0.1) for both local and external resolution. ## Unbound Configuration | Setting | Value | |---|---| | Port | 53 | | Interface | All (listens on all, outgoing locked to Mullvad) | | DNSSEC | Enabled | | Outgoing interface | Mullvad_VPN (opt5) | | regdhcp | Enabled | | regdhcpstatic | Enabled | | regdhcpdomain | kaburu.lan | ### Upstream Resolvers (DoT) — Active | UUID | Name | Server | Port | Verify | |---|---|---|---|---| | 48000e06 | Mullvad DNS TLS 1 | 193.138.218.74 | 853 | adblock.dns.mullvad.net | | 09060f42 | Mullvad DNS TLS 2 | 194.242.2.2 | 853 | adblock.dns.mullvad.net | ### Upstream Resolvers — Disabled | UUID | Name | Server | Reason | |---|---|---|---| | d53fa713 | Cloudflare DoT | 1.1.1.1 | DNS leak — Cloudflare IPs appeared on mullvad.net/check | | 8da39e2d | Quad9 DoT | 9.9.9.9 | DNS leak | | 76093144 | Cloudflare Forward | 1.1.1.1 | DNS leak | | 08dd7e77 | Quad9 Forward | 9.9.9.9 | DNS leak | ### Query Forwarding | Domain | Server | Port | |---|---|---| | kaburu.lan | 127.0.0.1 | 5353 | ## dnsmasq Configuration | Setting | Value | |---|---| | DNS port | 5353 (not on port 53) | | Interface | LAN | | Domain | kaburu.lan | | regdhcp | Enabled | | regdhcpstatic | Enabled | | DNSSEC | Disabled (Unbound handles this) | | no_resolv | Enabled (does not use upstream resolvers) | ## Local Domain All local hosts resolve under `kaburu.lan` — e.g. `kaburuaibox.kaburu.lan` Host records are managed in dnsmasq under Services → Dnsmasq DNS → Hosts. ## Key Host Records | Hostname | IP | Description | |---|---|---| | kaburuaibox | 192.168.0.253 | HP Z840 AI Server | | TrueNAS | 192.168.0.251 | TrueNAS MicroServer Gen8 | | TrueNAS-1gb-1 | 192.168.0.200 | TrueNAS port 1 | | TrueNAS-1gb-2 | 192.168.0.201 | TrueNAS port 2 | | KABURU-UM790-MAIN | 192.168.0.143 | UM790 Pro mini PC | | KaburuLINK | 192.168.0.250 | Unraid box | | homeassistant | 192.168.0.123 | Home Assistant | | ILOCZ162000TP | 192.168.0.155 | HP Z840 iLO4 port | | keeplink-sw | 192.168.0.10 | KeepLink KP-9000 switch | | eap653-01 | 192.168.0.101 | TP-Link EAP653 AP1 | | eap653-02 | 192.168.0.100 | TP-Link EAP653 AP2 | | eap110-outdoor | 192.168.0.102 | TP-Link EAP110 Outdoor AP | ## VLANs | VLAN | Interface | DHCP Range | Domain | |---|---|---|---| | LAN | lan | 192.168.0.51–250 | kaburu.lan | | CamerasVLAN | opt7 | 192.168.20.10–100 | kaburu.lan | | IOTVlan | opt8 | 192.168.30.10–100 | kaburu.lan | ## Change Log ### 2026-05-28 — DNS Leak Fix **Problem:** mullvad.net/check showed DNS requests leaking via Cloudflare (172.70.88.163, 172.70.88.164 and IPv6 equivalents) despite VPN being active. **Root cause:** Cloudflare and Quad9 DoT/Forward entries were enabled in Unbound. Even with outgoing_interface set to Mullvad (opt5), these upstream resolvers were resolving outside the VPN tunnel and their IPs appeared in DNS leak tests. **Fix:** - Disabled all 4 Cloudflare/Quad9 DoT and Forward entries in Unbound - Enabled both Mullvad DoT entries (193.138.218.74 and 194.242.2.2, both verify adblock.dns.mullvad.net) - Config edited directly via SSH: `perl -i -0pe` on `/conf/config.xml` - Unbound reconfigured via API - Pre-change backup saved to `/conf/config.xml.bak-20260528-prednsfix` on OPNsense ### 2026-05-17 — DNS Architecture Refactor - Unbound bound to LAN interface only (was listening on all interfaces) - regdhcp and regdhcpstatic enabled on Unbound - dnsmasq moved from port 53 to port 5353 - Unbound query forward added for kaburu.lan → 127.0.0.1:5353 - This resolves the issue where dnsmasq host records were not visible to Unbound ### 2026-05-28 — DoH Browser Leak Fix **Problem:** After fixing Unbound upstreams, mullvad.net/check still showed Cloudflare IPs (172.69.193.x) leaking. These are Cloudflare's **DNS-over-HTTPS resolver IPs**, not plain DNS. The browser (Brave) was bypassing OPNsense entirely and sending DoH queries directly to Cloudflare port 443 over the VPN. **Root cause:** Brave and other modern browsers have built-in encrypted DNS (DoH) configured to Cloudflare/Google by default. This traffic goes to port 443 so it's indistinguishable from HTTPS — it bypasses any DNS server the OS/router sets. **Fix — two firewall rules added to LAN (top of ruleset, quick):** | UUID | Rule | Interface | Proto | Destination | Port | Action | |---|---|---|---|---|---|---| | b1000001 | Block DoH providers | LAN | tcp/udp | DoH_Block alias | 443 | block | | b1000002 | Block rogue plain DNS | LAN | tcp/udp | !192.168.0.1 | 53 | block | **DoH_Block alias (uuid: a1b2c3d4-0000-0000-0000-doh000000001):** - 1.1.1.1, 1.0.0.1 (Cloudflare) - 8.8.8.8, 8.8.4.4 (Google) - 9.9.9.9, 149.112.112.112 (Quad9) - 208.67.222.222, 208.67.220.220 (OpenDNS) - 94.140.14.14, 94.140.15.15 (AdGuard) **Result:** All three green on mullvad.net/check — Using Mullvad VPN / No DNS leaks / No WebRTC leaks. Confirmed 2026-05-28. **Also:** Brave "Use secure DNS" setting disabled in browser settings (Settings → Privacy → Security → Use secure DNS → off). Belt and braces — the firewall block rules handle any device that has it on, but disabling in-browser is cleaner where possible. **Note:** The plain-DNS redirect rule (rule b1000002) also prevents any device from using a hardcoded DNS server (e.g. 8.8.8.8 in network settings).