内网DNS服务器搭建说明

内网DNS服务器搭建说明

搭建目标

  1. 内外网均可访问
  2. 支持自定义域名

技术选型

主要备选方案为小米开源的SmartDNS和云原生毕业的CoreDNS。经过多方考量,最终选用云原生出品的CoreDNS,

github地址:https://github.com/coredns/coredns

官方网站:https://coredns.io/

本次主要使用的插件:https://coredns.io/plugins/hosts/

部署过程

1、挑机器

选用一台性能较好的服务器,最好CPU和内存高点的。建议配置:8C/8G/200G (CPU/内存/磁盘)

2、下载安装包

从Github上下载服务器系统类型对应的二进制安装包,具体链接地址为:https://github.com/coredns/coredns/releases/tag/v1.8.4

这里演示使用的Centos7.9,所以下载的是:coredns_1.8.4_linux_amd64.tgz

3、释放安装包

# 上传安装包coredns_1.8.4_linux_amd64.tgz 到服务器的/root目录下

# 新建目录
mkdir -p /usr/local/coredns  

# 新建用户
useradd coredns -s /sbin/nologin

# 释放安装包
tar -xvf coredns_1.8.4_linux_amd64.tgz -C /usr/local/coredns

4、添加转发规则配置

规则说明:

local:53,所有请求域名以“ local ”结尾的去找/usr/local/coredns/hosts 文件做解析

.:53,除了上面两个规则外的其他所有请求被转发到公网的DNS去做解析

vim /usr/local/coredns/Corefile
# 新增
local:53 {
    hosts /usr/local/coredns/hosts
    log
}

.:53 {
    forward . 8.8.8.8:53 114.114.114.114:53 1.1.1.1:53 223.5.5.5:53 223.6.6.6:53 
    log
}

5、添加本地域名映射文件

vim /usr/local/coredns/hosts
# 新增
10.3.1.1     dev.gis4.local
10.3.1.48    dev.gis7.local
10.3.1.40    test.gis4.local
10.3.1.47    prod.gis4.local

6、添加开机自启配置

vim /etc/systemd/system/coredns.service
# 新增

