天天看点

【linux】自定义nameserver

1. 问题场景

有这么一种场景,两台server,server A,server B。

Server A和Server B是在同一个内网中,但是Server A通过domain访问Server B。

不希望Server A访问Server B时走公网, 一种可行的方案是,将此domain不解析为Server B的公网,而是解析为内网。那么该这么做呢?

2. 修改/etc/hosts

修改/etc/hosts是一种思路,但是在实际操作中发现,在使用ping等工具时,系统是先查询/etc/hosts,如果有结果就不再访问DNS。

但是在实际路由过程中,系统是只查询DNS。 hosts中的配置要生效,必须要加载到对应的DNS服务中

通过实现发现, centos7中是没有本地DNS服务的,所以它的hosts无法在DNS中生效;但是centos 8中是增加了dnsmasq服务,它相当于一层DNS缓存服务,它可以将hosts中的配置加载到DNS中

在Ubuntu 16以后,系统默认安装了systemd-resolved,它同样可以将hosts中的配置加到DNS中

通过host,nslookup和dig查询,不通系统得到的结果可能不太一样。

下面我们分别在centos和ubuntu上修改/etc/hosts,添加一个记录来表示Server B

192.168.0.168   <Server B>      

然后测试一下不通系统上的差别

2.1 在centos 7上修改/etc/hosts

下图是dig的结果样例

【linux】自定义nameserver

可以看到DNS查询并没有受/etc/hosts影响

2.2 在ubuntu 20上修改/etc/hosts

下图是dig的结果样例

【linux】自定义nameserver

3. 自定义nameserver

可以使用unbound来构建自定义的nameserver,在Centos或者Ubuntu下可以直接安装unbound服务;

centos安装

yum install unbound      

ubuntu安装

apt install unbound      

默认的配置文件在/etc/unbound/unbound.conf

安装完unbound后,可以通过命令unbound直接启动服务或者可以通过系统服务启动。

下面是通过命令行启动

unbound -v -d      

unbound的日志在默认的配置中是写入到syslog中的,如果需要重定向到其他文件,可以修改unbound.cfg中如下的配置。

示例中将日志重新向到/tmp/unbound.log中

【linux】自定义nameserver

如果需要启动时打印到标准输出流,则可以按注释中操作,将logfile的配置留为空。

unbound的默认启动是在后台,所以在命令启动时,日志会刷一部分就结束了;如果想要一直在前台输出日志,则在启动命令中加入 -d参数。

3.1常见的启动错误

如下是按照上述步骤,将unbound日志输出到标准输出流中,这样可以看到启动时的异常,

【linux】自定义nameserver

这里的提示错误是”remote-control“相关的。在配置文件中将remote-control关闭,即可解决该问题。

【linux】自定义nameserver

正常启动的日志样例,这里的日志级别为-v

【linux】自定义nameserver

自定义域名的建议配置方式

在/etc/unbound/local.d文件夹下,配置需要代理的域名即可,不要写到主配置文件中

3.2 调试unbound

使用dig或者nslookup可以测试测试unbound服务。

如果没有安装dig,可以通过如下命令安装

centos

yum install bind-utils      

ubuntu

apt install bind-utils      

dig使用命令如下:

dig @<unbound服务地址> <测试域名>      

@符号表示往哪一个DNS服务发送,如果不加@则需要修改/etc/resolve.conf文件

配置允许访问该服务的IP地址,全放开则配置0.0.0.0/0 allow,否则请根据实际情况配置。

【linux】自定义nameserver

至此一个自定义的nameserver就搭建好了。在Server A上,可以修改/etc/resolv.conf来修改dns的地址。

常见问题

53端口占用问题

在Ubuntu 系统中,53端口是被系统服务**/lib/systemd/systemd-resolved** 占用了。

实际上它就是一个DNS的服务,只不过是解析本地的域名,包含了/etc/hosts中的配置,所以ubuntu与centos在本地域名的解析上存在在第二节中展示的不同。

在Centos8中,同样53端口被系统服务dnsmasq占用了。它同systemd-resolved服务一样,为本地域名做代理。(注意,在centos7中无此服务)

上诉两套系统中其实都有本地域名解析的解决方案了,所以如果仅仅是本地的域名解析问题,可以完全使用上面的两个服务而不需要再自己搭建unbound服务了。

centos8 dnsmasq服务没有及时更新hosts中的配置

与ubuntu中的systemd-resolved实时更新不同,centos8中的dnsmasq需要重启一下,才可以加载hosts中的改动。

重启它可以使用如下命令

killall -HUP dnsmasq      

重启后再试一下即可。

当然,需要体行的一点是,如果要使用systemd-resolved或者dnsmasq都要在本机的/etc/resolv.conf中加入本地服务IP,

如何查看?

执行如下命令

netstat -nulp | grep ":53 "      

结果示例如下,

【linux】自定义nameserver