Releases: Control-D-Inc/ctrld
Release v1.5.0
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
Release v1.4.9
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.
Release v1.4.8
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.
Release v1.4.7
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.
Release v1.4.6
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.
Release v1.4.5
Minor Release
This contains new features, and improvements..
Added.
- Major version upgrades are prohibited to avoid introducing breaking changes
Fixed
- Support Merlin 3006 base firmware.
- Support Ubios 4.3+.
- Addressed a regression preventing ctrld start from successfully initializing with an empty positional argument.
Release v1.4.4
Minor Release
This contains new features, improvements, and bug fixes..
Added.
ctrldwill now preserve search domains settings.
Improved
- To enhance security on Windows and macOS desktop environments,
ctrldno longer listens on the broad 0.0.0.0 address by default, thus preventing potential DNS amplification and abuse. - The OS resolver now incorporates a Singleflight pattern, effectively de-duplicating repeated queries to the upstream and significantly reducing network operations. Furthermore, a hot cache is implemented to provide short-term storage of query responses.
- Make IPv6 detection more reliable by not relying exclusively on DNS port availability.
- Make TLS certificate verification error messages more helpful when the certificate's issuing authority is unknown.
Fixed
- Corrected an issue with incorrect Edns0 client cookie setting for cached DNS answers.
- Corrected an issue causing
ctrld reloadcommand emits an invalid error message.
Release v1.4.3
Minor Release
This contains new features and bug fixes.
Added.
ctrldwill now consider the/etc/resolv.conffile as a source for DNS configuration on all Unix-like systems.
Fixed
- Corrected an issue causing ctrld to fail to bootstrap upstreams when DNS is unavailable.
Release v1.4.2
Minor Release
This contains new features, some performance improvements and bug fixes.
Added
- The ctrld binary will now perform self-upgrades to the latest stable version, as defined by a target version specified via the API.
- Implemented a new dnsmasq configuration manipulation routine for Merlin routers, optimizing compatibility across diverse Merlin hardware platforms.
- Ability to run on a machine with no working DNS (ctrld will establish direct IP HTTPS connections)
Improved
- The IPv6 availability check mechanism was enhanced to trigger based on network change events, thereby eliminating the need for periodic polling.
- The client discovery feature has been deactivated for desktop environments, encompassing Windows Desktop and macOS, thereby preventing the execution of redundant background discovery routines.
- The golang.org/x/net dependency has been upgraded to v0.38.0 to remediate the vulnerability identified as GO-2025-3503 and CVE-2025-22872.
- LAN query performance has been significantly improved.
- To ensure consistent shutdown behavior, ctrld now handles OS service manager stop signals identically to the
ctrld stopcommand. - Legacy queries are no longer sent to ControlD bootstrap DNS.
ctrldnow implements direct IP address resolution for ControlD assets as a failover strategy when domain resolution fails.
Fixed
- Addressed an issue that prevented the ctrld start command from restoring DNS following a failed self-check.
Release v1.4.1
Minor Release
This contains new features, some performance improvements and bug fixes.
Added
- This release adds support for OpenWrt 24.10 and newer versions, accommodating the updated dnsmasq configuration.
Improved
- The IPv6 checking mechanism has been redesigned to mitigate a potential Denial-of-Service (DoS) vulnerability affecting the Control D server.
ctrldfunctionality is now extended to systems where a default route is not present, such as those employing VPNs or recent FreshTomato releases.- Only SRV queries for LAN hostnames are resolved locally by the operating system. Non-LAN queries are forwarded to a remote upstream server if no matching rules are defined.
Fixed
- Fixed the problem where DNS configuration changes were not always being applied by systemd-resolved.
- Fixed the bug causing the
leak_on_upstream_failure=falseconfiguration to have no impact. - Fixed the bug preventing ubios discovery from working after a system restart on UDM devices.
- Fixed the bug that caused runtime logs to be incorrectly formatted or missing.
- Fixed the bug where static DNS configuration on interfaces was ignored.
- Fixed a bug that prevented static DNS configurations from being restored after service stop/uninstall
- Fixed the bug causing HTTP transport failures after a network stack change.
- Fixed the bug that resulted in the OS resolver not using public DNS servers for LAN queries.
- Fixed the problem where Windows DNS forwarders were not always set correctly after system reboot.
- Fixed an issue where invalid remote custom configurations were not properly validated.