一、DNS的介绍
1、DNS:Domain Name System,域名系统。将主机名解析为IP地址的过程,完成从域名到主机识别ip地址之间的转换,如:www.baidu.com, 其中 www为主机名,baidu.com为域名。
2、DNS无论是走TCP,还是走UDP,其端口号都是53。具体的是其在进行区域传输的时候使用TCP协议,其他时候则使用UDP协议。
3、DNS域名结构 一级域名共分为三类,组织域、国家域和反响域,最多可以有127级域名;
每一级的域名服务器只负责对应下级的域的管理,其中根节点是分布在世界各地的13台服务器组成,其中10台位于美国地区,另外3台设置于英国、瑞典和日本。FQDN:完全限定域名,即每个域在全球唯一,域不是域名
4、DNS解析过程
(1)递归查询
递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
(2)迭代查询
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。
5、DNS服务器类型
主域名服务器(master):负责维护一个区域的所有域名信息,是特定的所有信息的权威信息源,数据可以修改。
辅助域名服务器(slave):当主域名服务器出现故障、关闭或负载过重时,辅助域名服务器作为主域名服务器的备份提供域名解析服务。辅助域名服务器中的区域文件中的数据是从另外的一台主域名服务器中复制过来的,是不可以修改的。
缓存域名服务器(cache):从某个远程服务器取得每次域名服务器的查询回答,一旦取得一个答案就将它放在高速缓存中,以后查询相同的信息就用高速缓存中的数据回答,缓存域名服务器不是权威的域名服务器,因为它提供的信息都是间接信息。
转发域名服务器(forward):负责所有非本地域名的本地查询。转发域名服务器接到查询请求后,在其缓存中查找,如找不到就将请求依次转发到指定的域名服务器,直到查找到结果为止,否则返回无法映射的结果。
hint:根DNS internet服务器集。
6、正向解析:根据主机名称(域名)查找对应的IP地址
反向解析:根据IP地址查找对应的主机域名
7、FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。
详细的解析过程:浏览器缓存——》系统hosts文件——》本地DNS解析器缓存——》本地域名服务器(本地配置区域资源、本地域名服务器缓存
)——》根域名服务器——》主域名服务器——》下一级域名域名服务器 客户端——》本地域名服务器(递归查询) 本地域名服务器
—》DNS服务器的交互查询是迭代查询
二、主DNS服务器的部署
1、部署环境(全程虚拟机进行)
bind:bind的主程序软件包,进程名为named
bind-chroot:为bind提供chroot功能,将bind进程限制在自己的家目录下,防止错误的权限设置影响到整个系统。
bind-utils:可使用nslookup、dig、host等命令
1[root@localhost ~]# yum -y install bind* //安装所有bind相关组件
2[root@localhost ~]# systemctl disable firewalld //设置防火墙开机不自启
3[root@localhost ~]# systemctl stop firewalld //停止防火墙
2、查看DNS相关配置文件
/etc/logrotate.d/named 日志轮滚策略文件
/etc/named.conf 主配置文件(存全局设置参数)
/etc/named.iscdlv.key 密钥文件
/etc/named.rfc1912.zones 区域配置文件(存域名信息或网段)
/etc/named.root.key
/etc/rndc.conf DNS远程管理的配置文件
/etc/rndc.key 远程管理的密钥文件
/etc/sysconfig/named
/var/named/named.ca 根域服务器的解析文件
/var/named/named.empty
/var/named/named.localhost localhost域名正向解析配置文件(资源记录文件)
/var/named/named.loopback 127.0.0.0网段的反向解析配置文件(资源记录文件)
3、编辑配置文件
[root@localhost ~]# vim /etc/named.conf //配置全局配置
options {
listen-on port 53 { any; }; //IPv4监听端口和IP地址,多个IP用;分号分隔,any为监听所有的IP地址。默认是127.0.0.1
listen-on-v6 port 53 { ::1; }; //IPv6监听端口和IP地址
directory "/var/named"; //解析的资源记录配置文件工作目录
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
forward first ; //优先转发
forwarders {222.172.200.68;61.166.150.123;}; //本机不能解析就转发带运营商的DNS服务器
allow-query { any; }; //允许查询的域名,默认是localhost
recursion yes; //允许递归查询
dnssec-enable yes; //启用dns安全策略
dnssec-validation yes; //启用dns的valid安全策略
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key"; //密钥文件
managed-keys-directory "/var/named/dynamic"; //管理密钥的工作目录
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
// include "/etc/named.root.key"; //注释掉此句,不然转发不起作用
[root@localhost ~]# vim /etc/named.rfc1912.zones //配置区域文件
1zone "xzd.com" IN {
2type master;
3file "xzd.com.zone";
4allow-update {192.168.137.4;};
5also-notify {192.168.137.4;}; //主动通知从域名服务器进行更新
6notify yes; // 开启通告,有更新就会通告给从服务器
7};
8
9zone "137.168.192.in-addr.arpa" IN {
10type master;
11file "192.168.137.arpa";
12allow-update {192.168.137.4;};
13also-notify {192.168.137.4;};
14notify yes;
15};
[root@localhost ~]# cd /var/named/
2[root@localhost named]# ll
3总用量 16
4drwxr-x---. 7 root named 61 11月 15 14:53 chroot
5drwxr-x---. 7 root named 61 11月 15 14:53 chroot_sdb
6drwxrwx---. 2 named named 6 8月 31 22:53 data
7drwxrwx---. 2 named named 6 8月 31 22:53 dynamic
8drwxrwx---. 2 root named 6 4月 1 2020 dyndb-ldap
9-rw-r-----. 1 root named 2253 4月 5 2018 named.ca
10-rw-r-----. 1 root named 152 12月 15 2009 named.empty
11-rw-r-----. 1 root named 152 6月 21 2007 named.localhost
12-rw-r-----. 1 root named 168 12月 15 2009 named.loopback
13drwxrwx---. 2 named named 6 8月 31 22:53 slaves
##正向解析
2[root@localhost named]# cp -a named.localhost xzd.com.zone //拷贝一份正向解析模板文件并重命名
3[root@localhost named]# vim xzd.com.zone //编辑正向解析配置文件
4$TTL 1D
5@ IN SOA xzd.com. 12345678.xzd.com. ( //注意结尾的点“.”
6 0 ; serial
7 1D ; refresh
8 1H ; retry
9 1W ; expire
10 3H ) ; minimum
11 NS ns.xzd.com. //注意结尾的点“.”
12ns IN A 192.168.137.3 //主区域地址记录 ns.xzd.com
13www IN A 192.168.137.2 //二级区域地址记录 www.xzd.com
14www1 IN CNAME www //别名记录 www1.xzd.com
##反向解析
2[root@localhost named]# cp -a named.loopback 192.168.137.arpa
3[root@localhost named]# vim 192.168.137.arpa
4$TTL 1D
5@ IN SOA xzd.com. 12345678.xzd.com. (
6 0 ; serial
7 1D ; refresh
8 1H ; retry
9 1W ; expire
10 3H ) ; minimum
11 NS ns.xzd.com.
12ns A 192.168.137.3
132 PTR www.xzd.com. //指针记录
143 PTR ns.xzd.com.
named-checkconf:检查主配置文件有无语法错误的工具
named-checkzone:检查区域配置文件有无语法错误的工具
1[root@localhost ~]# named-checkconf -z /etc/named.conf //检查主配置文件语法
2zone xzd.com/IN: loaded serial 0
3zone 137.168.192.in-addr.arpa/IN: loaded serial 0
4[root@localhost ~]# named-checkzone xzd.com /var/named/xzd.com.zone //检查区域配置文件语法
5zone xzd.com/IN: loaded serial 0
6OK
[root@localhost named]# systemctl restart named //重启named服务
[root@localhost named]# systemctl enable named //设置named开机启动
三、从服务器的部署
1、环境准备
[root@localhost ~]# yum -y install bind* //安装所有bind相关组件
[root@localhost ~]# systemctl disable firewalld //设置防火墙开机不自启
[root@localhost ~]# systemctl stop firewalld //停止防火墙
2、从DNS服务器的全局文件named.conf配置
options {
listen-on port 53 { 192.168.137.4; }; //这里要设置从DNS服务器的IP地址
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
forward only;
forwarders {222.172.200.68;61.166.150.123;};
allow-query { any; };
.
.
// include "/etc/named.root.key";
3、从DNS服务器配置区域文件
1zone "xzd.com" IN {
2type slave; //指明本机是从服务器
3masters {192.168.137.3;}; //指明主DNS服务器地址
4file "slaves/xzd.com.zone"; //往主DNS服务器中同步的文件存放位置
5};
6
7zone "137.168.192.in-addr.arpa" IN {
8type slave; //指明本机是从服务器
9masters {192.168.137.3;}; //往主DNS服务器中同步的文件存放位置
10file "slaves/192.168.137.arpa"; //指明主DNS服务器地址
11};
##分别重启主从DNS服务器的named服务
2[root@localhost ~]# systemctl restart named //重启named服务
1##查看从DNS服务器的named进程状态
2[root@localhost ~]# systemctl status named
3● named.service - Berkeley Internet Name Domain (DNS)
4 Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
5 Active: active (running) since 一 2021-11-22 15:08:45 CST; 13min ago
6 Process: 1705 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
7 Process: 1703 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
8 Main PID: 1707 (named)
9 CGroup: /system.slice/named.service
10 └─1707 /usr/sbin/named -u named -c /etc/named.conf
11
1211月 22 15:08:45 localhost.localdomain named[1707]: configuring command channel from '/etc/rndc.key'
1311月 22 15:08:45 localhost.localdomain named[1707]: command channel listening on ::1#953
1411月 22 15:08:45 localhost.localdomain named[1707]: managed-keys-zone: loaded serial 0
1511月 22 15:08:45 localhost.localdomain named[1707]: zone 137.168.192.in-addr.arpa/IN: loaded serial 0
1611月 22 15:08:45 localhost.localdomain named[1707]: zone xzd.com/IN: loaded serial 0
1711月 22 15:08:45 localhost.localdomain named[1707]: all zones loaded
1811月 22 15:08:45 localhost.localdomain named[1707]: running
1911月 22 15:08:45 localhost.localdomain systemd[1]: Started Berkeley Internet Name Domain (DNS).
2011月 22 15:08:45 localhost.localdomain named[1707]: zone xzd.com/IN: sending notifies (serial 0)
2111月 22 15:08:45 localhost.localdomain named[1707]: zone 137.168.192.in-addr.arpa/IN: sending notifies (serial 0)
22
23##查看同步的文件是否存在
24[root@localhost ~]# ll /var/named/slaves/
25总用量 8
26-rw-r--r--. 1 named named 259 11月 22 14:33 192.168.137.arpa
27-rw-r--r--. 1 named named 225 11月 22 14:33 xzd.com.zone
测试配置dns,查看结果
##先在从DNS服务器中测试
2[root@localhost ~]# ping www.xzd.com
3PING www.xzd.com (192.168.137.2) 56(84) bytes of data.
464 bytes from www.xzd.com (192.168.137.2): icmp_seq=1 ttl=64 time=1.63 ms
564 bytes from www.xzd.com (192.168.137.2): icmp_seq=2 ttl=64 time=0.614 ms
664 bytes from www.xzd.com (192.168.137.2): icmp_seq=3 ttl=64 time=0.618 ms
764 bytes from www.xzd.com (192.168.137.2): icmp_seq=4 ttl=64 time=0.630 ms
8^C
9--- www.xzd.com ping statistics ---
104 packets transmitted, 4 received, 0% packet loss, time 3004ms
11rtt min/avg/max/mdev = 0.614/0.874/1.634/0.438 ms
12[root@localhost ~]# nslookup 192.168.137.3
132.137.168.192.in-addr.arpa name = www.xzd.com.
143.137.168.192.in-addr.arpa name = ns.xzd.com.
15
16[root@localhost ~]# nslookup www.xzd.com
17Server: 192.168.137.3
18Address: 192.168.137.3#53
19
20Name: www.xzd.com
21Address: 192.168.137.2
[root@localhost ~]# systemctl stop named //停止主DNS服务器
2[root@localhost ~]# nslookup www.xzd.com
3Server: 192.168.137.4
4Address: 192.168.137.4#53
5
6Name: www.xzd.com
7Address: 192.168.137.2
8
9[root@localhost ~]#
dig命令是查询DNS域名服务器的灵活工具,它执行DNS查找并显示从查询的域名服务器返回的解析。大多数DNS管理员使用dig来解决DNS请求,因为它灵活、易用且输出清晰,其他查找工具的功能往往不如dig。
下面在浏览器中输入https://www.haopython.com,进行访问,然后同时利用WIRESHARK进行抓包,抓包后,通过显示过滤器显示DNS协议:
先查询Cache2-sjz主机,然后再发送到河北电信DNS服务器222.222.202.202,Transaction
ID(查询ID)都为0X1d34。K8S的DNS解析机制
1.集群域名和后缀:Kubernetes集群中的每个服务都会被分配一个域名,该域名由服务名称(Service Name)和命名空间(Namespace)组成。例如,一个服务名为my-service,位于命名空间my-namespace的服务的完整域名将是my-service.my-namespace.svc.cluster.local。svc.cluster.local是Kubernetes集群默认的后缀。
2.Kubernetes DNS服务器:Kubernetes集群内部有一个专用的DNS服务器负责处理服务的DNS解析请求。这个DNS服务器通常被命名为kube-dns或coredns。
3.解析流程:在进行DNS解析时,应用程序或服务可以使用服务名作为主机名(hostname),然后发送DNS查询请求到Kubernetes DNS服务器。
4.DNS查询:Kubernetes DNS服务器接收到DNS查询请求后,会根据请求中的域名信息进行解析。它首先进行域名拆分,将服务名、命名空间和集群后缀分离开。
5.域名解析:Kubernetes DNS服务器会依次解析域名的各个部分。它首先解析命名空间,然后根据服务名在该命名空间下查找对应的Service资源。
6.Service资源解析:Kubernetes DNS服务器在Service资源中查找与请求的服务名和命名空间匹配的条目。如果找到匹配项,将返回与之关联的Pod IP地址列表。
7.IP地址返回:Kubernetes DNS服务器将解析到的Pod IP地址返回给发起请求的应用程序或服务。
8.重试机制:如果在初始查询时没有找到匹配的Service资源,Kubernetes DNS服务器可能会进行一些重试机制,以确保服务名得到正确解析。这样做是因为在创建和删除Service资源的过程中,可能会存在一定的延迟。通过这种方式,Kubernetes
DNS解析机制使得服务能够通过服务名进行通信,无需关心具体的Pod IP地址。这种抽象层简化了服务之间的通信配置,并支持动态扩展和管理服务。查看域名 可以通过下面的命令查看域名
kubectl get svc my-service -n my-namespace -o
jsonpath=‘{.metadata.name}.{.metadata.namespace}.svc.cluster.local’
查看coredns 通过下面的命令可以查看coredns podkubectl -n kube-system get pods -l k8s-app=kube-dns
当然我们可以通过下面的命令查看coredns的配置kubectl -n kube-system get cm -l k8s-app=kube-dns kubectl describe cm
coredns -n kube-system 其核心配置如下.:53 {
errors
ready
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
import custom/*.override }1…:53 表示监听的 DNS 端口号为 53,. 表示根域名(Root Zone)。
2.kubernetes cluster.local in-addr.arpa ip6.arpa 定义了多个域和反向解析配置项。 ?kubernetes 是 Kubernetes 插件的名称,用于解析 Kubernetes 集群的服务和 Pod。
?cluster.local 是 Kubernetes 集群内部域名的默认后缀。 ?in-addr.arpa 和 ip6.arpa
是用于反向 DNS 解析的 IPv4 和 IPv6 地址后缀。 ?pods insecure 允许对 Pod
进行非安全(insecure)的 DNS 解析。 ?fallthrough in-addr.arpa ip6.arpa
表示如果查询未匹配到任何资源记录,则继续向下查询反向 DNS 解析。
3.forward . /etc/resolv.conf 将未能解析的 DNS 请求转发给 /etc/resolv.conf 文件中配置的其他 DNS 服务器。大家也可以去看pod中中/etc/host和/etc/resolv.conf然后也能发现一些迹象。
参考文献
https://mp.weixin.qq.com/s/ObY_b-satRIq1qZwWzelEg
https://mp.weixin.qq.com/s/0vP_Yd7kKlke9V8ub5-iYA
https://mp.weixin.qq.com/s/564dJuUcFc7Zf-9HaHPjsA