在Internet环境中,许多大型站点(新浪、网易、腾讯、搜狐……)会分别部署多台镜像服务器,不同地区或不同ISP接入的用户会自动连接到离他们最近的镜像服务器。针对类似这样的需求,对于这些站点的权威DNS服务器来说,如何根据客户机的来源不同而引导其访问正确的镜像服务器。需要用到“DNS分离解析”,有时候也成为智能解析。。。。。下面就来了解下"DNS分离解析"的运作原理吧!(http://www.mamicode.com/info-detail-7299.html)。
实质:依据不同来源的DNS查询,将同一个域名解析为不同的IP地址,这些IP地址对应的镜像服务器提供的内容是一样的。
下面实验一共由两台虚拟机完成:
DNS服务器: PC1
客户端: PC2
1、在PC1中安装bind服务
[root@PC1 ~]# yum install bind-chroot -y
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel7 | 4.1 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package bind-chroot.x86_64 32:9.9.4-14.el7 will be installed
--> Processing Dependency: bind = 32:9.9.4-14.el7 for package: 32:bind-chroot-9.9.4-14.el7.x86_64
--> Running transaction check
---> Package bind.x86_64 32:9.9.4-14.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
bind-chroot x86_64 32:9.9.4-14.el7 rhel7 81 k
Installing for dependencies:
bind x86_64 32:9.9.4-14.el7 rhel7 1.8 M
Transaction Summary
================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 1.8 M
Installed size: 4.3 M
Downloading packages:
--------------------------------------------------------------------------------
Total 9.7 MB/s | 1.8 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 32:bind-9.9.4-14.el7.x86_64 1/2
Installing : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2
rhel7/productid | 1.6 kB 00:00
Verifying : 32:bind-9.9.4-14.el7.x86_64 1/2
Verifying : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2
Installed:
bind-chroot.x86_64 32:9.9.4-14.el7
Dependency Installed:
bind.x86_64 32:9.9.4-14.el7
Complete!
2、在pc1中修改bind服务主配置文件
…………
9
10 options {
11 listen-on port 53 { any; }; ## 设定任何网卡都可以提供DNS服务
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named";
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 allow-query { any; }; ## 任何用户均可使用DNS查询服务
18
19 /*
20 - If you are building an AUTHORITATIVE DNS server, do NOT enable re cursion.
……………
44 logging {
45 channel default_debug {
46 file "data/named.run";
47 severity dynamic;
48 };
49 };
50
51 #zone "." IN { ## 注释掉 51-54 行,与分离解析服务冲突
52 # type hint;
53 # file "named.ca";
54 #};
55
56 include "/etc/named.rfc1912.zones";
57 include "/etc/named.root.key";
……
3、在PC1服务器中编辑区域配置文件
[root@PC1 ~]# vim /etc/named.rfc1912.zones
acl "china" { 122.71.115.0/24; }; ## 指定变量,将122.71.115.0/24网段指定为 china 变量,当做国内用户的网段
acl "america" { 106.185.25.0/24; }; ## 作为美国用户的网段
view "china"{
match-clients { "china"; }; ## 匹配
zone "linuxprobe.com" { ## 指定匹配规则文件
type master;
file "linuxprobe.com.china";
};
};
view "america"{
match-clients { "america"; };
zone "linuxprobe.com" {
type master;
file "linuxprobe.com.america";
};
};
4、在PC1服务器中建立数据配置文件
[root@PC1 ~]# cd /var/named/
[root@PC1 named]# ls
chroot dynamic named.empty named.loopback
data named.ca named.localhost slaves
[root@PC1 named]# cp -a named.localhost linuxprobe.com.china
[root@PC1 named]# cp -a named.localhost linuxprobe.com.america
[root@PC1 named]# vim linuxprobe.com.china ## 编辑国内用户匹配时使用的数据配置文件,国内用户访问 www.linuxprobe.com时,解析为122.71.115.10
$TTL 1D
@ IN SOA linuxprobe.com. root.linuxprobe.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.linuxprobe.com.
ns IN A 122.71.115.10
www IN A 122.71.115.10
[root@PC1 named]# vim linuxprobe.com.america ## 编辑美国用户匹配时使用的数据配置文件,美国用户访问时,解析为106.185.25.10
$TTL 1D
@ IN SOA linuxprobe.com. root.linuxprobe.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.linuxprobe.com.
ns IN A 106.185.25.10
www IN A 106.185.25.10
5、配置PC1主服务器网卡,网卡中要指定两个IP,这两个IP要分别在指定的国内网段(122.71.115.0/24)和美国网段(106.185.25.0/24)
6、重启PC1主机网卡、重启PC1主机bind服务,清空PC1主机防火墙
[root@PC1 named]# systemctl restart network
[root@PC1 named]# systemctl restart named
[root@PC1 named]# iptables -F ## 这一步很重要
7、模拟测试国内用户,将客户机PC2的IP配置为122.71.115.20(在122.71.115.0/24国内网段即可),DNS服务设置为122.71.115.1(PC1主机服务器对应网段IP)
8、重启PC2网卡服务(测试国内用户,IP在122.71.115.0/24内)
[root@PC2 network-scripts]# systemctl restart network
[root@PC2 network-scripts]# ifconfig | head -n 3
eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 122.71.115.20 netmask 255.255.255.0 broadcast 122.71.115.255
inet6 fe80::20c:29ff:fe25:bb3e prefixlen 64 scopeid 0x20<link>
9、在PC2中检测网络连通性(测试国内用户,IP在122.71.115.0/24内)
[root@PC2 network-scripts]# ping -c 3 122.71.115.20 ## 测试PC2本机
PING 122.71.115.20 (122.71.115.20) 56(84) bytes of data.
64 bytes from 122.71.115.20: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 122.71.115.20: icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from 122.71.115.20: icmp_seq=3 ttl=64 time=0.047 ms
--- 122.71.115.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.043/0.053/0.071/0.015 ms
[root@PC2 network-scripts]# ping -c 3 122.71.115.1 ## 测试PC2客户端和PC1服务端连通性
PING 122.71.115.1 (122.71.115.1) 56(84) bytes of data.
64 bytes from 122.71.115.1: icmp_seq=1 ttl=64 time=0.374 ms
64 bytes from 122.71.115.1: icmp_seq=2 ttl=64 time=0.226 ms
64 bytes from 122.71.115.1: icmp_seq=3 ttl=64 time=0.197 ms
--- 122.71.115.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.197/0.265/0.374/0.079 ms
9、测试国内用户请求DNS解析时返回的www.linuxprobe.com域名的IP
[root@PC2 network-scripts]# nslookup
> www.linuxprobe.com
Server: 122.71.115.1
Address: 122.71.115.1#53
Name: www.linuxprobe.com
Address: 122.71.115.10
10、同理,模拟测试美国用户,在pc2中将IP地址修改为106.185.25.25(106.185.25.0/24美国网段即可),DNS服务设定为106.185.25.1,重启网卡,测试DNS解析效果
[root@PC2 network-scripts]# systemctl restart network ## 测试 网络连通
[root@PC2 network-scripts]# ifconfig | head -n 3
eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 106.185.25.25 netmask 255.255.255.0 broadcast 106.185.25.255
inet6 fe80::20c:29ff:fe25:bb3e prefixlen 64 scopeid 0x20<link>
[root@PC2 network-scripts]# nslookup
> www.linuxprobe.com
Server: 106.185.25.1
Address: 106.185.25.1#53
Name: www.linuxprobe.com
Address: 106.185.25.10
通过以上实验可见:
国内用户请求解析www.linuxprobe.com时,返回122.71.115.10
美国用户请求解析www.linuxprobe.com时,返回106.185.25.10
也就是说实现了:同一个域名(www.linuxprobe.com)依据访客的不同解析为了不同的IP。
DNS分离解析的关键点:
DNS服务器中要设置不同的网段(例如国内和美国),和各自网段对应的DNS服务数据配置文件(域名和IP对应关系文件),这些不同的网段用户不同的访客访问时进行匹配,从而使用不同的数据配置文件实现域名解析。
DNS服务器中的IP地址要设置不同的IP,这些IP在对应的网段即可,客户端用户将使用对应的IP作为DNS服务,DNS服务器中不用指定DNS服务。
客户端主机使用的IP要与DNS服务器中定义的网段范围内(国内用户在国内用户范围内,美国用户在美国用户范围内),客户端的DNS服务应使用DNS服务器中对应网段的IP。也就是说客户端主机IP、客户端的DNS服务地址和DNS服务器中的IP应在同一网段中,其中客户端的DNS服务地址和DNS服务器中的IP是相同(以上针对一个地区而言,另一个地区时,同样如此)。