01-DNS服务
域名解析
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 | BIND (Berkley Internet Naming Daemon) |
- 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 | sudo vim /etc/bind/named.conf.local |
编辑区域文件
可以自己手动创建一个文件,但那样效率不高,可以拷贝一份现成的文件
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 | sudo named-checkconf 如果没返回任何结果, 表示配置文件没有错误 |
客户端解析验证
1 | dig lab.com ns @10.1.8.10 |
反向区域(反向域名解析)
把IP解析到域名,如反垃圾邮件。
1 | sudo vim /etc/bind/named.conf.local |
编辑反向区域文件:
1 | sudo cp /etc/bind/db.127 /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 | dig @10.1.8.10 lab.com axfr |
修改master服务器设置
1 | sudo vi /etc/bind/named.conf.loacl |
1 | sudo vi /etc/bind/db.lab.com |
1 | sudo vi /etc/bind/db.10.1.8 |
安装第二台DNS服务器并配置
1 | sudo vi /etc/bind/named.conf.options |
1 | /var/cache/bind/ |
记录更新通知
- slave服务器到达更新周期
- 客户端数据加密保存,不能直接修改
- Master服务器通知版本号
1 | sudo vi /etc/bind/named.conf.loacl |
配置Cache DNS服务器
主配置文件
1 | sudo vi /etc/bind/named.conf |
全局转发DNS服务器
1 | sudo vi /etc/bind/named.conf.options |
区域转发
1 | sudo vi /etc/bind/named.conf.options |