Ubuntu 18.04服务器 - 如何检查正在使用的DNS IP服务器设置

44

本人正在使用Ubuntu 18.04 Server LTS,想找到一种方法来检查通过DHCP设置后实际使用的DNS IP。但是resolv.conf只会指向127.0.0.53,/etc/systemd/network文件夹为空。NSLOOKUP输出也始终引用内部127.0.0.53 IP地址,似乎所有旧技巧都不起作用了。

Ubuntu文档尚未更新,仍然像16.04的帮助一样引用了eth0、ifup和ifdown,这些在18版本中已被弃用:https://help.ubuntu.com/lts/serverguide/network-configuration.html

我试过通过自定义.yaml文件使用Netplan设置静态适配器配置。这些设置可以正常工作,但我似乎找不到任何我设置的DNS IP。我预计DHCP和静态设置之间应该是一致的,但是现在不确定该去哪里查找。

我将接受C库调用或bash CLI方法来检查此问题。有没有人知道在18.04 Server上如何检查呢?

5个回答

73

在输出的末尾,我发现以下内容显示了各个适配器使用的DNS服务器:

systemd-resolve --status

'DNS Servers'下面列出了一个按链接组织的列表。我认为这与Ubuntu的先前版本有所不同。需要进行一些文本解析工作,但这可以让我得到我想要的结果。


2
这并没有回答你的问题。你的问题不是关于DHCP提供了哪些DNS服务器IP地址,而是如何检查正在使用的DNS服务器IP地址。 - webmite
@webmite:我正在寻找DNS服务器的使用情况,是通过静态定义或DHCP指定的。systemd-resolve --status是目前我找到的唯一列出当前用于DNS解析的服务器的方法。 - Nathan Smith
如果您按照我在答案中讨论的方法进行检查,您将找到实际使用的服务器,而不管传递的参数是什么。我发现我的系统默认情况下已激活dnsmasq,这意味着DHCP提供的DNS服务器参数被忽略,直到我禁用它为止。请验证您的系统上是否启用了dnsmasq。 - webmite
@Webmite: 我在18.04服务器上没有安装NetworkManager,所以我无法尝试那个建议。我正在使用systemd-networkd,这是默认设置。因为我的解决方案提供了易于解析的DNS IP,所以应用程序现在正在使用它。我假设类似的属性已经设置在某个地方,因为它掩盖了跟踪信息中实际的DNS IP地址。 - Nathan Smith
我发现了关于dnsmasq和systemd-resolve的参考资料[https://askubuntu.com/questions/907246/how-to-disable-systemd-resolved-in-ubuntu]。它提到尝试禁用它可能会在通过VPN连接时破坏DNS。他们还引用了一个错误报告。 - webmite

33

另一种方法是:

cat /run/systemd/resolve/resolv.conf

这个文件是由systemd-resolved动态生成的,但它包含实际的DNS服务器而不是127.0.0.53。

如果您想将其设置为/etc/resolv.conf的默认值,您只需为此创建符号链接。(默认情况下,/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf的符号链接):

sudo mv /etc/resolv.conf /etc/resolv.conf.orig
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

示例/run/systemd/resolve/resolv.conf

# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 10.1.2.3
search host.domain.com

了解更多信息:

http://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html


这是正确的方法^tm,如果您不希望systemd干扰您的DNS查询(例如,如果您希望路由器上的DHCP服务器处理DNS解析,大多数人可能都希望这样做),则可以设置网络。 - user67416

7
您还可以使用以下方式:

nmcli dev show eth0

将eth0替换为您的网络接口以查看其配置方式。如果您通过DHCP获取了DNS地址,则应在此处看到它。


1
如果您有多个接口并且不知道哪个用于DNS查询,请使用nmcli dev show(不带设备名称)。 nmcli dev show | grep DNS将直接给出答案。 - Laurent Simon

1

我正在运行Ubuntu 22.04操作系统。

sudo nmcli dev show <interface>没有任何DNS列表,但是sudo resolvectl status <interface>可以显示当前的DNS服务器。


-2

我也感到惊讶。我正在运行Ubuntu 16.04 LTS,看到类似的情况。

如果您发出

dig www.google.ca +trace | grep 'Received'

响应中的第一个主机是为您的服务器进行查找的主机。

$ dig www.google.ca +trace | grep 'Received'
;; Received 525 bytes from 127.0.1.1#53(127.0.1.1) in 19 ms
;; Received 42 bytes from 199.7.91.13#53(d.root-servers.net) in 32 ms

这意味着此框正在直接进行自己的DNS查询,以根服务器为起点递归地跟踪路径来获取我的DNS查询。

发现问题是dnsmasq已启用。要禁用它,请按以下步骤执行。

编辑NetworkManager.conf文件。

sudo gedit /etc/NetworkManager/NetworkManager.conf

将dnsmasq行注释掉

#dns=dnsmasq

重启网络管理器服务

sudo /etc/init.d/network-manager restart

接着验证它是否正在使用通过dhcp分配的dns服务器

$ dig www.google.ca +trace | grep 'Received'
;; Received 525 bytes from 192.168.30.1#53(192.168.30.1) in 18 ms
;; Received 42 bytes from 198.41.0.4#53(a.root-servers.net) in 32 ms

是的,Ubuntu在53端口上有一个内部监听方案,但它应该使用DHCP分配的DNS服务器。随着更改,看起来它现在还创建了一个新的内部环回IP 127.0.0.53,用于另一个环回路径。Resolv.conf和其他方法用于报告正在使用的IP地址。这就是我要找的,DHCP为外部DNS查找发行的IP地址。我希望没有人认为设备总是与互联网保持开放连接并使用可能永远无法访问的顶级DNS服务器。 - Nathan Smith
5
在Ubuntu 18.04中这个方法不适用。当你运行dig <url> +trace命令时,会返回;; Received 28 bytes from 127.0.0.53#53(127.0.0.53) in 0 ms,但这并不是真正的DNS服务器。此外,在Ubuntu 18.04中,NetworkManager.conf文件甚至没有需要注释掉的dns=dnsmaq这一行。 - wisbucky
1
如果使用systemd-resolved(即127.0.0.53),则不会像那样工作。 - TJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接