github.com/Control-D-Inc/ctrld
v1.5.5
Control-D-Inc/ctrld
What this package is like to depend on
Last release 19 days ago
04 Aug 2026
Ships fairly regularly
a new release about every 3 weeks
Some releases are documented
notes for 10 of 37 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
74 releases · first in 2022
23 releases in the last 12 months
see the full history below
Release timeline
74 releases · Dec 2022 to Aug 2026Releases
latest 60 of 74-
v1.5.504 Aug 2026Release notes
Open source →Minor Release
This contains security hardening and bug fixes.
Security
- Bumped
golang.org/x/textto v0.40.0 to address GO-2026-5970 - Discarded upstream answers whose question does not echo the request - defense in depth against cache poisoning. A compromised or misbehaving upstream could return an answer for a different name (e.g. records for
attacker.examplein response to a query forvictim.example), which would be cached under the legitimate request key and served to later queries. The answer is now validated against the request's question (case-insensitive name plus Qtype/Qclass, per RFC 1035 §4.1.2) before it is served or cached; a mismatch is logged at debug level and the upstream is skipped, failing safe to the next upstream or SERVFAIL
Fixed
- Partitioned the DNS cache by EDNS Client Subnet (ECS). With
cache_enable = true, one cache entry was shared by every client asking the same name against the same upstream, so a response tailored for subnet A could be served to subnet B (returning the wrong CDN/policy answer, per RFC 7871 §7.3). Both cache paths are now keyed by a canonical ECS tuple so different subnets never share an entry, while same-subnet queries still share one - Fixed the DoQ resolver corrupting upstream responses by calling
SetReplyon the already-unpacked answer, which forced the RCODE to NOERROR and overwrote the Question section. This masked upstream failures from the proxy's failover logic (a SERVFAIL looked like a successful empty response) and corrupted the Question served to clients. Only the downstream transaction ID is now restored, preserving the upstream RCODE, Question, and answers - matching the DoH and DoT resolvers - Treated the 464XLAT CLAT source range as local rather than WAN. On IPv6-only cellular carriers and iPhone hotspots, local DNS queries can arrive with a source in the RFC 7335 IPv4 Service Continuity Prefix (192.0.0.0/29), which was classified as a WAN client and refused when
allow_wan_clientswas unset (the default), breaking DNS resolution on the affected connection. The 192.0.0.0/29 range is now recognized as local - Preserved the fallback listener port across config reload in macOS DNS-intercept mode. When mDNSResponder owns
*:53, ctrld falls back to127.0.0.1:5354, but an hourly CD config reload reverted the in-memory port to 53 while the listener stayed on 5354, causing an endless watchdog "force reload" loop anddigtimeouts. The actual bound listener IP/port is now restored into the in-memory config after reload - Skipped internal logging in
--silentmode. In cd mode,--silentstill created and grew a log file and reset the global log level back to debug, overriding the level--silenthad set. ctrld now neither creates the internal log file nor writes debug logs when silent is set - Restored system DNS during an invalid-device uninstall, so DNS is no longer left pointing at the stopped listener when uninstalling with an invalid device
- Bumped
-
v1.5.5-0.20260714152326-69340d151e1514 Jul 2026 pre-releaseNothing published for this version
-
v1.5.414 Jul 2026Release notes
Open source →Minor Release
This contains some bug fixes.
Fixed
- Fix macOS
pfwatchdog exec storms. - Add Windows NRPT recovery circuit breaker to prevent recovery loop.
- Fix macOS
-
v1.5.4-0.20260702192108-2e3e5a67e18602 Jul 2026 pre-releaseNothing published for this version
-
v1.5.322 Jun 2026Release notes
Open source →Minor Release
This contains new features, significant performance improvements, and bug fixes.
Security
-
Upgraded quic-go to v0.59.1 to address CVE-2026-40898
-
Rejected oversized upstream DNS responses on the DoH, DoH3, and DoQ paths — these previously used
io.ReadAllon attacker-controlled responses before enforcing any protocol-level limit, allowing a malicious or compromised upstream to force unbounded buffering. Bodies are now capped atdns.MaxMsgSize(and non-200 DoH error bodies are bounded as well) -
Validated DNS-over-QUIC response framing (RFC 9250) — the resolver previously assumed at least two bytes were present and could panic on truncated or malicious replies; the length prefix is now validated and framing failures retire the connection from the pool
-
Rate-limited PIN attempts on the control socket to provide defense-in-depth against brute-force if an attacker gains socket access
-
Switched temp file creation to
os.CreateTempfor symlink-safe writes, preventing symlink attacks on systems withoutfs.protected_symlinks(e.g. embedded routers) -
Switched
internal/router/dnsmasqtotext/templateinstead ofhtml/template, since the generated config is plain text
Improved
-
Shared a single QUIC transport and UDP socket across DoQ dials so parallel dial and reconnect churn no longer allocate a socket per attempt or leak sockets; the query stream's send side is now closed before reading the response per RFC 9250 §4.2
-
Updated the Docker base image to bookworm
Fixed
-
Refreshed macOS VPN DNS after pf stabilization
-
Allowed intercept fallback for the default listener
-
Flushed pf states after a forced DNS intercept reload
-
-
v1.5.3-0.20260605020731-70f9e24d9c0d05 Jun 2026 pre-releaseNothing published for this version
-
v1.5.202 Jun 2026Release notes
Open source →Minor Release
This release contains a bug fix for Windows platform.
Fixed
- Fixes Windows DNS-intercept behavior for AD/internal split-rule domains during sleep/wake or VPN adapter settling without relying on a fixed timeout.
-
v1.5.125 May 2026Release notes
Open source →Minor Release
This contains bug fixes and a new diagnostic command.
Added
- Added
ctrld log tailcommand for live log streaming — streams runtime debug logs to the terminal in real-time, similar totail -f. Supports--lines/-nflag to control initial context lines - Added WFP loopback protect for VPN block-outside-dns in dns intercept mode.
Improved
- Configured QUIC keep-alive for DoQ connections — sends periodic PING frames (
KeepAlivePeriod: 15s) on idle pooled connections, keeping them alive across NAT rebinding and proactively detecting dead paths before the next query hits a stale connection
Fixed
-
Fixed handle leak in
hasLocalDnsServerRunning()on Windows — the process snapshot handle fromCreateToolhelp32Snapshotwas not being closed, leaking a handle on every call -
Fixed
dnsFromResolvConfnot filtering loopback IPs — thecontinuestatement only broke out of the inner loop, allowing loopback addresses (e.g. 127.0.0.1) through. This caused ctrld to use itself as bootstrap DNS when already installed as the system resolver, creating a self-referential loop -
Fixed IPv6 VPN DNS server addresses not formatted correctly on macOS —
upstreamConfigFor()passed bare IPv6 addresses tonet.Dialwithout brackets or port, causingtoo many colons in addresserrors and immediate failure for all IPv6 VPN DNS queries -
Fixed DNS responses failing with
sendmsg: invalid argumentfor IPv6-sourced clients on macOS — the pfnatrule onlo0 inet6did not match packets arriving via therdrchain as inet4, so the client's global IPv6 source address was preserved, and the kernel rejected responses from[::1]:53to non-loopback destinations -
Fixed VPN DNS queries routed over wrong source interface on macOS — when a VPN client (e.g. FortiClient) was active, DNS queries to LAN servers used the VPN tunnel IP as source, making responses unroutable. Combined with the IPv6 bugs, this cascaded into complete VPN DNS failure and VPN disconnection
-
Fixed DoQ queries failing with idle timeout errors — pooled QUIC connections that timed out server-side now trigger a transparent retry with a fresh connection instead of propagating the error
-
Fixed DoQ queries failing with
too many open streams— replaced non-blockingOpenStreamwithOpenStreamSync, which waits for the server'sMAX_STREAMScredit replenishment instead of racing against it. AddedStreamLimitReachedErroras a retry condition for defense-in-depth when the stream credit wait times outetS -
Fixed a crash in SetSelfIP triggered by network transitions before clientinfo initialization.
-
Fixed a recovery race condition, reduce worst-case recovery from ~30s to <3s.
- Added
-
v1.5.004 Mar 2026Release notes
Open source →Major Release
This contains new features, significant performance improvements, and bug fixes.
Added
-
Added DNS intercept mode (
--intercept-mode=dns|hard|off) — a major new feature that intercepts all DNS traffic on the system and routes it through ctrld- macOS: pf-based interception with
route-to lo0+rdrrules,_ctrldgroup exemption, watchdog auto-heal for Parallels VM pf corruption, and IPv6 DNS blocking - Windows: dual-mode support — NRPT for standard DNS interception, WFP sublayer with callout filters for hard interception
- VPN DNS split routing — discovers DNS servers from F5 BIG-IP, Tailscale, Network Extension VPNs, and traditional VPN adapters; handles split vs full tunnel detection; cleans up stale exemptions on VPN disconnect
- Recovery bypass for captive portals and probe-based interception verification
- macOS: pf-based interception with
-
Added robust platform-specific username detection for Control D metadata (macOS: directory services/console user, Linux: loginctl/utmp/passwd, Windows: WTS/registry/token)
-
Added hostname hints in provisioning metadata for API-side fallback, allowing the server to repair generic hostnames
Improved
-
Implemented connection pooling for DoQ (QUIC) — eliminates per-query handshake overhead by reusing connections, matching DoH3 performance
-
Implemented connection pooling for DoT (TLS) — eliminates per-query TLS handshake overhead by reusing connections
-
Improved DNS server discovery for domain-joined Windows machines — non-physical adapters with matching DNS suffix are now considered valid for remote VPN scenarios
-
Consolidated network change monitoring into a single goroutine for simpler, more reliable handling
Fixed
-
Fixed macOS hostname detection — uses
scutilComputerName instead ofos.Hostname(), which returns generic names like "Mac.lan" when Private Wi-Fi Address is enabled -
Fixed DoT connection validation — connections are now checked before reuse to prevent
io.EOFerrors from server-side idle timeouts -
Fixed handling of empty and invalid IP addresses to prevent panics when processing client info
-
Fixed a data race in transport rebootstrap using a three-state atomic instead of a boolean flag
-
-
v1.4.10-0.20260503214925-36804444691703 May 2026 pre-releaseNothing published for this version
-
v1.4.10-0.20260503065925-315b97f6c76803 May 2026 pre-releaseNothing published for this version
-
v1.4.913 Jan 2026Release notes
Open source →Minor Release
This contains new features, improvements and bug fixes.
Added
- We’ve updated ctrld to send system metadata when calling the Control D API, allowing for a more seamless and personalized UX.
- Added new documentation for internal runtime logging to clarify how it works and how it interacts with other logging configurations.
Improvements
- Upgrade the quic-go library to v0.57.1 to resolve a critical bug in parsing HTTP3 frame header.
Fixes
- Fixed a bug where DoH3 connections were closed incorrectly, preventing ctrld from recovering during network outages.
-
v1.4.802 Dec 2025Release notes
Open source →Minor Release
This contains improvements and bug fixes.
Improvements
- Upgrade the quic-go library to v0.56.0 to improve API usability and resolve several critical bugs.
Fixes
- Fixed a bug that allowed the root domain to be passed to systemd-resolved, which subsequently caused DNS resolution failure on Linux.
- Fixed a bug where log flags were not processed during a reloading operation, causing internal runtime logging to fail after the reload completed.
-
v1.4.8-0.20260306151647-37c33315591606 Mar 2026 pre-releaseNothing published for this version
-
v1.4.706 Oct 2025Release notes
Open source →Minor Release
This contains new features and improvements.
Added
- Make RFC1918 listener spawning opt-in via --rfc1918 flag instead of automatic behavior.
- Add the Darwin 15.5 upgrade issue to the known issues documentation.
- The mobile library can now be initiated with a provision ID and custom hostname.
Improvements
- Upgrade the quic-go library to v0.54.0 to improve API usability and resolve several bugs.
Fixes
- A bug was fixed where ctrld would incorrectly listen on RFC1918 addresses associated with virtual interfaces. This behavior caused unnecessary delays in resolving DNS queries, especially when those virtual interfaces were not active.
-
v1.4.621 Aug 2025Release notes
Open source →Minor Release
This contains improvements and bug fixes.
Added
- Support for OPNsense 25.1.7 was added via a new lease file (@jquick).
Improvements
- Moved network monitoring creation to a dedicated goroutine for better performance and to ensure only a single instance is started.
Fixed
- Corrected an issue where Windows domain join status was not being detected properly.
- Addressed a bug where the upstream process check failed when attempting to process large DNS responses.
-
v1.4.524 Jul 2025Nothing published for this version
-
v1.4.5-0.20250702155021-4f4055147fdf02 Jul 2025 pre-releaseNothing published for this version
-
v1.4.5-0.20250702152632-20c8786e9c7702 Jul 2025 pre-releaseNothing published for this version
-
v1.4.416 Jun 2025Nothing published for this version
-
v1.4.4-0.20250523140915-a983dfaee2af23 May 2025 pre-releaseNothing published for this version
-
v1.4.328 Apr 2025Nothing published for this version
-
v1.4.210 Apr 2025Nothing published for this version
-
v1.4.107 Mar 2025Nothing published for this version
-
v1.4.012 Feb 2025Nothing published for this version
-
v1.3.12-0.20250106234044-3c7255569c1b06 Jan 2025 pre-releaseNothing published for this version
-
v1.3.1120 Nov 2024Nothing published for this version
-
v1.3.1029 Oct 2024Nothing published for this version
-
v1.3.10-0.20241008150849-0c78436152cd08 Oct 2024 pre-releaseNothing published for this version
-
v1.3.10-0.20240930111446-082d14a9ba5b30 Sep 2024 pre-releaseNothing published for this version
-
v1.3.10-0.20240930111430-617674ce436830 Sep 2024 pre-releaseNothing published for this version
-
v1.3.918 Sep 2024Nothing published for this version
-
v1.3.9-0.20240918154952-9cbd9b3e44e318 Sep 2024 pre-releaseNothing published for this version
-
v1.3.814 Sep 2024Nothing published for this version
-
v1.3.8-0.20240816065011-5af3ec4f7b4716 Aug 2024 pre-releaseNothing published for this version
-
v1.3.731 May 2024Nothing published for this version
-
v1.3.619 Apr 2024Nothing published for this version
-
v1.3.504 Mar 2024Nothing published for this version
-
v1.3.5-0.20240219220229-b496147ce7ce19 Feb 2024 pre-releaseNothing published for this version
-
v1.3.5-0.20240202170329-3d834f00f6ba02 Feb 2024 pre-releaseNothing published for this version
-
v1.3.5-0.20240124005757-61fb71b1fa8a24 Jan 2024 pre-releaseNothing published for this version
-
v1.3.424 Jan 2024Nothing published for this version
-
v1.3.4-0.20231219215849-30c9012004f319 Dec 2023 pre-releaseNothing published for this version
-
v1.3.319 Dec 2023Nothing published for this version
-
v1.3.3-0.20231219032845-2a23feaf4be319 Dec 2023 pre-releaseNothing published for this version
-
v1.3.213 Dec 2023Nothing published for this version
-
v1.3.111 Oct 2023Nothing published for this version
-
v1.3.1-0.20230815160325-f7d3db06c63715 Aug 2023 pre-releaseNothing published for this version
-
v1.3.015 Aug 2023Nothing published for this version
-
v1.2.2-0.20230608054837-eaf39f48a02408 Jun 2023 pre-releaseNothing published for this version
-
v1.2.108 Jun 2023Nothing published for this version
-
v1.2.1-0.20230516191705-d7a38363e6b716 May 2023 pre-releaseNothing published for this version
-
v1.2.016 May 2023Nothing published for this version
-
v1.1.5-0.20230404151555-a777c4b00f5c04 Apr 2023 pre-releaseNothing published for this version
-
v1.1.403 Apr 2023Nothing published for this version
-
v1.1.317 Mar 2023Nothing published for this version
-
v1.1.216 Mar 2023Nothing published for this version
-
v1.1.110 Mar 2023Nothing published for this version
-
v1.1.1-0.20230227171225-278baa5fb46727 Feb 2023 pre-releaseNothing published for this version
-
v1.1.1-0.20230214190913-6428ac23a0c814 Feb 2023 pre-releaseNothing published for this version