背景
最近在研究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是什么状况。
可以看到,目前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服务:
好了,找找怎么配置resolved吧。
结果现实是残酷的,resolved设计只能够在loopback上使用,这是写死在代码里面的。
安装dnsmasq
安装dnsmasq
|
|
好吧,结果不是很理想,53端口被占用。如果使用其他端口,那不适合用在网关上,很多客户端并不支持指定端口。 上网百度一下,发现清一色的是教你禁用’systemd-resolved.service’,那就试试吧。
|
|
真是问题不断啊。 还有教程告诉我去卸载’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可能并不未工作在指定的模式下,可通过以下命令修改:
|
|
看到SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
就说明一切都Ok了。
修改dnsmasq,排除loopback
|
|
修改dnsmasq,监听n2n0,提供DNS和DHCP服务
|
|
启动dnsmasq
|
|
测试与验证
测试ECS本机DNS服务
|
|
在本地电脑上测试n2n0的DNS服务
|
|
A. 确认是否返回同样的IP地址 B. 确认DNS地址是否符合预期。
结束语
本来挺简单的事,但由于本人思路不是很清晰,一会这出问题,一会那出问题,弄得脾气都不好了。所以决定写这个教程。
另外,现在网上的教程抄来抄去,实际可用的原创不多。也因为这个,浪费了不少时间。
希望这个对看到它的人有些帮助吧。