Ubuntu 22.04配置DNS服务器

如何优雅的为Ubuntu配置DNS服务器

背景

最近在研究N2N网络,在自己的ECS服务器上架构了一个super node+edge node 节点,做为N2N网络的网关使用。然后发现,n2n0网口上并没有DNS服务,所以决定给ECS服务器增加DNS server。由于本地网络使用的是dnsmasq,对它比较熟悉,所以决定在ECS服务器上也使用dnsmasq。当然以下教程也适用其他DNS server。

好的开始?

首先我的ECS使用的是Ubuntu 22.04,一个长期支持版本。Ubuntu 22.04使用的是systemd-resolved 来管理本地的DNS,使用resolvectl来看看目前DNS是什么状况。

2023-05-13-23-24-09@2x 可以看到,目前eth0使用的是阿里云内网DNS,应该是一个DNS加速服务器。通过使用发现,该DNS应该是比较干净的,没必要更换。而n2n0并没有DNS服务。

目前systemd-resolved工作在stub模式下,这是resolved的默认工作模式。关于这个,可以参考这段说明。其中有段说明很重要,我们可以做几个尝试并通过resolvectl判断其工作模式。

Note that the selected mode of operation for this file is detected fully automatically, depending on whether /etc/resolv.conf is a symlink to /run/systemd/resolve/resolv.conf or lists 127.0.0.53 as DNS server.

既然这样,那可不可以直接使用resolved来提供DNS服务呢。本质来上来说resolved也是一个DNS服务:

2023-05-13-23-41-58@2x 好了,找找怎么配置resolved吧。

结果现实是残酷的,resolved设计只能够在loopback上使用,这是写死在代码里面的。

安装dnsmasq

安装dnsmasq

1
2
3
4
sudo apt install dnsmasq 
sudo systemctl enable dnsmasq.service
sudo systemctl start dnsmasq.service
sudo systemctl status dnsmasq.service

好吧,结果不是很理想,53端口被占用。如果使用其他端口,那不适合用在网关上,很多客户端并不支持指定端口。 2023-05-13-23-46-28@2x 上网百度一下,发现清一色的是教你禁用’systemd-resolved.service’,那就试试吧。

1
2
3
4
sudo systemctl disable systemd-resolved.service 
sudo systemctl stop systemd-resolved.service

sudo resolvectl 

真是问题不断啊。 2023-05-13-23-50-17@2x 还有教程告诉我去卸载’resolvconf’,好吧,停下来,让我们认真想想要什么,不想要什么。

理清思路

我们主要是想为下游网络(也就是eth0或n2n0)提供DNS服务,本机和上游DNS并不是非修改不可。

resolved对本机DNS和上游DNS的管理非常恰当,并且配合resolvectl使用非常方便。这样我们更没有理由移除resolved。

所以,我决定保留resolved的基础上配置dnsmasq,loopback由resolved管理,dnsmasq管理eth0和n2n0,并使用resolved做为其上游DNS。基本DNS工作链是这样子的:

本地DNS请求 => n2n0 => dnsmasq => resolved(127.0.0.53:53)=> eth0 => 上游DNS

再来

如果由于之前的修改或其他原因,resolved可能并不未工作在指定的模式下,可通过以下命令修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sudo rm /etc/resolv.conf
sudo ln -svf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

# 真正的DNS在这里
# /run/systemd/resolve/resolv.conf

# 重新启动resolved
sudo systemctl enable systemd-resolved.service 
sudo systemctl start systemd-resolved.service

# 测试
dig baidu.com 

看到SERVER: 127.0.0.53#53(127.0.0.53) (UDP)就说明一切都Ok了。

修改dnsmasq,排除loopback

1
2
3
4
sudo vim /etc/default/dnsmasq

# 添加
DNSMASQ_EXCEPT="lo"

修改dnsmasq,监听n2n0,提供DNS和DHCP服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
sudo vim /etc/dnsmasq.conf 

# 好吧,原始配置文件内容太多了,备份一下,弄个整洁的
log-dhcp
log-queries

interface=n2n0
port=53

bind-dynamic
domain-needed
strict-order
cache-size=2048

resolv-file=/etc/resolv.conf

dhcp-range=set:n2n0,10.20.30.2,10.20.30.99,255.255.255.0,12h

conf-dir=/etc/dnsmasq.d

启动dnsmasq

1
2
sudo systemctl restart dnsmasq.service 
sudo systemctl status dnsmasq.service 

2023-05-14-00-10-58@2x

测试与验证

测试ECS本机DNS服务

1
dig baidu.com 

2023-05-14-00-14-38@2x

在本地电脑上测试n2n0的DNS服务

1
dig @10.20.30.1 baidu.com

2023-05-14-00-16-02@2x

A. 确认是否返回同样的IP地址 B. 确认DNS地址是否符合预期。

结束语

本来挺简单的事,但由于本人思路不是很清晰,一会这出问题,一会那出问题,弄得脾气都不好了。所以决定写这个教程。

另外,现在网上的教程抄来抄去,实际可用的原创不多。也因为这个,浪费了不少时间。

希望这个对看到它的人有些帮助吧。


最后更新于 2023-12-13
小酌怡情
Built with Hugo
主题 StackJimmy 设计
访问量 -    访客数 - 人次