[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
ExecStart=/usr/local/coredns/coredns -conf=/usr/local/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

7、启动服务

systemctl start  coredns
systemctl enable coredns
systemctl status coredns

8、测试域名

若机器上无法使用dig命令,可以yum安装下:yum -y install bind-utils

dig命令用法:https://man.linuxde.net/dig

# 先在内网DNS服务器的做本地测试
[root@localhost coredns]# dig @localhost a dev.gis7.local

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @localhost a dev.gis7.local
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29437
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dev.gis7.local.                        IN      A

;; ANSWER SECTION:
dev.gis7.local.         3600    IN      A       10.3.1.48  # 可以看到这里能解析出来

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Thu Jul 15 11:39:27 CST 2021
;; MSG SIZE  rcvd: 73

[root@localhost coredns]# dig @localhost a baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @localhost a baidu.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22204
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;baidu.com.                     IN      A

;; ANSWER SECTION:
baidu.com.              419     IN      A       39.156.69.79
baidu.com.              419     IN      A       220.181.38.148  # 可以看到这里能解析出来

;; Query time: 15 msec
;; SERVER: ::1#53(::1)
;; WHEN: Thu Jul 15 11:39:37 CST 2021
;; MSG SIZE  rcvd: 88

[root@localhost coredns]#


# 再到其他服务器或客户端机器上测试
# 1)修改测试机器的DNS
[root@data_service_79 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens192 # 我这里网卡名是ens192,这个名不是固定的,需要写自己的
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens192"
UUID="683fa800-8436-4394-bb39-9974b9a621eb"
DEVICE="ens192"
ONBOOT="yes"
#ARPCHECK="no"
IPADDR="10.0.1.79"
PREFIX="24"
GATEWAY="10.0.1.1"
DNS1="10.1.6.221"     # 这里就是我搭建的内网DNS

# 2)重启网卡
[root@data_service_79 ~]# systemctl restart network  # 如果无法重启成功或生效,就重启机器:sync;reboot

# 3)确认DNS
[root@data_service_79 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 10.1.6.221  # 可以看到我这里已经生效了,使用的是我新搭建的内网DNS
# 4)ping测试
[root@data_service_79 ~]# ping prod.gis4.local
PING prod.gis4.local (10.3.1.47) 56(84) bytes of data.
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=1 ttl=63 time=0.297 ms
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=2 ttl=63 time=0.267 ms
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=3 ttl=63 time=0.410 ms
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=4 ttl=63 time=0.267 ms
^C
--- prod.gis4.local ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.267/0.310/0.410/0.060 ms
[root@data_service_79 ~]#
# 5)dig 测试
[root@data_service_79 ~]# dig @10.1.6.221 a baidu.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @10.1.6.221 a baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16514
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;baidu.com.                     IN      A

;; ANSWER SECTION:
baidu.com.              475     IN      A       39.156.69.79
baidu.com.              475     IN      A       220.181.38.148 # 可以看到这里是能正常解析出来的

;; Query time: 160 msec
;; SERVER: 10.1.6.221#53(10.1.6.221)
;; WHEN: Thu Jul 15 11:51:59 CST 2021
;; MSG SIZE  rcvd: 88

[root@data_service_79 ~]# dig @10.1.6.221 a prod.gis4.local 

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> @10.1.6.221 a prod.gis4.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26422
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;prod.gis4.local.               IN      A

;; ANSWER SECTION:
prod.gis4.local.        3600    IN      A       10.3.1.47  # 可以看到这里是能正常解析出来的

;; Query time: 3 msec
;; SERVER: 10.1.6.221#53(10.1.6.221)
;; WHEN: Thu Jul 15 11:52:13 CST 2021
;; MSG SIZE  rcvd: 75

[root@data_service_79 ~]#
# 6)停掉coredns服务,再做测试

# 内网DNS服务器上操作
[root@localhost coredns]# systemctl stop coredns
[root@localhost coredns]# systemctl status coredns
● coredns.service - CoreDNS DNS server
   Loaded: loaded (/etc/systemd/system/coredns.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Thu 2021-07-15 11:53:52 CST; 7s ago
     Docs: https://coredns.io
  Process: 38375 ExecStart=/usr/local/coredns/coredns -conf=/usr/local/coredns/Corefile (code=exited, status=0/SUCCESS)
 Main PID: 38375 (code=exited, status=0/SUCCESS)

Jul 15 11:52:36 localhost coredns[38375]: [INFO] 10.0.1.79:52526 - 48115 "A IN data_service_79. udp 33 false 512" NXDOMAIN qr,aa,rd,ra 108 0.004676304s
Jul 15 11:52:36 localhost coredns[38375]: [INFO] 10.0.1.79:52526 - 11505 "AAAA IN data_service_79. udp 33 false 512" NXDOMAIN qr,rd,ra 108 0.042498846s
Jul 15 11:52:55 localhost coredns[38375]: [INFO] 10.0.1.79:37312 - 26245 "PTR IN 79.1.0.10.in-addr.arpa. udp 40 false 512" NXDOMAIN qr,rd,ra 135 0.081115373s
Jul 15 11:52:56 localhost coredns[38375]: [INFO] 10.0.1.79:42550 - 491 "AAAA IN data_service_79.localdomain. udp 45 false 512" NXDOMAIN qr,rd,ra 120 0.026442575s
Jul 15 11:52:56 localhost coredns[38375]: [INFO] 10.0.1.79:42550 - 26354 "A IN data_service_79.localdomain. udp 45 false 512" NXDOMAIN qr,rd,ra 120 0.03522113s
Jul 15 11:52:56 localhost coredns[38375]: [INFO] 10.0.1.79:55391 - 34553 "AAAA IN data_service_79. udp 33 false 512" NXDOMAIN qr,rd,ra 108 0.008096419s
Jul 15 11:52:56 localhost coredns[38375]: [INFO] 10.0.1.79:55391 - 41700 "A IN data_service_79. udp 33 false 512" NXDOMAIN qr,rd,ra 108 0.060995755s
Jul 15 11:53:04 localhost coredns[38375]: [INFO] 10.0.1.79:51629 - 50457 "PTR IN 79.1.0.10.in-addr.arpa. udp 40 false 512" NXDOMAIN qr,aa,rd,ra 105 2.031695577s
Jul 15 11:53:52 localhost systemd[1]: Stopping CoreDNS DNS server...
Jul 15 11:53:52 localhost systemd[1]: Stopped CoreDNS DNS server.

# 测试机器上操作
[root@data_service_79 ~]# dig @10.1.6.221 a prod.gis4.local  # 可以看到卡住不动,没法解析了


^C[root@data_service_79 ~]# ping prod.gis4.local  # 也卡住几秒后就说没法解析
ping: prod.gis4.local: Name or service not known
[root@data_service_79 ~]#

# 再启动coredns服务,再测
[root@localhost coredns]# systemctl start  coredns
[root@data_service_79 ~]# ping prod.gis4.local  # 可以看到马上就好了
PING prod.gis4.local (10.3.1.47) 56(84) bytes of data.
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=1 ttl=63 time=0.261 ms
64 bytes from 10.3.1.47 (10.3.1.47): icmp_seq=2 ttl=63 time=0.392 ms
^C
--- prod.gis4.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.261/0.326/0.392/0.067 ms

参考资料

https://coredns.io/plugins/hosts/

https://github.com/coredns/coredns

https://zh.codeprj.com/blog/b1ea7c1.html

https://blog.csdn.net/wu_weijie/article/details/104781887

https://guiyunweb.com/archives/%E6%90%AD%E5%BB%BA%E5%86%85%E7%BD%91dns%E6%9C%8D%E5%8A%A1%E5%99%A8

上一篇:k8s安装问题处理


下一篇:Kubeadm初始化报错