Windows DHCP and Local DNS

In my prior tutorial entitled “NginX Proxy Manager and Local DNS”, we learned how to configure a Pihole for local DNS resolution for local network server instances. We took that a step further by creating Local DNS records for our subdomain named services and pointing them to Pihole.

This provides local access to self-hosted services complete with self-signed SSL certificates that can be accessed locally even when your ISP connection is down.

This presentation compares DNS name resolution in Linux with Windows. Linux allows specifying DNS servers manually and the end user can specify the order. The command to edit the DNS servers used in Linux is:

sudo nano /etc/resolvconf/resolv.conf.d/head

If the command above does not find the file, you may need to install resolvconf:

sudo apt install resolvconf

You can examine the current Linux DNS servers with the following command, but you should never edit this file directly and instead use the command above.

cat /etc/resolv.conf

If you made any changes to the DNS servers you are using, you need to perform the following commands.

sudo systemctl restart resolvconf.service
sudo systemctl restart systemd-resolved.service

Linux resolves IPv4 & IPv6 correctly. Microsoft says that they are following RFC 3484 for the prioritization of IP traffic and that IPv6 traffic has priority. It’s noteworthy that Microsoft is the author of RFC 3484.

In a dual IPv4/IPv6 network configuration, Windows 10/11 place all IPv6 DNS resolvers before DNS IPv4 resolvers. This can have unintended results as detailed in the tutorial.

In my tests, I was unable to achieve local DNS resolution until I manually applied my IPv6 address of my Pihole to Windows.

Most routers provide a way to designate IPv4 DNS servers manually and these settings are passed to DHCP clients.

Most routers will also provide the same settings for IPv6 DNS servers and so I provided the DHCPv6 address of the Pi-hole in the router.

Unfortunately, Windows 10/11 seem to ignore the values at the router. So, I ended up configuring the DHCPv6 settings in Windows to manually specify the Pihole and it was able to resolve both addresses from the Pi-hole.

It is noteworthy that in my example, I was performing a look up on my rocketchat server and I had to place a period at the end to get it to resolve which was not required in Linux.

nslookup rocketchat.

With the IPv6 manual entry of the DNS servers in the screenshot, we are now able to translate one of my subdomain service names and have it resolve to the local address. Note that in my tutorial “NginX Proxy Manager and Local DNS” we created subdomain entries in the Pihole DNS to point to the address of my NginX Proxy Manager in order to have local service access with SSL in the event of an Internet service outage and just to speed local access.

So in my case:

nslookup chat.scottibyte.com

will translate to the local address of my NPM at 172.16.1.215 and not my WAN address which was the goal. It’s just a shame that we had to jump through so many hoops to achieve this in Windows.