TechnitiumSoftware/DnsServer · error · ArgumentException

EDNS Client Subnet IPv4 Override must be an IPv4 network add

Error message

EDNS Client Subnet IPv4 Override must be an IPv4 network address.

What it means

Thrown by the EDnsClientSubnetIpv4Override property setter when the provided NetworkAddress has AddressFamily != InterNetwork (i.e. it is not an IPv4 address). If a valid IPv4 host address is provided, it is automatically converted to a network address using the current IPv4 prefix length.

Source

Thrown at DnsServerCore/Dns/DnsServer.cs:7372

            get { return _eDnsClientSubnetIPv6PrefixLength; }
            set
            {
                if (value > 64)
                    throw new ArgumentOutOfRangeException(nameof(EDnsClientSubnetIPv6PrefixLength), "EDNS Client Subnet IPv6 prefix length cannot be greater than 64.");

                _eDnsClientSubnetIPv6PrefixLength = value;
            }
        }

        public NetworkAddress EDnsClientSubnetIpv4Override
        {
            get { return _eDnsClientSubnetIpv4Override; }
            set
            {
                if (value is not null)
                {
                    if (value.AddressFamily != AddressFamily.InterNetwork)
                        throw new ArgumentException("EDNS Client Subnet IPv4 Override must be an IPv4 network address.", nameof(EDnsClientSubnetIpv4Override));

                    if (value.IsHostAddress)
                        value = new NetworkAddress(value.Address, _eDnsClientSubnetIPv4PrefixLength);
                }

                _eDnsClientSubnetIpv4Override = value;
            }
        }

        public NetworkAddress EDnsClientSubnetIpv6Override
        {
            get { return _eDnsClientSubnetIpv6Override; }
            set
            {
                if (value is not null)
                {
                    if (value.AddressFamily != AddressFamily.InterNetworkV6)
                        throw new ArgumentException("EDNS Client Subnet IPv6 Override must be an IPv6 network address.", nameof(EDnsClientSubnetIpv6Override));

View on GitHub (pinned to d0484b6c1e)

Solutions

  1. Provide an IPv4 NetworkAddress (e.g. from an IPAddress in InterNetwork family).
  2. Use the IPv6 override property (EDnsClientSubnetIpv6Override) for IPv6 addresses.
  3. Validate AddressFamily before assignment.

Example fix

// before
server.EDnsClientSubnetIpv4Override =
    new NetworkAddress(IPAddress.Parse("2001:db8::1"), 24); // throws

// after
server.EDnsClientSubnetIpv4Override =
    new NetworkAddress(IPAddress.Parse("203.0.113.5"), 24);
Defensive patterns

Strategy: type-guard

Validate before calling

if (overrideAddr is not null && overrideAddr.AddressFamily != AddressFamily.InterNetwork)
    throw new InvalidOperationException("IPv4 override must be an IPv4 address.");
server.EDnsClientSubnetIpv4Override = overrideAddr;

Type guard

static bool IsIpv4NetworkAddress(NetworkAddress n) =>
    n is null || n.AddressFamily == AddressFamily.InterNetwork;

Try / catch

try { server.EDnsClientSubnetIpv4Override = addr; }
catch (ArgumentException) { addr = new NetworkAddress(IPAddress.Any, prefix); server.EDnsClientSubnetIpv4Override = addr; }

Prevention

When it happens

Trigger: Setting server.EDnsClientSubnetIpv4Override to a NetworkAddress wrapping an IPv6 address (AddressFamily.InterNetworkV6).

Common situations: Passing an IPAddress.Parse result of an IPv6 string into the IPv4 override; reusing a single override variable for both families; config file mislabeling.

Related errors


AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13). Data as JSON: /api/errors/86b82025171bb55e. Report an issue: GitHub.