Set DNS server on OS X even when without internet connection

23,338

Solution 1

SEE UPDATE BELOW!

I also enjoy using Dnsmasq on my local machine, and I had this problem too. Here is the solution:

From man 5 resolver:

The configuration for a particular client may be read from a file
having the format described in this man page. These are at present
located by the system in the /etc/resolv.conf file and in the files
found in the /etc/resolver directory.

/etc/resolver/ is not present by default; you must create it yourself.

Also from the man page:

domain
  Domain name associated with this resolver configuration. This
  option is normally not required by the Mac OS X DNS search system
  when the resolver configuration is read from a file in the
  /etc/resolver directory. In that case the file name is used as the
  domain name.

So if you wanted all dns queries for the top level domain of dev to be routed to the local nameserver, you would:

# mkdir /etc/resolver
# echo 'nameserver 127.0.0.1' > /etc/resolver/dev

configd does not alter files in /etc/resolver/, so this setting will persist through network changes and reboots.

UPDATE 17 July 2012

Unfortunately, as of OS X Lion, the top resolver (as shown by scutil --dns) disappears when no interfaces are active:

# scutil --dns # Online
DNS configuration

resolver #1
  nameserver[0] : 127.0.0.1

...

resolver #8
  domain   : dev
  nameserver[0] : 127.0.0.1

# scutil --dns # Offline
DNS configuration

resolver #1

...

resolver #8
  domain   : dev
  nameserver[0] : 127.0.0.1

Notice that resolver #1 is empty, but that the /etc/resolver derived nameserver entry remains.

It turns out that since you can specify the resolver domain directly in the /etc/resolver/ file, specifying the special Internet root domain . causes the creation of a global resolver entry that looks like:

resolver #8
  nameserver[0] : 127.0.0.1

Now all DNS queries are routed to localhost, even when offline.

Of course, you will still have to resolve your chosen domains as 127.0.0.1 using something like dnsmasq's --address option:

# dnsmasq --address=/dev/127.0.0.1

In summary:

  • Set all your network interface dns servers to 127.0.0.1:
    networksetup -setdnsservers Ethernet 127.0.0.1
    networksetup -setdnsservers Wi-Fi 127.0.0.1
    ...
  • Create a file /etc/resolver/whatever:
    nameserver 127.0.0.1
    domain .
  • Set up a local DNS server and be happy.

cf. http://opensource.apple.com/source/configd/configd-395.11/dnsinfo/dnsinfo_flatfile.c

Solution 2

Why not make the entries in /etc/hosts instead? I'm having trouble thinking of a situation where you'd need to actually be running a full blown DNS server. I use host file entries all the time to accomplish things like this on my Macs.

The resolver in OS X works differently than that in Linux or other Unixes. This is probably part of what's causing you grief. Like for instance it has a preferences for which method of resolution to use first and it caches the results of all queries for a period of time.

Have you added the DNS server to the interface in the Network preference pane? This should ensure that the resolver uses that server for it's queries should it decide to look for a DNS entry.

Solution 3

(answering b/c I can't comment yet...)

How are you going offline?

(best answer I got right now)

# man -S 5 resolver
 .
 .
 .
 Note that the /etc/resolv.conf file,
 which contains configuration for the default (or "primary") DNS resolver
 client, is maintained automatically by Mac OS X and should not be edited manu-
 ally.  Changes to the DNS configuration should be made by using the Network
 Preferences panel.

So, you should be able to enter something in the UI, and it should stick. I had done this a couple times when I had not like the DNS server my local DHCP server provides.

Share:
23,338

Related videos on Youtube

daeltar
Author by

daeltar

You can read my blog or follow me on twitter.

Updated on September 17, 2022

Comments

  • daeltar
    daeltar over 1 year

    I have installed, configured DNS server(local instance of Dnsmasq) which resolves to localhost as I want, all OK.

    When I go offline, it stops working, because OS X empty content of resolv.conf and ignore attempt to reflect changes in this file.

    Any idea, how to configure DNS even when offline?

    Similar issue(unresolved): http://blog.steamshift.com/geek/leopard-lookupd-and-local-web-development-sites

    Main motivation is ease development of RoR application which uses subdomains as account keys. And you can not use 127.0.0.1 *.yourapp.local in /etc/hosts. Some guy registered domain smackaho.st and srt DNS for it like .smackaho.st at 127.0.0.1 but still, you can not use it when you are working offline.

    EDIT: tried scutil command, but it seems you can change DNS if offline

    NOTE: when you have all interfaces down, you cannot set DNS servers in Pref. panel.

  • daeltar
    daeltar almost 15 years
    I need it for subdomains, so this is no no.
  • daeltar
    daeltar almost 15 years
    Adding to resolv.conf is not helping on OS X. Content of resolv.conf is generated and itself is symlink on /var/run/resolv.conf and even when I change /var/run/resolv.conf it does not reflect changes.
  • guns
    guns almost 14 years
    One reason to use a DNS forwarder on a client machine is to maintain a large blacklist of ad/malware domains without suffering the performance penalty of the resolver daemon grepping the now bloated hosts file on every request. The merits of this approach notwithstanding, dnsmasq loads /etc/hosts into memory where the lookup time will be miniscule. Also, if you do web development, it allows you to avoid the small nuisance of adding local domains for every site you are working on.
  • daeltar
    daeltar over 12 years
    That is exactly what pow is using (pow.cx).
  • daeltar
    daeltar about 12 years
    but unfortunately it does not work - github.com/37signals/pow/issues/104
  • Fabian Zeindl
    Fabian Zeindl almost 12 years
    Changing the DNS-configuration in NetworkPreferences changes the /etc/resolv.conf file.
  • guns
    guns almost 12 years
    @daeltar: Updated answer with a solution
  • James John
    James John over 11 years
    When I'm offline, the /etc/resolver rule catches resolution requests. However, I am finding that each time I connect to Wi-Fi or ethernet, I must run the corresponding -setdnsservers command (on OSX 10.8). This seems to be because the DNS servers provided by a network's DHCP server overwrite the manual settings. I wonder if there is a way to set the precedence of the resolver rule so that it is higher than any of the other resolvers.
  • amateur barista
    amateur barista about 10 years
    @EricDrechsel, when you set search_order 1000, does the custom resolver get listed higher (with DHCP On), or does it still appear at the bottom (ie resolver #8)? I tried your search order solution and DHCP would still be superceding me.
  • Lenciel
    Lenciel over 9 years
    @MatthewLee same issue here after updated to yosemite, any progress?
  • MatthewLee
    MatthewLee over 9 years
    @Lenciel unfortunately, no. I figure if I am working on a site without an internet connect I will just need to add the domain name to my hosts files the old fashioned way...
  • Lenciel
    Lenciel over 9 years
    @MatthewLee, yes you are right, it seems the only work around is adding entries in the hosts file.
  • jmagnusson
    jmagnusson about 9 years
    Anyone found a solution for Yosemite yet?