0%

DNSmasq使用

DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。

安装

rhel7.4上的安装yum install -y dnsmasq, 完成dnsmasq的安装同时也推荐安装bind-utils,这个包提供很多dns测试相关工具yum install -y bind-utils, 如dignslookup

配置启动

创建两个dnsmasq节点,一个做base dns,一个做upper dns

base dnsdnsmasq.conf配置:

1
2
3
4
5
6
7
listen-address=172.17.0.2,127.0.0.1

# 配置上游DNS服务器
server=/dockxen.mydns/172.17.0.3

# 配置别名
cname=web.dockxen.dns,rhel82

*** 在使用CNAME时,<target>必须本机可访问对象,所以此处我将rhel82放到/etc/hosts中 ***

base dns/etc/hosts配置:

1
2
3
4
127.0.0.1       localhost
::1 localhost ip6-localhost ip6-loopback
172.17.0.2 dnsbase
192.168.1.82 rhel82

upper dns配置:

1
2
3
4
5
6
address=/myweb.dockxen.mydns/192.168.1.82

listen-address=172.17.0.3,127.0.0.1

# The fields are <name>,<target>,<port>,<priority>,<weight>
srv-host=_ldap._tcp.dockxen.mydns,myweb.dockxen.mydns,8000,0,100

完成base dnsupper dns的配置后使用dnsmasq -d debug模式启动,可以看到部分调试信息

测试验证

测试验证需要安装bind-utils,测试中会用到其中的dignslookup,开始测试前修改/etc/resolv.conf中的nameserver 172.17.0.2

验证A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@dnclient /]# dig myweb.dockxen.mydns

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> myweb.dockxen.mydns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22751
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;myweb.dockxen.mydns. IN A

;; ANSWER SECTION:
myweb.dockxen.mydns. 0 IN A 192.168.1.82

;; Query time: 0 msec
;; SERVER: 172.17.0.2#53(172.17.0.2)
;; WHEN: Mon Nov 20 09:29:48 UTC 2017
;; MSG SIZE rcvd: 53

[root@dnclient /]# nslookup myweb.dockxen.mydns
Server: 172.17.0.2
Address: 172.17.0.2#53

Name: myweb.dockxen.mydns
Address: 192.168.1.82

验证CNAME

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@dnclient /]# dig web.dockxen.dns

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> web.dockxen.dns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55429
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.dockxen.dns. IN A

;; ANSWER SECTION:
web.dockxen.dns. 0 IN CNAME rhel82.
rhel82. 0 IN A 192.168.1.82

;; Query time: 0 msec
;; SERVER: 172.17.0.2#53(172.17.0.2)
;; WHEN: Mon Nov 20 09:30:59 UTC 2017
;; MSG SIZE rcvd: 80

[root@dnclient /]# nslookup web.dockxen.dns
Server: 172.17.0.2
Address: 172.17.0.2#53

web.dockxen.dns canonical name = rhel82.
Name: rhel82
Address: 192.168.1.82

验证SRV

1
2
3
4
5
6
7
[root@dnclient /]# dig +noall +answer SRV _ldap._tcp.dockxen.mydns
_ldap._tcp.dockxen.mydns. 0 IN SRV 0 100 8000 myweb.dockxen.mydns.
[root@dnclient /]# nslookup -type=srv _ldap._tcp.dockxen.mydns
Server: 172.17.0.2
Address: 172.17.0.2#53

_ldap._tcp.dockxen.mydns service = 0 100 8000 myweb.dockxen.mydns.

应用

etcd的服务发现

etcd各个节点之间的通讯使用域名方式访问,由于etcd节点ip地址可以以dhcp方式获取,每次etcd节点重启都有可能导致访问地址发生变化。若使用/etc/hosts文件进行“域名-ip”映射涉及到/etc/hosts文件同步分发问题,所以使用dnsmasq来完成“域名-ip”的映射。

关于etcd的服务发现配置请见参考&鸣谢

kube-dns的服务发现

请见《K8s服务发现分析》

参考&鸣谢