从 ifupdown 迁移到 netplan 的 DNS 问题

从 ifupdown 迁移到 netplan 的 DNS 问题

我正在配置 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是为了避免程序安装程序/更新程序进行意外的修改。

相关内容