使用bind搭建内网dns服务

2022-11-16 19:13:40 浏览数 (1)

dns服务端方案简介

dns服务有什么用呢,尤其是内网的dns服务,其实用处还蛮大的,我见过的典型使用,是数据库跨机房多活。

如某mysql主机搭建在深圳机房,为了保证高可用,那我们可以给这台主库,维护多个深圳同城的跨机房半同步备机,在异地如上海还可以维护一个异步备机。当主机出问题时候,我们可以切换到备机去,而切换了之后,ip肯定就变了,此时就不得不要求客户端修改ip,非常麻烦。

一个可选的方案就是,给客户端服务提供一个域名,客户端服务通过域名获取对应的ip,然后再去和该ip建立连接。当数据库发生主备切换时,只需要修改dns服务端,把域名对应的ip进行修改,同时通知客户端服务进行重连(重连时就可以取到最新的ip),这样的话,不就可以做到数据库容灾切换,且不需要业务方修改配置了吗?

在这其中呢,有个关键的组件,就是搭建私有的内网dns服务器。

dns服务的开源实现,有两个,一个是bind,一个是dnsmasq,前者比较重,专注于dns这块,后者则是相对轻量一些,所以呢,如果需要极高稳定性,建议还是使用重量级的bind。

今天呢,其实就是简单介绍下bind的安装、内网域名配置等等,细节还是比较多,因此记录一下。

安装&配置

安装其实有两种方法,一种是通过源码包编译安装,一种是使用yum包管理器,我这边之前实践是用的源码包方式,确实相对繁琐一点,不过也还行;以后可以再稍微说下yum包的方式。

源码包下载及安装

https://downloads.isc.org/isc/bind9/cur/

https://downloads.isc.org/isc/bind9/cur/9.18/

我这边是9.18版本,下载bind-9.18.4.tar.xz后,rz上传到了我的服务器上。(wget也ok)

代码语言:javascript复制
tar -xvf bind-9.18.4.tar.xz
cd bind-9.18.4/
// 建议一定要加上prefix哈,不然相关文件会散落各处
./configure --prefix=/usr/local/bind9  --disable-doh
// 接下来,可能会提示一些依赖包不存在,此时需要yum 安装
yum search libuv
yum install libuv
yum install libuv-devel

yum search libnghttp2
yum install libnghttp2

yum search libpcap
yum install libpcap
yum install libcap-devel

由于大家的机器环境各不相同,可能有些依赖已经有了,不需要装;或者是还缺更多依赖,这种时候就拿着错误去百度吧;另外,我个人习惯yum安装前,先查一下,看看是个什么包。

configure完成后,就执行

代码语言:javascript复制
make && make install

此时,可以去看看prefix目录下,是什么情况:

代码语言:javascript复制
[root@VM-0-6-centos bind9]# pwd
/usr/local/bind9
[root@VM-0-6-centos bind9]# ll
total 28
drwxr-xr-x  2 named named 4096 Jul  3 11:50 bin
drwxr-xr-x  2 named named 4096 Jul  3 14:42 etc
drwxr-xr-x 10 named named 4096 Jul  3 11:50 include
drwxr-xr-x  3 named named 4096 Jul  3 11:50 lib
drwxr-xr-x  2 named named 4096 Jul  3 15:45 sbin
drwxr-xr-x  3 named named 4096 Jul  3 11:50 share
drwxr-xr-x  3 named named 4096 Jul  3 12:12 var

创建专属用户(可选步骤)

建了个专门的named用户

代码语言:javascript复制
groupadd -g 53 -r named
useradd -u 53 -s /sbin/nolgin -r named -g named

如果使用了named用户,所以要保证prefix目录下的文件、目录的权限匹配,我习惯了root用户,操作完了后

代码语言:javascript复制
chown -R named:named /usr/local/bind9

全局选项配置文件修改

我们现在需要先创建一个主要的配置文件,这个配置文件里会有很多选项。

代码语言:javascript复制
/usr/local/bind9/sbin/rndc-confgen > /usr/local/bind9/etc/rndc.conf

cd /usr/local/bind9/etc/
// 下面这条命令的意思是,取最后的10行,然后取这10行中的前9行,再去掉每一行前面的#符号,大家可以分步执行看看结果
tail -10 rndc.conf | head -9 | sed s/# //g > named.conf

此时,named.conf这个配置文件的最最基本配置就有了,大致如下:

