398

How can I check which DNS server am I using (in Linux)? I am using network manager and a wired connection to my university's LAN. (I am trying to find out why my domain doesn't get resolved)

1
  • 1
    The Linux kernel itself is not aware about DNS services. To answer it's better to know your userland. What distribution are you using? Ubuntu? Debian GNU/Linux? Centos? May 18, 2021 at 7:49

14 Answers 14

308

You should be able to get some reasonable information in:

$ cat /etc/resolv.conf 
9
  • 42
    However, please be aware that (on modern Linuxen) the contents of /etc/nsswitch.conf dictate what name services are used (DNS, LDAP, etc) and in what order. Say fgrep hosts: /etc/nsswitch.conf. If it only references DNS, /etc/resolv.conf is the right place to look for your nameservers. But chances are you're also using mDNS (aka ZeroConf, aka Avahi, aka Bonjour, etc), etc. In that case, things depend on what you're using.
    – Alexios
    Jan 12, 2012 at 13:35
  • 71
    This file typically points at 127.0.1.1 on Ubuntu - it's the local DNS cache server, not the actual upstream. Mar 8, 2016 at 10:24
  • 4
    And if you have several upstream server configured ? How to know which one is currently used ? Nov 24, 2016 at 23:31
  • 8
    See the answers by @G32RW or @Lonniebiz for a more robust approach under various circumstances, e.g. when you get an answer like 127.0.0.53
    – nealmcb
    Nov 11, 2018 at 22:13
  • 6
    This solution is no more up to date. I find the systemd-resolve --status suggested by @G32RW most up-to-date solution for this problem. Mar 27, 2019 at 15:59
302

Here's how I do it:

( nmcli dev list || nmcli dev show ) 2>/dev/null | grep DNS

This worked previous to the way above:

nm-tool | grep DNS

On Debian, you need to have the network-manager package installed.

12
  • 19
    This one is usefull if you are using VPN and NetworkManager. Your /etc/resolv.conf will point to your machine, with dnsmasq resolving names as configured by NetworkManager. May 30, 2013 at 11:32
  • 7
    On Debian this requires the network-manager package. Feb 3, 2015 at 19:44
  • 3
    nm-tool is not available in newer linuxes. for example it is not in the 'network-manager' package of debian 8.
    – don bright
    Oct 31, 2015 at 15:06
  • 2
    I've updated the answer to reflect what's working for me in 2016. Sep 1, 2016 at 16:36
  • 2
    This did not work for me on an Ubuntu VM. nmcli dev show did not have the DNS info. However, systemd-resolve --status did have the real DNS server. unix.stackexchange.com/a/434756
    – wisbucky
    Nov 14, 2018 at 2:22
167

On systems running systemd use:

systemd-resolve --status

Or:

resolvectl
12
  • 12
    systemd-resolve: unrecognized option '--status'
    – Asclepius
    Apr 1, 2018 at 18:03
  • 16
    Says Failed to get global data: Unit dbus-org.freedesktop.resolve1.service not found.
    – xji
    Apr 12, 2018 at 11:19
  • 16
    This is the new default way to do it in Ubuntu 18.04 Bionic Beaver - get used to it, everybody! Apr 24, 2018 at 20:32
  • 10
    This is the only solution that worked for me, as the others returned 127.0.0.53
    – greuze
    Oct 25, 2018 at 7:50
  • 2
    What am I reading? I only see DNSSEC records.
    – rosstex
    May 2, 2020 at 16:22
108

I think you can also query DNS and it will show you what server returned the result. Try this:

dig yourserver.somedomain.xyz

And the response should tell you what server(s) returned the result. The output you're interested in will look something like this:

;; Query time: 91 msec
;; SERVER: 172.xxx.xxx.xxx#53(172.xxx.xxx.xxx)
;; WHEN: Tue Apr 02 09:03:41 EDT 2019
;; MSG SIZE  rcvd: 207

