Stylized illustration of "DNS" text on a blue circuitry background

Running your own DNS server is a great way to accelerate your network’s responsiveness, reduce your reliance on public infrastructure, and benefit from extra functionality like hostname routing. Here’s how to set up a DNS server on a Linux machine using Dnsmasq.

What Is DNS?

DNS is the system that translates a domain name like to the numerical IP address of its server. This could look like Whenever you make a network request using a domain name, your system will perform a DNS lookup to determine the server address it should contact.

This adds an overhead to every request you make. Although your device will cache DNS responses, visits to new domains will incur a DNS round-trip before the actual request begins. This occurs at the level of the OS networking stack, invisible to you as the user.

ISPs usually run DNS servers. You’re probably relying on your ISP’s server if you’re using default settings on your router and devices. Other public DNS servers are available from providers such as Cloudflare and Google.

Why Run Your Own DNS?

Running your own DNS server gives you more control over your network. One common motivation is being able to configure network-level domain mappings, such as web-server to Configuring your router to use your DNS would result in any of your connected devices being able to access via http://web-server.

Having your own DNS server lets you centralize settings into one location instead of applying them individually in /etc/hosts on each device. They’ll apply to everything you connect to your network, including embedded hardware which provides no other way to customize its routing stack.

An in-house DNS server can also improve performance and provide an extra layer of resilience. Wide-scale DNS outages are not unheard of; using a custom server with a long-lived cache for critical services you interact with could help you ride out downtime at your selected upstream provider.

DNS With Dnsmasq

Dnsmasq is a lightweight DNS server that’s included with most Linux distributions. It’s also refreshingly simple to configure.

Before starting out, it’s worth thinking about what functionality you need your DNS server to provide. In this guide, we’ll look at setting up Dnsmasq with local caching, some custom domain routes, and Google’s as our upstream DNS provider.

The routing flow will look like this:

  • Network router receives a request from one of your connected devices. The router will be configured to use the Dnsmasq host as its DNS server.
  • Dnsmasq will check whether it has a defined route for the domain name, such as web-server to If the request was for http://web-server/example-page, it will send back to the router.
  • When Dnsmasq has no matching route, it will forward the DNS request to Google’s, enabling resolution on the public internet. This ensures you can still reach the wider web when using your own DNS.

You won’t need to make any config changes on your client devices. Everything behind your router will end up making DNS queries via Dnsmasq. However, it is worth noting that all popular desktop and mobile operating systems support setting a DNS server, so you could configure individual devices to use Dnsmasq without enabling it at the router level.

Getting Started

We’ll assume you’ve already got a functioning Linux machine ready to host Dnsmasq. Dnsmasq is not particularly resource-intensive – if you’ve got few client devices, it will easily run on a Raspberry Pi.

Your host should have a static IP assigned. From hereon, the IP refers to the Dnsmasq server.

Make sure Dnsmasq is installed:

# Assuming a Debian system
apt update
apt install dnsmasq

Dnsmasq’s config file is usually located at /etc/dnsmasq.conf. This is pre-populated with initial settings. Some changes need to be made for Dnsmasq to work effectively in a local network scenario. Run sudo nano /etc/dnsmasq.conf to open the file, then use the Ctrl+W keyboard shortcut to find and uncomment the following lines:


Remove the # character from the start of each line. Here’s what these settings are enabling:

  • domain-needed – This stops Dnsmasq from forwarding local names without a domain part to the upstream DNS server. In our installation, it means will be eligible for resolution via Google but example or web-server will not. It reserves dot-less names for your local network.
  • bogus-priv – Prevents forwarding DNS reverse-lookup queries to the upstream DNS server. It means internal IPs like will never be exposed to Google. Not enabling this could unintentionally leak the architecture of your internal network to your upstream provider.

To set your upstream DNS server, add a new line to your config file:


This instructs Dnsmasq to forward unresolved queries to If that server’s unavailable, will be used instead. These addresses are the primary and secondary resolvers for Google’s DNS service.

Next adjust the cache size. This defaults to a relatively low value of 150 cached requests. Increasing this will let Dnsmasq serve more lookups from the cache, reducing network latency. Find the cache-size line, uncomment it, and change its value:


Save and close the file now.

Mapping Hostnames to IPs

There are a few different ways to map hostnames to their IP addresses. The simplest is to add entries to your server’s existing /etc/hosts file. Dnsmasq automatically loads the rules from this file as part of its default configuration.

Open /etc/hosts and add your routes to the bottom of the file. The IP address comes first, followed by the name to assign: web-server gateway.lan

These lines mean any request to http://web-server will be directed to while http://gateway.lan will end up at Save and close the file when you’ve finished mapping your devices.

Testing Your Server

Restart Dnsmasq to apply all your changes:

sudo service dnsmasq restart

Check the server’s running correctly:

sudo service dnsmasq status

You should see active (running) displayed in green. If you don’t, check the log lines at the bottom of the status information to work out what’s wrong.

image of running "service dnsmasq status" on a live server

Now you’re ready to test your server. You can make manual DNS lookup attempts with the dig tool. You might need to install the dnsutils package first.

dig @localhost
dig gateway.lan @localhost

Both of these commands should show an IP address in the ANSWER SECTION. In the case of gateway.lan, the result should be according to the routing rule set up in /etc/hosts. The @localhost part of the commands instructs dig to query your local DNS server.

Configuring Your Network

The final step is to configure your network router to make DNS lookups via your Dnsmasq server. The steps for this will vary depending on the routing equipment you’re using.

Once you find the correct settings page, set your server’s IP ( in this guide) as the router’s primary DNS server. It’s a good idea to configure a public DNS provider, such as Google’s, as the secondary server. This ensures you’ll still have internet access if your DNS server crashes and goes offline.

Now all the devices connected to your router will make DNS queries via your Dnsmasq instance. They’ll be able to reach your devices by their assigned names, such as web-server and gateway.lan, and benefit from network-level DNS caching.


DNS is an intricate topic but Dnsmasq makes it easy to get a basic server operational. There are many more settings which you can explore once you’ve got the core functionality working. These let you filter queries, manage relays and proxies, run scripts when events occur, and set up other kinds of DNS record such as MX results for mail servers.

Dnsmasq doesn’t usually need much manual intervention once it’s live. You can monitor logs using service dnsmasq status or systemctl status dnsmasq. Now you’re ready to benefit from your self-hosted DNS server, maximizing performance and letting you use internal domain names to reach local network devices.

Profile Photo for James Walker James Walker
James Walker is a contributor to How-To Geek DevOps. He is the founder of Heron Web, a UK-based digital agency providing bespoke software development services to SMEs. He has experience managing complete end-to-end web development workflows, using technologies including Linux, GitLab, Docker, and Kubernetes.
Read Full Bio »