在这个之外,我们还可以再配置一些option选项,比如我这边最终的配置文件如下:

代码语言:javascript复制
key "rndc-key" {
        algorithm hmac-sha256;
        secret "RCTpzylRQeSrU5dPwypdzOJ0eeWNUYGt0csRFbISaU0=";
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
    # 运行时数据的目录
    directory "/usr/local/bind9/var/run";
    # pid文件
    pid-file "named.pid";
    recursion yes;
    allow-query { any; };
    # 监听53端口
    listen-on port 53 { any; };
    # 除了本地配置的域名,其他都转发dns查询到如下dns服务器
    forwarders {
       114.114.114.114;
       8.8.8.8;
    };
    forward only;
    
    # 禁用安全检查,否则dns查询会失败
    dnssec-validation no;
};

# 自定义的域名的所在文件
include "/usr/local/bind9/etc/named.user.zones";

自定义内网域名的配置文件

我们打开named.user.zones文件看看:

代码语言:javascript复制
zone "nx.com" IN {
        type master;
        # 文件名为nx.com,那么全路径在哪里呢,就是上面文件中的options.directory那个路径
        file "nx.com";
        allow-update { none; };
};

zone "dump.com" IN {
        type master;
        file "dump.com";
        allow-update { none; };
};

这里配置了两个随便写的域名。那么,有人会继续问,怎么没看到域名相关的A记录之类的dns记录呢?

大家看下上面注释哈,真正的dns记录那些,在file那个属性中配置,全路径在哪里呢,就是上面文件中的options.directory那个路径。

代码语言:javascript复制
[root@VM-0-6-centos run]# pwd
/usr/local/bind9/var/run
[root@VM-0-6-centos run]# ll
total 24
-rw-r--r-- 1 root  root   534 Jul  3 16:08 dump.com
-rw-r--r-- 1 named named  221 Jul  3 14:26 managed-keys.bind
-rw-r--r-- 1 named named 1818 Jul  3 14:26 managed-keys.bind.jnl
drwxr-xr-x 2 named named 4096 Jul  3 16:08 named
-rw-r--r-- 1 named named    6 Jul  3 16:25 named.pid
-rw-r--r-- 1 root  root   463 Jul  3 12:55 nx.com

这边给大家看看dump.com文件的内容:

代码语言:javascript复制
$TTL 1D
@               IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
                      NS      @
                      A       127.0.0.2
## 前面几行呢,我也没做深入研究,建议生产部署的时候,再研究该选项,我们部署着玩,可以先只看下面几行                      
nameserver.dump.com.      IN      A       127.0.0.3
test1.dump.com.    IN      A       127.0.0.5
test2      IN A   127.0.0.8

可以看到,上文的最后三行,格式比较乱,但大致是三条A记录;格式乱不影响,因为它应该是按照空格来分开的。

前台方式运行bind

代码语言:javascript复制
/usr/local/bind9/sbin/named -u named -g

运行后,记得观测是否报错。

有报错的话,基本对应的域名就解析不了了。

此时,我们ps看一下进程:

代码语言:javascript复制
[root@VM-0-6-centos work-file.git]# ps -ef|grep named
named    28891  2019  0 16:15 pts/1    00:00:00 sbin/named -u named -g

ok,已经运行起来了,此时可以用dig命令来进行测试:

代码语言:javascript复制
# @符号后面跟该dns服务的ip或域名,端口默认为udp 53,如果dns服务部署在云端服务器,然后测试如果在pc,可能要注意云服务器放行相关防火墙端口
dig nameserver.dump.com @localhost

后台运行

代码语言:javascript复制
/usr/local/bind9/sbin/named -u named -c /usr/local/bind9/etc/named.conf

在windows pc上安装dig命令,测试效果

https://downloads.isc.org/isc/bind9/cur/9.16/

下载BIND9.16.30.x64.zip

本地解压后,cmd里执行:

注意啊,如果不通,多半是udp 53端口被防火墙拦截了。

重要文档

如果希望了解更多配置文件选项:https://downloads.isc.org/isc/bind9/9.18.4/doc/arm/html/chapter3.html#introduction

yum安装bind:https://copr.fedorainfracloud.org/coprs/isc/bind/

bind相关文档:https://www.isc.org/bind/

参考文档

https://blog.csdn.net/weixin_45756094/article/details/122011509

https://blog.csdn.net/u011288801/article/details/106736607/

0 人点赞