基于DNS View的按请求来源域名解析

时间:2024-03-01 14:48:07

一、项目需求

由于国内的实际情况,南北电信网通的互联问题一直是让所有网友所诟病的,由于政策问题,两家网络提供商互相连接的带宽有限,所以一些网站不得不在电信和网通的网络中分别架设服务器。一些网站打开后需要手动选择电信入口或者网络入口,这又给用户使用使用上带来了不便,如果我们能按照用户来自的网段自动解析出对应的电信或网通服务器地址就最好了。

二、项目分析

以此案为例,要能让DNS服务器分别对来源不同的IP地址做地址解析服务,我们需要收集电信和网通等这些网络提供商的IP网段,这样我们就能区分用户来自哪个提供商的网络了。获得这些网段数据我们可自行从网络上搜索,APNIC也提供了相关的获取工具。

DNS的配置方面我们可以在bind配置文件中使用view的方法来配置来源对应和解析,按照不同来源使用对应的zone文件来给出相应的解析。

三、实施过程-单服务器

首先,我们需要安装DNS服务,我在之前的实验中已经有详细的描述,这里不再重述。

编辑对应网通和电信网段的配置文件,由于这里bind使用了chroot,所以我们去到真实的目录:/var/named/chroot/etc/中下编辑两个文件对应网通的电信:

内容 1: /var/named/chroot/etc/Area_Chinanet.cfg

acl Chinanet_Users {192.168.0.13; 192.168.0.14; 192.168.0.15; 192.168.0.16; 192.168.0.17; 192.168.0.18; 192.168.0.19; 192.168.0.20; 192.168.0.21; 192.168.0.22; };

内容 2: /var/named/chroot/etc/Area_Chinatelecom.cfg

acl Chinatelecom_Users {192.168.0.2; 192.168.0.3; 192.168.0.4; 192.168.0.5; 192.168.0.6; 192.168.0.7; 192.168.0.8; 192.168.0.9; 192.168.0.10; 192.168.0.11; 192.168.0.12; };
#以上两个文件的内容就是IP地址的集合,这里我写成内网地址实验,也可以写成网络号。

内容 3: 配置文件 /var/named.conf

options {

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";

recursion yes;

};

logging {

channel default_debug {

file "data/named.run";

severity dynamic;

};

};

include "/etc/Area_Chinatelecom.cfg"; #包含了两个网络连接商的ip集合文件

include "/etc/Area_Chinanet.cfg"; #这里是chroot后的目录

view "Chinatelecom" { #第一个view对应“中国电信”

match-clients {Chinatelecom_Users; }; #匹配电信用户的IP

zone "baidu.com" { #baidu.com域

type master;

file "Chinatelecom/baidu.com.zone"; #对应中国电信的百度主机地址配置文件

#allow-transfer {192.168.0.12;};

};

};

view "Chinanet" { #对应中国网通的view

match-clients {Chinanet_Users;}; #对应网通IP段

zone "baidu.com" {

type master;

file "Chinanet/baidu.com.zone"; #百度的网通服务器地址配置文件

#allow-transfer{192.168.0.14;};

};

};

通过以上这些配置以后,我们的网通用户和电信用户会分别让两个不同的View截获,若是我们的数据库不完整,有些遗漏或者移动的用户来访问了,我们必须给出一个当前两个View都没匹配上的解决方案,所以在以上配置文件最下面再接上以下内容:

内容 4: 配置文件/etc/named.conf 续

view "others" {

match-clients {"any";}; #匹配上任意客户端地址

zone "baidu.com" {

type master;

file "Chinanet/baidu.com.zone";

allow-transfer{192.168.0.14;};

};

};

编写好了这个配置文件以后,我们需要创建对应的Chinanet目录和Chinatelecom目录,修改拥有组权限,并编写各个目录下对应的baidu.com.zone文件,这里我不再重述,可以具体去参考bind配置DNS服务器那一篇文章。

经过以上这些配置后,我们已经基本可以使用这个DNS服务器对不同客户来源IP进行域名解析。

五、实施过程-主从服务器

一般DNS服务器都设置从服务器以备待用,这里我们需要针对从服务器作些特殊配置。

在这里,我们需要特别的一些设定,从服务器想要能够获取到两个view中的内容,需要它的IP地址在两个view中都能匹配,所以我们给从服务器设定两个IP地址(从服务器原来的IP为192.168.0.44)。

ifconfig eth0:0 192.168.0.45 netmask 255.255.255.0 #模拟电信的IP

ifconfig eth0:1 192.168.0.46 netmask 255.255.255.0 #模拟网通的IP

在主服务器中,修改以上那个配置文件,修改的部分为:

view "Chinatelecom" { #第一个view对应“中国电信”

match-clients {Chinatelecom_Users; 192.168.0.45;!192.168.0.44;!192.168.0.46;}; #注意这里加入了从服务器的IP,阻止从服务器的另两个IP

zone "baidu.com" {

type master;

file "Chinatelecom/baidu.com.zone"; #对应中国电信的百度主机地址配置文件

allow-transfer {192.168.0.45;}; #允许把数据传送给从服务器

};

};
view "Chinanet" { #对应“中国网通”

match-clients {Chinanet_Users;192.168.0.46; !192.168.0.45;!192.168.0.44;}; #加入从服务器IP,并且阻止另外两个IP

zone "baidu.com" {

type master;

file "Chinanet/baidu.com.zone";

allow-transfer{192.168.0.46;}; #允许传送数据给服务器

};

};

从服务器前部分和主服务器一样,后面view部分需要修改:



内容 5: Chinatelecom View部分

view "Chinatelecom" {

match-clients {Chinatelecom_Users;192.168.0.45;!192.168.0.44;!192.168.0.46;};

zone "baidu.com" {

type slave;

file "slaves/Chinatelecom/baidu.com.zone"; #确保目录已创建,拥有者权限为named

masters{192.168.0.32; };

transfer-source 192.168.0.45; #由于从服务器有3个IP,这里指定了从哪个IP去传送

};

};



经过以上这些配置后,重启从服务器后就能更新到主服务器上的zone配置文件。


内容 6: Chinanet View 部分

view "Chinanet" {

match-clients {Chinanet_Users;192.168.0.46;!192.168.0.45;!192.168.0.44; };

zone "baidu.com" {

type slave;

file "slaves/Chinanet/baidu.com.zone";

masters{192.168.0.32; };

transfer-source 192.168.0.46;

};

};

六、总结

本文描述了通过不同来源处理DNS返回信息的一个过程,由此可免去用户每次点击选择网络提供商的麻烦,在一些环境下比较实用。