You can also tell dig to query a specific DNS server by using dig @server_ip

6
  • 13
    On Debian this requires the dnsutils package. Jan 14, 2012 at 20:54
  • 9
    If you use any DNS masking/caching service that is run on your local machine, it will hide the real DNS servers.
    – karatedog
    Sep 7, 2015 at 9:12
  • 19
    Ubuntu 18.04 just shows the local dns cache: SERVER: 127.0.0.53#53(127.0.0.53)
    – wisbucky
    Nov 14, 2018 at 2:16
  • 2
    This only tells you which server was used for that query. It doesn't tell you all the DNS servers that your host might use. Nov 28, 2021 at 1:14
  • 1
    Beware that this obviously fails if the DNS server is not available. That's not a common thing, but I've managed to get a bad result or timeout when looking for a DNS server running on IPv6 (using dig -6). Oct 27, 2022 at 13:03
84

Just do an, nslookup. Part of its results include the server that it's using.

In the example below, it shows that the DNS server used is at 8.8.8.8.

$ nslookup google.com
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.22.174
5
  • 9
    On Debian this requires the dnsutils package. Aug 13, 2017 at 7:00
  • 21
    On a recent Ubuntu, this again points to the local cache server 127.0.0.1 as already hinted at in this comment
    – FriendFX
    Dec 1, 2017 at 1:50
  • In CentOS 7 it quits with error, but it is a vm so I did nslookup google.com in the Windows host and I found the nameserver. Add it in /etc/resolv.conf like: nameserver xx.xx.xx.xx and restart service network, and all is fine. Praise you.
    – WesternGun
    May 3, 2018 at 15:22
  • Note that Nslookup is deprecated
    – Daniel
    Mar 13, 2020 at 1:22
  • 1
    Didn't work: Server: 127.0.0.53, Address: 127.0.0.53#53 May 26, 2021 at 19:38
24

With the new network-manager command nmcli, do this:

nmcli --fields ipv4.dns,ipv6.dns con show [connection_name]

On newer versions of network-manager (such as in Ubuntu 16.04), the field names are slightly different:

nmcli --fields ip4.dns,ip6.dns con show [connection_name]

If you don't know the connection name, use:

nmcli -t --fields NAME con show --active

For example, on old versions of nmcli :

$ nmcli --fields ip4.dns,ip6.dns con show 'Wired connection 1'
IP4.DNS[1]:                             172.21.0.13
IP4.DNS[2]:                             172.21.0.4
7
  • My results: order «con» «show» is not valid. Jan 30, 2016 at 22:03
  • It works fine for me with network-manager 1.0.4 on Ubuntu 15.10. Maybe you have an older version?
    – Sameer
    Mar 17, 2016 at 5:40
  • The tabular format is pretty bad. I hope to get a column like format similar to Powershell. Mar 14, 2017 at 6:42
  • 2
    Returns Error: invalid field 'ip4.dns'; allowed fields: NAME,UUID,TYPE,TIMESTAMP,TIMESTAMP-REAL,AUTOCONNECT,AUTOCONNECT-PRIORITY,READONLY,DBUS-PATH,ACTIVE,DEVICE,STATE,ACTIVE-PATH.
    – FriendFX
    Dec 1, 2017 at 1:53
  • 1
    @FriendFX In newer versions of nmcli, the command is : nmcli --fields ip4.dns,ip6.dns dev show
    – SebMa
    Nov 19, 2020 at 10:36
14

to get the first DNS SERVER (IP only) :

cat /etc/resolv.conf|grep -im 1 '^nameserver' |cut -d ' ' -f2
  • cat will output DNS config
  • grep filters only nameserver
  • -i grep ignore case
  • -m 1 grep stop after first match
  • cut take the ip part of the row (second column with ' ' as separator)

To put DNS ip in an environment variable, you could use as follow:

