Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Setup dnsmasq on OS X

Never touch your local /etc/hosts file in OS X again

To setup your computer to work with *.test domains, e.g. project.test, awesome.test and so on, without having to add to your hosts file each time.

Requirements

Install

brew install dnsmasq

Setup

Create config directory

mkdir -pv $(brew --prefix)/etc/

Setup *.test

echo 'address=/.test/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf

Change port for High Sierra

echo 'port=53' >> $(brew --prefix)/etc/dnsmasq.conf

Autostart - now and after reboot

sudo brew services start dnsmasq

Add to resolvers

Create resolver directory

sudo mkdir -v /etc/resolver

Add your nameserver to resolvers

sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/test'

Finished

That's it! You can run scutil --dns to show all of your current resolvers, and you should see that all requests for a domain ending in .test will go to the DNS server at 127.0.0.1

N.B. never use .dev as a TLD for local dev work. .test is fine though.

@ogrrd
Copy link
Author

ogrrd commented Aug 19, 2013

@hackzilla Let me know if it does and I can update the gist. It works with the step in so I haven't tried it without, but I get what you're saying.

@hackzilla
Copy link

hackzilla commented Aug 19, 2013

apparently it doesn't

@tejasmanohar
Copy link

tejasmanohar commented May 22, 2014

Would you translate/convert sudo cp -v $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons for MacPorts users? Is this a one-time run or per reboot?

@PacoH
Copy link

PacoH commented May 25, 2016

Hi. Although this MAY be useful, it isn't very helpful if you don't explain how each command works explicitly. Just blindly copying and pasting commands like this, without knowing what each one will do, is never a good idea.

BTW on my machine, /usr/local/etc/ already exists.

@zl3ag
Copy link

zl3ag commented Sep 19, 2016

Also, be aware that .dev exists as a "real" TLD in the ICANN root, so you should probably come up with a different TLD

https://newgtlds.icann.org/en/program-status/delegated-strings

@m-miller
Copy link

m-miller commented Jun 16, 2017

Will this override any hosts entries already in place or VM defined hosts?

@tobybot
Copy link

tobybot commented Jun 28, 2017

to follow up the comment from September: .dev does exist, and anyone reading this far down should change to use .test, which is reserved by icann for just such purposes.

also i don't believe this will override host entries in place but i could be wrong about that!

@jianping-roth
Copy link

jianping-roth commented Jul 24, 2017

I use macOS Sierra, I have to remove strict-order from my configuration in order for srv-host to work.

@jntme
Copy link

jntme commented Jul 28, 2017

Fell too for the .dev TLD trap. Plase, change this in your gist.

@c835722
Copy link

c835722 commented Aug 19, 2017

Having .dev in TLD also preventev my docker-machine env dev from functioning.

@eugeneware
Copy link

eugeneware commented Aug 26, 2017

Remember to NOT delete your old DNS servers from MacOS network preferences. Add 127.0.0.1 to the list and move it to the top. When you hit the + button it deletes the DNS entries by default from the list, so note them down, and add them back in, but add 127.0.0.1 to the top.

@eugeneware
Copy link

eugeneware commented Aug 26, 2017

Also, if the DNS entries you're trying to create don't actually exist, then you don't need to add 127.0.0.1 to your network preferences DNS order. If your domain suffix is blah, make sure that you add the nameserver 127.0.0.1 to /etc/resolver/blah for the OS X resolver fallback to work.

See this for more info.

@matteocng
Copy link

matteocng commented Sep 25, 2017

Thanks for this. As previously suggested, it is not recommended to use .dev, see dont use dev for development for additional info and recommendations (tl:dr .localhost, .invalid, .test, .example are discussed).

@johnny77221
Copy link

johnny77221 commented Sep 26, 2017

I couldn't get it work when adding it to LaunchDaemons, even add an execution as user setting
so I'll have to manually run sudo /usr/local/opt/dnsmasq/sbin/dnsmasq --keep-in-foreground after login and it works well
(I am using mac Sierra 10.12.6)

@Bahir
Copy link

Bahir commented Oct 6, 2017

