域名解析

DNS(Domain Name Service)

将容易记的主机名映射到IP地址

计算机命名规范

  • Netbios 名称
  • Hostname
  • DNS分布式名称系统

DNS服务结构

  • 域名(sina.com.cn)
  • FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(www.sina.com.cn)

DNS记录类型

  • NS 域名服务器记录
  • A 主机记录
  • CNAME 别名记录,另外一个主机的别名
  • MX 邮件交换记录
  • PTR 指针记录(反向查询)
  • SOA 起始授权记录
  • DNS命令空间
  • 逐级委派
  • ICANN负责管理
  • www.ubuntu.com. 这里后面有个点

比如说你要找www.ubuntu.com, 只有找到那个点,点会告诉你,我委派的com域名服务器的ip地址是什么,com域名服务器 因为是它委派下去的Ubuntu这个域的域名服务器的ip。这样你就可以找到Ubuntu这个域的域名服务器,再问Ubuntu这个域的域名服务器www.ubuntu.com它的FQDN名称对应的ip地址是什么。

DNS是 树形结构,像.com / .org等都是顶级域名,并不是树的根。DNS分布式数据库的域名空间的根就是如图上的一个点,之下才是顶级域名,顶级域下面才是二级域,像.com下面有ubuntu,Ubuntu域之下有自己的各种主机记录

根域名

详情见http://www.ruanyifeng.com/blog/2018/05/root-domain.html

由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.example.com被写成www.example.com.,即最后还会多出一个点。这个点就是根域名。

理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。

比如,我要访问www.example.com,就必须先询问 ICANN 的根域名列表,它会告诉我.com域名由 Verisign 托管,我必须去找 Verisign,它会告诉我example.com服务器在哪里。

再比如,我要访问abc.xyz,也必须先去询问根域名列表,它会告诉我.xyz域名由 CentralNic 公司托管。根域名列表还记载,.google由谷歌公司托管,.apple由苹果公司托管等等。

由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存,所以根域名的查询事实上不是那么频繁。

DNS查询结构

三种DNS服务器

  • Master 可以用来修改DNS记录的服务器,修改完之后的所有记录都是保存在本地的一个DNS数据库或者一个区域文件里面,而且修改的操作会被同步到同一个域里面的其他域名服务器。
  • Slave 相对于Master来说的,一般只有一台Master服务器,修改域名解析记录,Slave同步Master的记录
  • Cache 不保存记录,没有任何DNS记录,什么A记录、CNAME记录都没有,这也是台DNS服务器。你也可以向它查询DNS记录,但它本身不保存任何区域的记录文件。 通常这种缓存类型的DNS服务器都是运营商提供的,像北京网通这样的。
    • cache不是永久保存DNS记录,TTL 生命周期

  • 还有一种转发类型的服务器 Forword

安装DNS服务

1
2
3
4
5
BIND (Berkley Internet Naming Daemon)

sudo apt install bind9 dnsutils

cat /etc/bind/db.root
  • DNS服务器只保存和解析本域各种域名记录
  • DNS服务器都包含13个根域域名服务器地址
    • 事实上分布于世界的数百台服务器
  • DNS服务器的DNS服务器配置
    • 自己做迭代
    • 指定递归域名服务器
  • DNS默认服务端口
    • TCP 53 / UDP 53
    • 服务器的域名查询都是走UDP 53端口的, 服务器之间做信息同步的通信使用TCP 53端口

BIND的代替方案

  • Djbdns
    • Dbndns、ndjbdns
  • dnsmasq
    • DNS + DHCP 打包的轻量解决方案
  • PowerDNS
    • 模块化开源DNS服务器软件

DNS服务器

配置Master DNS服务器

指定区域文件(正向区域)正向就是把域名解析成ip

1
2
3
4
5
6
7
8
sudo vim /etc/bind/named.conf.local


定义的方法:
zone "lab.com" {
type master;
file "/etc/bind/db.lab.com"; // 这里指定文件存放记录解析的记录
};

编辑区域文件

可以自己手动创建一个文件,但那样效率不高,可以拷贝一份现成的文件

1
sudo cp db.local db.lab.com

  • 管理邮箱: root@lab.com
  • $TTL 允许缓存时长
  • 手动增加Serial
  • Slave更新周期
    • Refresh、Retry、Expire
    • 8H、1D、2W

配置文件如下图显示:

详解参数:

  • root.lab.com. 管理员邮箱,其中的.相当于@
  • Serial 序列号,这是为了后续配置slave服务器做准备。因为slave一看到Serial(比如说刚开始为2),就知道自己不需要同步更新了,如果Serial变为3,slave看到,知晓master更新了记录有新的变化,slave就要同步master服务器。总的来说,就是为了同一个局域网内部多个DNS服务器之间数据同步版本之间比较的一个值。
  • Refresh 指的是更新周期,默认是7天尝试同步一次
  • Retry 默认是1天时间 如果7天内没联系上master服务器,就过1天时间重试
  • Expire 默认是28天, 会一直重试28天时间