export THEDNSSERVER=$(cat /etc/resolv.conf|grep -im 1 '^nameserver' |cut -d ' ' -f2)
3
  • 5
    grep -m 1 stops matching after first match so you don't have to use head
    – sshow
    Jul 28, 2017 at 8:30
  • 1
    To lighten the pipeline even more, capture groups with Perl regexp is very neat, and grep takes a file argument: grep -Pom 1 '^nameserver \K\S+' /etc/resolv.conf. Just wrote up Capture groups with grep perl regular expression
    – sshow
    Jul 28, 2017 at 9:04
  • There's both IPv4 and IPv6 DNS servers. Also, secondary servers exist for a reason. Which one this command returns? Is it advised to take the first one, and just ignore the others? Jan 16, 2020 at 2:53
13

Using resolvectl

$ resolvectl status | grep -1 'DNS Server'
    DNSSEC supported: no
  Current DNS Server: 1.1.1.1
         DNS Servers: 1.1.1.1
                      1.0.0.1

grep option: -C NUM, -NUM, --context=NUM Print NUM lines of output context.

For compatibility, systemd-resolve is a symbolic link to resolvectl on many distros as for Ubuntu 18.10:

$ type -a systemd-resolve
systemd-resolve is /usr/bin/systemd-resolve

$ ll /usr/bin/systemd-resolve
lrwxrwxrwx 1 root root 10 nov.  15 21:42 /usr/bin/systemd-resolve -> resolvectl

$ type -a resolvectl
resolvectl is /usr/bin/resolvectl

$ file /usr/bin/resolvectl
/usr/bin/resolvectl: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=09e488e849e3b988dd2ac93b024bbba18bb71814, stripped
3
9

If you are using network manager probably you get all network parameters from your dhcp server at your university.

If you don't want use your shell to check your dns settings (as described by hesse and Alexios), you can see them from the panel "Network information".

You can reach this panel by pressing right mouse button on network manager icon and selecting "Connection Information" from the menu.

6

I have Fedora 25 and also had similar slow response on command line to sudo commands.

nmcli dev show | grep DNS 

showed that only one of my 3 adapters (two active) had DNS entries. By adding DNS entries to the one active card that didn't have an entry - presto! All is good and response time is immediate.

1
  • perhaps alternatively Jun 12, 2019 at 17:44
4

In Ubuntu >= 15

nmcli device show <interfacename> | grep IP4.DNS

Replace <interfacename> with yours.

In Ubuntu <= 14

The command

 nmcli dev list iface <interfacename> | grep IP4

Replace <interfacename> with yours.

Examples

 nmcli device show eth0 | grep IP4.DNS

Or

 nmcli dev list iface eth0 | grep IP4

This will list all DNS servers(If you use more than one).

0
3

On a recent Fedora 33, you can just use

# resolvectl dns
Global:
Link 2 (enp0s31f6):
Link 3 (wlp4s0): 1.1.1.1 8.8.8.8
Link 4 (virbr0):
Link 5 (virbr0-nic):

To check if systemd-resolved is active, do cat /etc/resolv.conf It will tell you who is controlling the file.

If you want more details, you can use resolvectl status resolvectl statistics, you can also flush caches ...

To troubleshoot, you can use journalctl -u systemd-resolved -f -o cat | grep Looking after setting the level to DEBUG: sudo resolvectl log-level debug

1
  • Only returns local caching DNS, i.e. localhost. Oct 27, 2022 at 13:11
1

On systems where systemd-resolved is NOT installed :

$ host -v something.unknown | awk -F "[ #]" '/Received /{print$5}' | uniq
192.168.1.1

On systems where NetworkManager is running :

$ ( nmcli -f IP4.DNS,IP6.DNS dev list || nmcli -f IP4.DNS,IP6.DNS dev show ) 2>/dev/null | awk '/DNS/{print$NF}'
192.168.1.1
0

In CentOS, you can use:

/usr/sbin/named -v

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .