Ubuntu 18.04下的DNS配置机制

  最近有一台机器开启路由转发后,突然发现本机的DNS解析失效了。一般情况下新的Ubuntu通过netplan设置网络参数后不用再额外担心DNS的问题,但手动修改/etc/resolv.conf的话确实能够临时恢复网络访问。于是细究一下Ubuntu 18.04 的DNS管理方式。

/etc/resolv.conf

  这个配置文件由systemd-resolved服务管理,一般不推荐手动修改。实际上它本身是一个软链接:

root@test:~# ls -shal /etc/resolv.conf 
0 lrwxrwxrwx 1 root root 39 May  2 18:14 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
root@test:~# 

  当然,这个配置文件的注释部分给出了手动管理该文件的方式,就是将该文件由软链接替换为一个独立的静态文件。我们可以看到这个配置文件主要的参数有3行:

nameserver 127.0.0.53
options edns0
search localdomain

  其中,nameserver是最核心的参数,指定了本机进行DNS查询的域名服务器地址(另外两个无关紧要的参数options后的edns0是RFC2671提出的DNS扩展功能,search则指定了用于主机名解析使用的服务器)。系统默认的参数MAXNS允许我们配置最多三个DNS服务器(当然可以通过自建DNS服务解决这个问题)。

systemd-resolved

  systemd-resolved.service是管理DNS配置文件/etc/resolv.conf的系统服务。该服务自身提供了一个API可以在系统总线上被发起DNS请求的应用访问。就算本地应用是使用另一个更为常见的接口getaddrinfo进行DNS解析,也会最终被systemd-resolved所接管(通过一个叫nss-resolve的glibc组件实现)。除此之外,systemd-resolved服务在本地环回地址127.0.0.53上提供了一个监听服务,从而使那些不使用系统API进行DNS解析的应用也可以被systemd-resolved捕获到DNS请求。综上,一般情况下,只要这个服务是开着的,那么本地应用发起的DNS请求基本上就会被他接管

  那么,怎样实现自定义的DNS服务器呢,那就是改变/etc/resolv.conf的文件格式。为了确保兼容性,当systemd-resolved发现/etc/resolv.conf不再是软链接的时候,就会额外选择从这个配置文件中读取DNS列表(当然默认的那些位置也会生效)。

为什么会失效

  我们继续分析,当systemd-resolved服务正常工作的时候,默认会从以下地方获取DNS服务器列表:

  • 1.专门的解析配置文件:
/etc/systemd/resolved.conf
/etc/systemd/resolved.conf.d/*.conf
/run/systemd/resolved.conf.d/*.conf
/usr/lib/systemd/resolved.conf.d/*.conf
  • 2.网络配置:

来自systemd.networkd服务接管的网络参数中的DNS部分

  • 3.其他本地服务提供的DNS列表

默认情况下,我们不会特意开启这样的服务。

  上面3种途径中,真正生效的是来自网络配置中的DNS参数,因为那些默认的resolve解析配置文件并没有有效的DNS地址。而我们知道,最新的Ubuntu已经把网络服务托管给了netplan。那么理论上netplan就是决定了DNS的最终服务。

  可以通过下述命令查看当前DSN实际生效的情况:

root@DSY-SYYDK-NDH01:~# systemd-resolve --status
Global
         DNS Servers: 114.114.114.114
          DNSSEC NTA: 10.in-addr.arpa
···
Link 2 (eno1)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 114.114.114.114
                      8.8.8.8

  注意,这是出现问题的主机回显。该主机实际上下方Link下的DNS配置(来自netplan网卡配置)并没有生效,实际生效的是Global下的DNS配置(来自被我们手动修改了的/etc/resolv.conf)。对比正常机器,发现正常机器的Link下的DNS配置是可以被正常读取的,所以,问题就集中在了为什么会网卡上的DNS配置会失效。

  折腾了半天,DNS工作原理倒是清楚了,但是为什么会失效,留到下次分析吧。


发表评论

评论列表,共 2 条评论

  • Nikenilky
    dark web search engines <a href="https://mydarknetmarketlinks.com/ ">tor market links </a> dark markets 2024
  • Pirojokjax
    darknet marketplace <a href="https://github.com/darknetmarketslist/darknetmarketslist ">bitcoin dark web </a>