I followed the setup doing my local dnsmasq network listening on Ethernet interface (10.0.0.11).
But after reboot dnsmasq is on the list of running provesses but I have to restart it manually each time I boot up the system.
After that it works.
I have no idea why it is but I have an idea that dnsmasq is runned before Ethernet going up.
That resolves why after restart the service helps.

Copy link

ghost commented Dec 13, 2017

https://stackoverflow.com/a/47744259/6629

from chrome 63+, domain names ending in .DEV get forcibly redirected to https://. It is recommended to use .TEST as the TLD for local domains.

@mcurren
Copy link

mcurren commented Dec 14, 2017

^^ correct

Copy link

ghost commented Dec 19, 2017

Instead of altering the LaunchDaemons manually, you can use the convenient brew services.

@runlevel5
Copy link

runlevel5 commented Jan 4, 2018

FYI Google has claimed the .dev domain, I now use .test instead

@tishma
Copy link

tishma commented Apr 18, 2018

I've had this successfully working a few years ago on yosemite, but recently I realized it fails on sierra.

manually running the dnsmasq binary (instead of loading plist daemon file) helped as it did show the reason why it failed.

brew installation doesn't seem to create /usr/local/var/run/dnsmasq/ dir required for the daemon to run. after creating this dir - it works again.

@g4macgregor
Copy link

g4macgregor commented Aug 28, 2018

I have set everything up accordingly, and have the /usr/local/var/run/dnsmasq/dnsmasq.pid with nobody:nobody. Should this be the same user:group as httpd is running?

@cdaringe
Copy link

cdaringe commented Jan 25, 2019

missing from these instructions is how to have a domain try to resolve thru dnsmasq first, then continue to use the system DNS resolvers next. i'd love to see a recipe on how to configure that!

@webknjaz
Copy link

webknjaz commented Jun 10, 2020

@ogrrd please add a big note your gist saying that people mustn't use .dev as it's a gTLD.

@ogrrd
Copy link
Author

ogrrd commented Oct 23, 2020

Thanks everybody for leaving these messages to help people who were caught in this horrifically outdated guide. I feel ashamed that I left it like this for so long to make the internet a more confusing place!

I have removed the contents of this gist now and left the link to what in 2018 seemed to be better.

I want to apologise to anyone who I caused problems for by them following this guide!

@ogrrd
Copy link
Author

ogrrd commented Oct 23, 2020

@ogrrd please add a big note your gist saying that people mustn't use .dev as it's a gTLD.

Done. 😬

@ogrrd
Copy link
Author

ogrrd commented Oct 23, 2020

Change of plan. Seeing as this page comes up for searches, I have amended it with purportedly working contents from the fork by @brablc.

@miraclebg
Copy link

miraclebg commented Feb 27, 2021

The issue is caused by Internet sharing - disable it and port 53 will not be used by mDNSesponder!

@encryptblockr
Copy link

encryptblockr commented Apr 12, 2021

scutil --dns shows that DNS queries for specific domains should be routed via the specified nameservers but this is not working
what could be wrong?

using macos big sur
followed everything as directed

@brablc
Copy link

brablc commented Apr 18, 2021

And dnsmasq is running:

 $ sudo brew services
Name    Status  User Plist
dnsmasq started root /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

And taking connections?

 $ nmap -p 53 127.0.0.1
PORT   STATE SERVICE
53/tcp open  domain

@eddideku
Copy link

eddideku commented Sep 2, 2022

Whats the significance of the resolver?

Has anyone used dnsmasq to setup a pre-production testing scenario?

For example:

mylivesite.com is on server 1.2.3.4
mylivesite.com is also migrated to a different server with updates on server 2.2.2.2

I can do this in /etc/hosts file easily enough, however I need to make sure subdomains are working, ideally it would be nice to use dnsmasq's wildcard feature that /etc/hosts can't utilize

echo 'address=/.mylivesite.com/2.2.2.2' >> $(brew --prefix)/etc/dnsmasq.conf

Right now, I can't figure out how to do this with dnsmasq, it's routing to the old server (ie 1.2.3.4)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment