如何让 Netplan 根据来自 DHCP 服务器的信息在 /etc/resolv.conf 中设置 DNS 服务器?

Mag*_*nus 2 dnsmasq netplan

我正在使用以下简单的网络拓扑设置 4 x RPi 集群:

在此输入图像描述

所有 4 个 RPi 节点都具有最新的 Ubuntu Server LTS 20.04 操作系统。rpi1 是我的主/网关节点。我在 rpi1 上执行了以下操作:

  • 使用 netplan 在 eth0 10.0.0.1 上分配静态 IP 地址
  • 禁用systemd-resolved并手动创建/etc/resolv.confnameserver 127.0.0.1
  • 设置dnsmasq如下/etc/dnsmasq.conf
# Basics:
interface=eth0
listen-address=127.0.0.1

# DHCP Settings (MAC Addresses removed)
dhcp-range=10.0.0.1,10.0.0.128,12h

dhcp-host=XX:XX:XX:XX:XX:XX,rpi1,10.0.0.1
dhcp-host=XX:XX:XX:XX:XX:XX,rpi2,10.0.0.2
dhcp-host=XX:XX:XX:XX:XX:XX,rpi3,10.0.0.3
dhcp-host=XX:XX:XX:XX:XX:XX,rpi4,10.0.0.4

dhcp-option=option:router,10.0.0.1
dhcp-option=option:dns-server,10.0.0.1
dhcp-option=option:netmask,255.255.255.0

# Forward to nameservers:
server=8.8.8.8
server=8.8.4.4

# Misc
bind-interfaces
domain-needed
bogus-priv
expand-hosts
Run Code Online (Sandbox Code Playgroud)
  • 向文件添加身份/etc/hosts
10.0.0.1 rpi1
10.0.0.2 rpi2
10.0.0.3 rpi3
10.0.0.4 rpi4
Run Code Online (Sandbox Code Playgroud)

此设置似乎可以作为 DHCP 服务器成功运行,因为它根据 MA​​C 地址正确地将所需的 IP 地址分配给剩余“次要”节点(rpi2、rpi3、rpi4)的 eth0 设备。

但是,我不知道如何在次要节点上使用 Netplan 来注册由运行在 rpi1 上的 dnsmasq-DHCP 服务器广播的名称服务器。/etc/netplan/50-cloud-init.yaml我已经在次要节点上的文件中尝试了各种设置,但是当我运行时sudo netplan apply,它总是创建一个/etc/resolv.conf包含以下名称服务器位置信息的文件:

nameserver 127.0.0.53
options edns0
Run Code Online (Sandbox Code Playgroud)

如果我手动编辑/etc/resolv.conf以指向 rpi1 ( nameserver 10.0.0.1) 那么它就可以工作(例如我可以ping rpi3从 rpi2 开始),但我想了解为什么运行netplan apply不会根据来自 dnsmasq 广播的信息自动设置它。我在我的中尝试了各种设置/etc/netplan/50-cloud-init.yaml,但似乎没有什么影响结果/etc/resolv.conf文件。

/etc/netplan/50-cloud-init.yaml这是我在放弃之前在 rpi2 上最后处理文件的地方(注意:我还在这里启用直接 Wi-Fi 访问以进行初始设置/调试):

network:
    version: 2    
    ethernets:
        eth0:
            dhcp4: true
            optional: true
            dhcp4-overrides:
                use-dns: false
            nameservers:
                addresses: [10.0.0.1]
    wifis:
        wlan0:
            optional: true
            access-points:
                "my-wifi-signal":
                    password: "mypassword"
            dhcp4: no
            addresses: [192.168.0.52/24]
            gateway4: 192.168.0.1
            nameservers:
                addresses: [8.8.8.8,8.8.4.4]
Run Code Online (Sandbox Code Playgroud)

对我来说也很奇怪的是,当我systemd-resolve --status使用此配置应用 Netplan 后运行时,它似乎表明它现在确实识别了 rpi1 上所需 DNS 名称服务器的位置:

$ systemd-resolve --status
...

Link 2 (eth0)
      Current Scopes: DNS
DefaultRoute setting: yes
       LLMNR setting: yes
MulticastDNS setting: no
  DNSOverTLS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
  Current DNS Server: 10.0.0.1
         DNS Servers: 10.0.0.1
Run Code Online (Sandbox Code Playgroud)

但是,正如我所说,当我尝试ping rpi4从 rpi3 进行操作时,它不起作用(我收到消息“ping:rpi4:名称解析暂时失败”)。

总之:

我怎样才能使运行时sudo netplan apply查询 DHCP 服务器的 DNS 名称服务器并使用它来设置 的内容/etc/resolv.conf

小智 6

我也面临同样的问题。Netplan 使用 systemd-resolvd 进行名称解析,大多数时候我发现该/etc/resolve.conf文件是一个符号链接/run/systemd/resolve/stub-resolv.conf,用于127.0.0.53环回接口,并且文件中定义的名称服务器/etc/netplan/00-cloud-init.yaml是用/run/systemd/resolve/resolv.conf.

以下步骤对我有用。

$ sudo unlink /etc/resolv.conf
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

并重新启动 systemd-resolved 服务

$ sudo systemctl restart systemd-resolved.service 
Run Code Online (Sandbox Code Playgroud)

希望它也能帮助你。