我正在配置 ubuntu 20.04 服务器,并尝试从使用 ifupdown 切换到使用 netplan。我并不是网络专家,但我相信我的问题与 DNS 有关:
root@local:~# curl https://google.com
curl: (6) Could not resolve host: google.com
我按照这篇文章的最佳答案开始关联。我确保删除了这些软件包:net-tools、ifupdown(并删除了 /etc/network/interfaces 中的行和 /etc/network/interfaces.d 中的文件)和 resolvconf。我相信我的 netplan 配置设置正确,如下所示:
---
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
dhcp6: no
addresses:
- 172.16.15.161/24
routes:
- to: default
via: 172.16.15.1
nameservers:
addresses: [10.x.x.x, 10.x.y.x]
当我执行 anetplan --debug generate
并且netplan apply
没有收到任何错误时,我确保在更改后重新启动。为了确保不是我们的 dns 服务器导致的问题,我还尝试使用 8.8.8.8。我还检查了 /etc/resolv.conf 是否符号链接到 /run/systemd/resolve/stub-resolv.conf、DNSSEC=no,以及在执行 resolvectl 并查看 eth0 时是否列出了我的 dns 服务器。值得一提的是,我们最初在使用 ifupdown 配置时有一个 bond 接口,但是我们在切换到 netplan 时摆脱了它,因为我们只有一个 eth 接口(我通过执行摆脱了它ip link delete dev bond0
)。我们觉得也许旧配置中的某些东西可能仍然存在并导致了问题。
编辑:添加输出ip a
root@local:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:50:56:b7:41:7f brd ff:ff:ff:ff:ff:ff
inet 172.16.15.161/24 brd 172.16.15.255 scope global eth0
valid_lft forever preferred_lft forever
答案1
我们最终发现 iptables 是导致问题的原因。首先,我们丢弃了所有环回流量,因此我们添加了以下规则。我相信这是一个问题,因为 systemd-resolved 在 127.0.0.53:53 上的工作方式。
-A INPUT -i lo -j ACCEPT
其次,由于我们配置了 iptables,并且我们摆脱了 bond0 接口,因此 iptables 不知道将通过 eth0 进入的流量发送到哪里,因此它永远不会符合我们的规则以允许端口 53 上的 tcp/udp 流量。这些规则如下所示:
-A OUTPUT -p udp -m udp --dport 53 -m state --state NEW,ESTABLISHED -m comment --comment "Allow dns (UDP)" -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -m state --state NEW,ESTABLISHED -m comment --comment "Allow dns (TCP)" -j ACCEPT
对于可能需要一些灵感的人,请查看此主题或类似搜索关联。
答案2
我遇到了同样的问题,我想这是由于systemd
尝试自行解析 DNS,而不遵守netplan
配置的名称服务器,并且列出的条目/etc/resolv.conf
无法正确解析名称(或文件为空!)。还尝试使用该resolvconf
包来管理该文件,但没有成功。
读完后man systemd-resolved.service
发现,问题已解决(无意双关),方法是删除符号链接/etc/resolv.conf
并将其替换为包含我想要的名称服务器的真实文件。对于您的情况,您将使用(以 root 身份):
rm -f /etc/resolv.conf
echo -e 'nameserver 10.x.x.1\nnameserver 10.x.x.2' >/etc/resolv.conf
chmod 444 /etc/resolv.conf
选项-e
允许echo
插入‘\n’字符以在单个命令中获得两行不同的行,因此生成的/etc/resolv.conf
内容为:
nameserver 10.x.x.1
nameserver 10.x.x.2
(r--r--r--)的 444 项权利chmod
是为了避免程序安装程序/更新程序进行意外的修改。