如果28天之后还是联系不上master服务器,slave里面存放的各种记录会失效;

但是在28天之内有人向slave服务器做域名查询请求,还是会返回我的解析记录

服务器配置检查

1
2
sudo named-checkconf        如果没返回任何结果, 表示配置文件没有错误
sudo named-checkzone lab.com /etc/bind/db.lab.com

客户端解析验证

1
2
3
4
dig lab.com ns @10.1.8.10
dig www.lab.com @10.1.8.10
dig lab.com a @10.1.8.10
dig lab.com mx @10.1.8.10

反向区域(反向域名解析)

把IP解析到域名,如反垃圾邮件。

1
2
3
4
5
6
7
8
9
10
sudo vim /etc/bind/named.conf.local

# 添加配置
zone "8.1.10.in-addr.arpa" { # 将ip反着来写,给10.1.8.0/24网段地址解析
type master;
file "/etc/bind/db.10.1.8";
};



编辑反向区域文件:

1
2
3
4
sudo cp /etc/bind/db.127 /etc/bind/db.10.1.8       # 拷贝模板文件

sudo vi /etc/bind/db.10.1.8

反向域名查询

1
dig -x 10.1.8.2 @10.1.8.10

配置Slave DNS服务器

  • 为实现冗余容错这样的一个可用性的需求,通常会为每个域安装多个Slave DNS服务器
  • 修改记录只在Master上操作,通过版本号通知Slave服务器同步

安全考虑:

  • 服务器全局禁止区域传输(同步本域所有DNS记录)
  • 至允许指定IP、指定区域的Slave服务器进行区域传输
  • 区域数据同步使用TCP 53端口
1
2
3
4
5
6
7
8
dig @10.1.8.10 lab.com axfr

sudo vi /etc/bind/named.conf.options

# 增加
options {
allow-transfer { none; };
};

修改master服务器设置

1
2
3
4
5
6
7
8
9
10
11
12
sudo vi /etc/bind/named.conf.loacl

# 增加
zone "lab.com" {
allow-transfer { 10.1.8.20; };
};

zone "8.1.10.in-addr.arpa" {
allow-transfer { 10.1.8.20; }; # 10.1.8.20是slave服务器
};


1
sudo vi /etc/bind/db.lab.com  

1
sudo vi /etc/bind/db.10.1.8

安装第二台DNS服务器并配置

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
30
31
32
33
34
35
36
37
38
sudo vi /etc/bind/named.conf.options

# 配置
acl "local" {
10.1.8.0/24;
};

options {
allow-transfer { none; };
recursion yes;
allow-recursion { local; };
listen-on { 10.1.8.20; };
forwarders {
8.8.8.8
};
};


# 重启服务


# 创建区域
sudo vim /etc/bind/named.conf.local

# 添加配置
zone "lab.com"
type slave;
file "db.lab.com";
masters { 10.1.6.10; };
};

zone "8.1.10-in-addr.arpa" {
type slave;
file "db.10.1.8";
masters { 10.1.8.10; };
};

# 重启服务
1
2
/var/cache/bind/
grep bind /var/log/syslog

记录更新通知

  • slave服务器到达更新周期
  • 客户端数据加密保存,不能直接修改
  • Master服务器通知版本号
1
2
3
4
sudo vi /etc/bind/named.conf.loacl

# 在区域中添加
also-notify { 10.1.8.20; } # 尽快更新

配置Cache DNS服务器

主配置文件

1
2
3
4
5
6
sudo vi /etc/bind/named.conf

# 只有如下信息
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

全局转发DNS服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo vi /etc/bind/named.conf.options


# 添加如下配置
acl "local" { # 在options块之前
10.1.8.0/24; # 本地网段
};

options {
recursion yes; # recursion 递归查询
allow-recursion { local; }; # 做限制,只有local使用递归查询
listen-on { 10.1.8.10; }; # 指定帧听的地址
forwarders{ # 转发
8.8.8.8
};
};


sudo systemctl restart bind9 # 重启服务

区域转发

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
sudo vi /etc/bind/named.conf.options

# 对指定域名做定向的转发
acl "local" { # 在options块之前
10.1.8.0/24; # 本地网段
};

options {
recursion yes; # recursion 递归查询
allow-recursion { local; }; # 做限制,只有local使用递归查询
listen-on { 10.1.8.10; }; # 指定帧听的地址
forwarders { # 转发
8.8.8.8
};
};

zone "sina.com.cn" {
type forward;
forwarders {
180.76.76.76; # 百度的DNS服务器
};
};


# 重启服务
sudo systemctl restart bind9