When delegating reverse DNS entries, you are normally limited by the byte-boundaries of an IP address. This means that you are not able to delegate a subnet that is smaller than /24 to another DNS server. For that reason, https://datatracker.ietf.org/doc/html/rfc2317 exists, which explains a way to accomplish classless subnet delegation. This would work, in theory, for all subnet sizes that exist.
In this post, I want to show a practical example of how one would set this up. Both for the delegating party (e.g., a hosting provider) and the delegation receiver (e.g., a subnet customer). This post is also my personal reference since I find this topic quite hard to understand and did not find many resources. Iâll be using internal IPs, but this should be applicable to any IP ranges.
The Setup
We assume the following setup:
- Provider nameservers: ns1.provider.com, ns2.provider.com
- Customer nameservers: ns1.customer.com, ns2.customer.com
- Provider Subnet: 192.168.10.0/24
- Customer Subnet: 192.168.10.64/26
The provider now wants to delegate the customerâs range to the customerâs nameserver, but â how? Simply put, we rely on CNAME and NS records to achieve this. Since the provider controls the 10.168.192.in-addr.arpa zone, they can create and choose any subdomains. Strictly speaking, there are no limits to how this subdomain would be built, but common techniques imply the usage of slashes or dashes.
Letâs first focus on the slash-method:
The provider would create 2 NS records:
64/26.10.168.192.in-addr.arpa NS ns1.customer.com 64/26.10.168.192.in-addr.arpa NS ns2.customer.com
Since the provider controls the zone, this is a totally valid record. Itâs not a valid rDNS Address, but it doesnât need to be.
When using a dash, we can use the start- and end-address and describe it as an actual range:
64-127.10.168.192.in-addr.arpa NS ns1.customer.com 64-127.10.168.192.in-addr.arpa NS ns2.customer.com
Now, the provider needs to redirect queries that are in the customerâs range to the customerâs nameservers. This is done by adding a CNAME record for every IP in the range. This is not beautiful, but itâs the only way that is universally understood and defined in the RFCs.
64.10.168.192.in-addr.arpa CNAME 64.64-127.10.168.192.in-addr.arpa
65.10.168.192.in-addr.arpa CNAME 65.64-127.10.168.192.in-addr.arpa
66.10.168.192.in-addr.arpa CNAME 66.64-127.10.168.192.in-addr.arpa
67.10.168.192.in-addr.arpa CNAME 67.64-127.10.168.192.in-addr.arpa
...
125.10.168.192.in-addr.arpa CNAME 125.64-127.10.168.192.in-addr.arpa
126.10.168.192.in-addr.arpa CNAME 126.64-127.10.168.192.in-addr.arpa
127.10.168.192.in-addr.arpa CNAME 127.64-127.10.168.192.in-addr.arpa
Over at the customerâs nameserver, a zone needs to be created that matches the name of the NS entries created by the provider. Letâs continue with the dash (range) approach, meaning the customer needs to create a zone 64-127.10.168.192.in-addr.arpa. Now, normal PTR records can be created in this zone, which will resolve correctly:
67.64-127.10.168.192.in-addr.arpa PTR customer-website.com.
When a query for 67.10.168.192.in-addr.arpa hits the providerâs nameserver (since itâs the authority for the 10.168.192.in-addr.arpa zone), it gets redirected by the CNAME RR, leading to a lookup at the customerâs nameserver.
It should be noted that this is a way to scale very well, meaning providing the subnet size or IP range directly in the CNAME records is not prone to errors since youâre literally writing out what you are delegating. In theory, the provider could also decide to name the NS records customer.10.168.192.in-addr.arpa â Itâs literally not important what the name is, just that itâs the same across all occurrences and all nameservers involved in the delegation.
Et voilà , this way, we can delegate single IPsâ whole or partial subnets to another nameserver, even when hitting a byte boundary.