你有没有过这样的体验?
打开某个网站,浏览器半天没反应。
右下角突然弹出来一行字:服务器未响应。
你会不会下意识地骂一句:破网!
其实很多时候,不是网的问题。
是DNS出了问题。
你可以把它理解成互联网的电话簿。
每一个网站都像一家公司,有自己的地址(IP)。但一串数字不好记。
于是有了域名,就像公司的名字。
DNS就像一个智能查号台。
你输入域名,它告诉你对应的IP。
没有DNS,你上网就得像记电话号码一样背IP地址。
想象一下:每次打开微信要输入123.123.123.123,得多麻烦。

DNS系统将域名解析为IP地址
💡 知识点
DNS(Domain Name System)是因特网上作为域名和IP地址相互映射的一个分布式数据库。通过主机名获取对应的IP地址的过程称为域名解析。DNS协议运行在UDP协议之上,使用端口号53。
在网络早期,使用IP地址进行通信是可行的,但随着网络规模的扩大,记忆众多的数字IP地址变得不切实际。
于是,UNIX系统中出现了hosts文件,用于记录主机名与IP地址的对应关系。
然而,随着互联网的进一步发展,hosts文件的维护和同步问题日益突出,DNS系统应运而生。
DNS通过分布式数据库的方式,实现了域名和IP地址的高效映射,并不断演化至今,形成了多层架构体系。

DNS域名的层级结构
当你打开一个网页的时候,浏览器其实做了这些事。
先翻自己的小本本(本地缓存)看看有没有记过。
要是没有,就会去问家里的DNS服务器。
服务器也会先看自己的小本本(服务器缓存)。
有就直接告诉你答案。
没有的话,它就得开始打电话问别人。
从最顶层的根域服务器问起,一层一层往下找。
最后找到这个域名对应的IP,再告诉你。
顺便把答案存在自己的小本本里,下回再有人问就不用再去问别人了。

DNS域名解析的完整流程
📋 解析步骤
当客户端需要解析一个域名时,DNS服务器会按照以下步骤进行处理:
就像一家公司里的各个岗位。

DNS服务器实物
就像不同的电话号码类型。
DNS命名允许使用26个英文字母、10个数字以及连词号"-",且最多63字节长度。
若不按照此规范,bind也支持,但可能需要在master-view文件上配置check-names ignore。
BIND9是目前最流行的DNS服务器软件。我们可以通过它搭建自己的DNS服务器。

BIND9安装配置界面
配置yum源,使用CentOS6自带的yum源,并确保机器可以解析外网域名且能连接公网。
使用yum安装bind:
# 使用 yum 安装 bind
yum install bind-utils bind bind-devel bind-chroot编辑/etc/named.conf文件:
# 编辑 /etc/named.conf 文件
vi /etc/named.conf
# 配置内容示例
options {
version "1.1.1";
listen-on port 53 {any;};
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.106.196.115;8.8.8.8; };
};
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
include "/var/named/chroot/etc/view.conf";编辑/etc/rndc.key文件:
# 编辑 /etc/rndc.key 文件
vi /etc/rndc.key
# 配置内容示例
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};编辑/etc/rndc.conf文件:
# 编辑 /etc/rndc.conf 文件
vi /etc/rndc.conf
# 配置内容示例
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};编辑/var/named/chroot/etc/view.conf文件:
# 编辑 /var/named/chroot/etc/view.conf 文件
vi /var/named/chroot/etc/view.conf
# 配置内容示例
view "View" {
zone "lnh.com" {
type master;
file "lnh.com.zone";
allow-transfer {
10.255.253.211;
};
notify yes;
also-notify {
10.255.253.211;
};
};
};编辑/var/named/chroot/etc/lnh.com.zone文件:
# 编辑 /var/named/chroot/etc/lnh.com.zone 文件
vi /var/named/chroot/etc/lnh.com.zone
# 配置内容示例
$ORIGIN .
$TTL 3600 ; 1 hour
lnh.com IN SOA op.lnh.com. dns.lnh.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.lnh.com.
$ORIGIN lnh.com.
shanks A 1.2.3.4
op A 1.2.3.4修改目录权限,并启动服务:
# 修改目录权限,并启动服务
cd /var && chown -R named.named named/
/etc/init.d/named start
chkconfig named on
# 测试解析
dig @127.0.0.1 shanks.lnh.com同样使用yum安装bind:
# 同样使用 yum 安装 bind
yum install bind-utils bind bind-devel bind-chroot编辑/etc/named.conf文件(与单台DNS配置类似)。
编辑/etc/rndc.key和/etc/rndc.conf文件(与单台DNS配置相同)。
在从服务器上配置从属区域,编辑/var/named/chroot/etc/view.conf文件:
# 编辑 /var/named/chroot/etc/view.conf 文件,在从服务器上配置从属区域
vi /var/named/chroot/etc/view.conf
# 配置内容示例(从服务器)
view "SlaveView" {
zone "lnh.com" {
type slave;
masters {10.6.0.253; };
file "slave.lnh.com.zone";
};
};修改主服务器上的配置,将从服务器节点IP加入,并修改lnh.com.zone将serial+1:
# 修改主服务器上的 view.conf 配置,将从服务器节点 IP 加入,并修改 lnh.com.zone 将 serial+1
vi /var/named/chroot/etc/view.conf # 在主服务器上添加从服务器 IP
vi /var/named/chroot/etc/lnh.com.zone # 将 serial 值+1在从服务器上修改目录权限,并启动服务:
# 在从服务器上修改目录权限,并启动服务
cd /var && chown -R named.named named/
/etc/init.d/named start
chkconfig named on
# 回到主节点,执行 rndc reload
rndc reload在master节点的/var/named/chroot/etc/lnh.com.zone文件中添加记录:
# 在 master 节点的 /var/named/chroot/etc/lnh.com.zone 文件中添加记录
vi /var/named/chroot/etc/lnh.com.zone
# 添加 A 记录示例
a A 192.168.122.100
# 添加 CNAME 记录示例
cname CNAME a.lnh.com.
# 添加 MX 记录示例
mx MX 5 192.168.122.101添加PTR记录,编辑master节点的/var/named/chroot/etc/view.conf文件:
# 添加 PTR 记录,编辑 master 节点的 /var/named/chroot/etc/view.conf 文件
vi /var/named/chroot/etc/view.conf
# 添加 PTR 区域配置示例
zone "168.192.in-addr.arpa" {
type master;
file "168.192.zone";
allow-transfer {
10.6.0.254;
};
notify yes;
also-notify {
10.6.0.254;
};
};编辑master节点的/var/named/chroot/etc/168.192.zone文件:
# 编辑 master 节点的 /var/named/chroot/etc/168.192.zone 文件
vi /var/named/chroot/etc/168.192.zone
# 配置内容示例
$TTL 3600 ; 1 hour
@ IN SOA op.lnh.com. dns.lnh.com. (
2004 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.lnh.com.
102.122 IN PTR a.lnh.com.修改文件权限并重新加载配置:
# 修改文件权限并重新加载配置
chown named.named 168.192.zone
rndc reload在slave节点上编辑view.conf文件,添加PTR区域配置:
# 在 slave 节点上编辑 view.conf 文件,添加 PTR 区域配置
vi /var/named/chroot/etc/view.conf
# 配置内容示例(从服务器)
zone "168.192.in-addr.arpa" {
type slave;
masters {10.5.35.14; };
file "slave.168.192.zone";
};
# 使 slave 配置生效
rndc reload在两台机器上进行ptr记录的解析测试:
# 在两台机器上进行 ptr 记录的解析测试
host 192.168.122.102 127.0.0.1当然可以。给一个域名配置多个IP地址,每次访问的时候DNS服务器会轮询返回不同的IP。这样就能把流量分摊到不同的服务器上。
就像一家餐厅开了好几家分店,客人来了就给分配到不同的分店,避免一家店太忙了。

# 在 master 节点的 /var/named/chroot/etc/lnh.com.zone 文件中添加多条 A 记录
vi /var/named/chroot/etc/lnh.com.zone
# 添加 A 记录示例
a A 192.168.122.102
# 将 serial 值+1并重新加载配置
rndc reload
# 在 master 和 slave 上解析测试
host a.lnh.com 127.0.0.1简单来说,就是可以根据访问者的位置返回不同的IP。比如一个网站在北京和上海都有服务器,来自北京的用户就分配到北京的服务器,这样速度更快。来自上海的用户就分配到上海的服务器。就像打车软件会把你分配到最近的司机那里。

智能DNS根据用户位置返回最近的服务器
在master节点的/var/named/chroot/etc/named.conf文件中添加acl规则:
# 在 master 节点的 /var/named/chroot/etc/named.conf 文件中添加 acl 规则
vi /var/named/chroot/etc/named.conf
# 添加 acl 规则示例
acl group1 {
10.5.35.14;
};
acl group2 {
10.5.35.15;
};编辑/var/named/chroot/etc/view.conf文件,配置不同的视图:
# 编辑 /var/named/chroot/etc/view.conf 文件,配置不同的视图
vi /var/named/chroot/etc/view.conf
# 配置视图示例
view "GROUP1" {
match-clients { group1; };
zone "viewlnh.com" {
type master;
file "group1.viewlnh.com.zone";
};
};
view "GROUP2" {
match-clients { group2; };
zone "viewlnh.com" {
type master;
file "group2.viewlnh.com.zone";
};
};编辑不同的区域文件,设置对应的域名解析记录:
# 编辑不同的区域文件,设置对应的域名解析记录
vi /var/named/chroot/etc/group1.viewlnh.com.zone
# 配置内容示例
$ORIGIN .
$TTL 3600 ; 1 hour
viewlnh.com IN SOA op.viewlnh.com. dns.viewlnh.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.viewlnh.com.
$ORIGIN viewlnh.com.
op A 192.168.122.1
view A 192.168.122.1
vi /var/named/chroot/etc/group2.viewlnh.com.zone
# 配置内容示例
$ORIGIN .
$TTL 3600 ; 1 hour
viewlnh.com IN SOA op.viewlnh.com. dns.viewlnh.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.viewlnh.com.
$ORIGIN viewlnh.com.
op A 192.168.122.2
view A 192.168.122.2修改文件所属权限并重新加载配置:
# 修改文件所属权限并重新加载配置
chown named.named /var/named/chroot/etc/group*.zone
rndc reload
# 在不同的主机上进行域名解析测试
# 主机 A 上执行
host view.viewlnh.com 127.0.0.1
# 主机 B 上执行
host view.viewlnh.com 127.0.0.1选择12c以上配置的CPU,16G内存,千兆网络。
关闭selinux和iptables,调整ulimit限制。
# 关闭 selinux
vi /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
# 关闭 iptables
chkconfig iptables off
# 调整 ulimit 限制
echo -e '* soft nproc 65536\n* hard nproc 65536\n* soft nofile 65536\n* hard nofile 65536\n' >> /etc/security/limits.conf采用lvs-dr模式负载均衡,多idc,多套dns集群,通过master-slave技术保证dns配置的一致性。在物理层、服务层和客户端层分别采取相应措施,确保系统的高可用性和高性能。
企业级DNS全球服务架构

安装queryperf,下载并编译bind源码,编辑域名记录文件,进行压测,评估dns-server的性能。
# 安装 queryperf
wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz
tar zxf bind-9.7.3.tar.gz
cd bind-9.7.3/contrib/queryperf/
./configure
make
# 将 queryperf 拷贝至 /usr/bin/ 下
cp queryperf /usr/bin/
# 编辑域名记录文件 test.txt
# 文件内容示例
www.baidu.com A
www.baidu.com A
www.baidu.com A
www.baidu.com A
www.baidu.com A
# 压测命令
queryperf -d test.txt -s 8.8.8.8结合zabbix实现系统基础性能、loopback地址绑定状态、dns数据一致性、dns响应时间和每秒请求数等的监控。
# dns 每秒请求数监控脚本示例
#!/bin/bash
# rndc stats
STATS='/var/named/chroot/var/log/named_stats'
if [[ $# -ne 1 ]]
then
echo "$0 [querys]"
exit 2
else
which=$1
fi
if [[ -f "${STATS}" ]]
then
echo > ${STATS}
rndc stats >/dev/null 2>&1
else
echo "${STATS} not found."
exit 2
fi
case ${which} in
querys)
RESULT=`awk '{if ($2=="QUERY") {print $1}}' ${STATS}`
;;
*)
echo "$0 [querys]"
exit 2
;;
esac
echo ${RESULT}通过saltstack实现自动、批量安装、部署dns,并采用自定义的配置管理方案,将dns配置与数据库结合,实现对域名的增删改查操作的自动化。
时刻关注dns相关的漏洞和补丁,选择可靠的域名服务商,对服务器登录日志进行监控分析。

企业级DNS安全防护架构
确保所有监控均处于生效状态,新机器在saltstack上完成初始化和安装、部署操作,针对dns架构调整的操作在流量低谷时进行,对集群扩容操作时对新加入节点做压测并检测重启后各项指标是否正常,关注dns相关新闻。

递归查询与迭代查询的区别
DNS是互联网最基础的服务之一。看起来简单,但是很重要。
几乎每一次网络访问都会用到它。但因为它默默无闻,所以经常被忽略。
了解DNS的原理和部署方法,对于运维人员来说是必备的技能。
最好的网络是你感觉不到它存在的网络。
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!