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.

link|improve this question
feedback

7 Answers

up vote 8 down vote accepted

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

You can confirm that the rule addition is successful by checking scutil --dns

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

EDIT

The above solution longer appears to work in OS X 10.7 Lion when offline. If you are using dnsmasq, you can redirect whole top level domains with the --address option:

# dnsmasq --address=/dev/127.0.0.1

Or in the config file:

address=/dev/127.0.0.1

This would redirect all domains in the dev tld back to the local machine.

link|improve this answer
That is exactly what pow is using (pow.cx). – daeltar Sep 5 '11 at 9:00
but unfortunately it does not work - github.com/37signals/pow/issues/104 – daeltar Mar 14 at 12:54
Yes, I think this stopped working in OS X 10.7. I've since moved to using dnsmasq --address=/dev/127.0.0.1 which is a better solution if you're using dnsmasq. – guns Mar 16 at 1:26
feedback

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.

link|improve this answer
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. – guns Jul 26 '10 at 20:45
feedback

(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.

link|improve this answer
feedback

Does OSX have the /etc/dhcp3/dhclient.conf configuration file that normal Linux/UNIX DHCP client configurations have?

If so, it should have a line you can uncomment for

prepend domain-name-servers 127.0.0.1;

to have the DHCP client always add that line to your resolv.conf

link|improve this answer
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. – daeltar Jun 10 '09 at 9:34
feedback

It might help to just put

127.0.0.1       localhost

into /etc/hosts, so it doesn't need to resolver to find localhost.

link|improve this answer
1  
I need it for subdomains, so this is no no. – daeltar Jun 10 '09 at 9:32
feedback

Try adding a second ethernet service configured with a static address and 127.0.0.1 as your DNS server. Or, add a network Location which sets your DNS server to 127.0.0.1. Both of these changes would be made in "System Preferences" under the "Network" panel.

link|improve this answer
feedback

One option is to create your own wireless network. Not ideal because it drains batteries, but better than nothing. Still looking for better solution...

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.