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的结果样例
可以看到DNS查询并没有受/etc/hosts影响
2.2 在ubuntu 20上修改/etc/hosts
下图是dig的结果样例
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中
如果需要启动时打印到标准输出流,则可以按注释中操作,将logfile的配置留为空。
unbound的默认启动是在后台,所以在命令启动时,日志会刷一部分就结束了;如果想要一直在前台输出日志,则在启动命令中加入 -d参数。
3.1常见的启动错误
如下是按照上述步骤,将unbound日志输出到标准输出流中,这样可以看到启动时的异常,
这里的提示错误是”remote-control“相关的。
在配置文件中将remote-control关闭,即可解决该问题。
正常启动的日志样例,这里的日志级别为-v
自定义域名的建议配置方式
在/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,否则请根据实际情况配置。
至此一个自定义的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 "
结果示例如下,
然后加入到/etc/resolv.conf中