Route complete TLD (*.dev for example) to 127.0.0.1

For development purposes I want all DNS requests to the .dev TLD to forward to my own PC.

The hosts file does not suffice. I use multiple domains and also multiple subdomains. I would have to add a line for each combination.

I have read that a DNS forwarder like DNSmasq can be used to do the job (for example as described here). Also this software is already installed on Ubuntu 12.10.

The problem is that I fail to see how and where I should configure DNSmasq, i.e., where I should put this line:

address=/dev/127.0.0.1

In Ubuntu 12.10 or later you can do this with dnsmasq as run by NetworkManager.

  1. Create the directory mkdir /etc/NetworkManager/dnsmasq.d if it doesn't already exist.

    sudo mkdir /etc/NetworkManager/dnsmasq.d
    
  2. Toss the following line into /etc/NetworkManager/dnsmasq.d/dev-tld.

    address=/dev/127.0.0.1
    
  3. (Ubuntu 12.10) Restart NetworkManager.

    sudo service network-manager restart
    
  4. (Ubuntu > 13.04) Restart Dnsmasq.

    sudo service dnsmasq restart
    
  5. Enjoy the awesomeness.

enter image description here


The complete standalone dnsmasq (DHCP and DNS server) is not installed by default in Ubuntu 12.04 and 12.10, but a package called dnsmasq-base is installed by default in Ubuntu Desktop 12.04 and 12.10. The dnsmasq-base package contains the dnsmasq binary and is used by NetworkManager.

To do what you want you will need to use dnsmasq as a caching DNS server. You need to:

  • Install dnsmasq sudo apt-get install dnsmasq
  • Change your network setting, so that your computer uses itself as it dns server.
  • Make the changes to the config files:

Create /etc/dnsmasq.d/dev-tld with these contents:

local=/dev/

address=/dev/127.0.0.5

The first command says *.dev requests can't be forwarded to your real DNS server. The second says *.dev resolves to 127.0.0.5 which is localhost.

  • Restart the dnsmasq service (not network-manager)

The following worked worked for me in Ubuntu 16.04:

  1. Install dnsmasq

    sudo apt-get -y install dnsmasq
    
  2. Edit dnsmasq.conf file:

    sudo nano /etc/dnsmasq.conf
    
  3. Add your command:

    address=/dev/127.0.0.1
    

    For wild card (*) then you can use dot (.) then dnsmasq to resolve WHATEWER_YOU_PUT_HERE.yourmachine.yourdomain to the same ip. E.g., address=/.localhost.dev/127.0.0.1

  4. Restart dnsmasq service:

    sudo /etc/init.d/dnsmasq restart
    

Just installed a fresh 19.04 and the only way I got it working was disabling systemd-resolved and have NetworkManager use dnsmasq instead for DNS. NetworkManager has built in support for dnsmasq and dnsmasq-base package is installed by default.

I am pointing multiple domains to different VMs like *.customerX.test to 192.168.33.10 and *.productY.test to 192.168.33.20 and so on. I would not use *.dev anymore but instead one of the reserved top level domains.

Solution

  1. Disable systemd-resolved

     sudo systemctl disable systemd-resolved.service
     sudo systemctl stop systemd-resolved.service
     sudo rm /etc/resolv.conf
    
  2. Edit /etc/NetworkManager/NetworkManager.conf to use dnsmasq for DNS.

     [main]
     dns=dnsmasq
    
  3. Put dnsmasq configuration in /etc/NetworkManager/dnsmasq.d/test-tld.conf

     address=/test/127.0.0.1
     address=/customerX.test/192.168.33.10
    
  4. and finally restart NetworkManager which will generate a new /etc/resolv.conf

     sudo systemctl restart network-manager.service