How can I change my DNS server from the Terminal on Mac OS X? [I need this because my DNS is not working correctly with my VPN. Sometimes it's using the DNS for my main connection, and sometimes it's using the DNS specified for the VPN (which it should).]
You can use
scutil interactively from the terminal. Run
sudo scutil and run these commands, swapping your DNS servers in where appropriate:
> open > d.init > d.add ServerAddresses * 126.96.36.199 188.8.131.52 > set State:/Network/Service/PRIMARY_SERVICE_ID/DNS > quit
Instead of using
184.108.40.206 use your DNS servers.
The only problem is this is not persistent across reboots. If you want permanent changes, you'll want ncutil. The reason editing
/etc/resolv.conf isn't sufficient in newer versions of OS X is because configd now uses a database to store information of current settings, which other applications read. Certain applications will still read
/etc/resolv.conf (host for example), although that is not the case for all applications.
You can use
sudo networksetup -setdnsservers <networkservice> DNS1, DNS2, DNS3
eg (having the Airport connection use Google's DNS Servers)
sudo networksetup -setdnsservers AirPort 220.127.116.11 18.104.22.168
You can find out the name of the network service by running
networksetup -listallnetworkservices. It'll be 'Wi-Fi' probably.
This is the same as if you were to edit the entires in the Network Preference Pane in System Preferences, so it is persistent across reboots.
You may be running into a DNS issue on Snow Leopard that occurs when the order DNS servers are queried changes (see question 84144))
I don't have enough points to reply to Chealion's post but to add on to it I'd start with listing the interfaces
Once you have the interface you'd like to change you can do the below (I'm using the Wi-Fi but you can do any other interface)
sudo networksetup -setdnsservers Wi-Fi empty sudo networksetup -setdnsservers Wi-Fi 22.214.171.124 126.96.36.199 sudo killall -HUP mDNSResponder
The first line of the above will empty out the DNS settings then follow it with the DNS servers we'd like to use and finely clear the DNS cache
To verify the DNS change you can do this before and after or simply after
scutil --dns | grep 'nameserver\[[0-9]*\]'
resolv.conf does not work on OSX anymore. There is a notice right at the top of that file as follows:
# # macOS Notice # # This file is not consulted for DNS hostname resolution, address # resolution, or the DNS query routing mechanism used by most # processes on this system. # # To view the DNS configuration used by this system, use: # scutil --dns # # SEE ALSO # dns-sd(1), scutil(8) # # This file is automatically generated. #
networksetup -listallnetworkservices does not list all VPN interfaces.
Here is one way to use scutil to target the right interface:
1. Create a file
commands.txt with your commands for the interactive scutil tool.
e.g. contents for Pulse secure interface in my case:
get State:/Network/Service/net.pulsesecure.pulse.nc.main/DNS d.add ServerAddresses * 188.8.131.52 184.108.40.206 set State:/Network/Service/net.pulsesecure.pulse.nc.main/DNS
- Run scutil with the commands piped in. (You need sudo for
sudo scutil < commands.txt
You should be able to do it by editing /etc/resolv.conf (remember resolv.conf is reset after reboot), hope it helps - http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man5/resolver.5.html
If you just want to resolve certain domains over the vpn you can do this. Not sure what all versions of macos this works on but it works on Big Sur. Just replace that IP with that of your nameserver over the vpn and the filename is the domain you want to resolve there. It seems to work pretty instantaneously, you don't need to HUP anything.
sudo bash mkdir /etc/resolver cd /etc/resolver echo 10.10.10.1 > domain.tld