我正在设置一个 4 x RPi 集群,具有以下简单的网络拓扑:
所有 4 个 RPi 节点都具有最新的 Ubuntu Server LTS 20.04 操作系统。rpi1 是我的主/网关节点。我在 rpi1 上执行以下操作:
- 使用 netplan 在 eth0 上分配静态 IP 地址 10.0.0.1
- 已禁用
systemd-resolved
并手动创建/etc/resolv.conf
值nameserver 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
- 向文件中添加身份
/etc/hosts
:
10.0.0.1 rpi1
10.0.0.2 rpi2
10.0.0.3 rpi3
10.0.0.4 rpi4
此设置似乎可以成功用作 DHCP 服务器,因为它可以根据 MAC 地址将所需的 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
如果我手动编辑/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]
对我来说也很奇怪,当我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
但是,正如我所说的,当我尝试ping rpi4
从 rpi3 执行操作时,它不起作用(我收到消息“ping:rpi4:名称解析暂时失败”)。
总之:
我怎样才能使运行时sudo netplan apply
向 DHCP 服务器咨询 DNS 名称服务器并使用它来设置内容/etc/resolv.conf
?
答案1
我也遇到了同样的问题。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
并重新启动 systemd-resolved 服务
$ sudo systemctl restart systemd-resolved.service
希望它也能对你有所帮助。
答案2
您resolvconf
安装了该服务吗?
如果没有运行
sudo apt install resolvconf
sudo netplan apply
sudo service resolvconf restart
sudo service resolvconf status
我有一个具有固定 IP 的工作站,其中 DNS 解析时常打开和关闭,这解决了我的问题。