DNS(7) -- 智能DNS实现

2021/7/18 6:08:58

本文主要是介绍DNS(7) -- 智能DNS实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


目录
  • 1. 智能DNS
    • 1.1 智能DNS概述
    • 1.2 ACL控制列表
    • 1.3 智能DNS实现
      • 1.3.1 bind-view功能
      • 1.3.2 智能DNS场景实现
      • 1.3.3 生产场景配置示例


1. 智能DNS

1.1 智能DNS概述

智能DNS就是根据用户的来源地域,自动智能化判断来路IP返回给用户,而不需要用户进行选择。

  • 智能DNS实现的主要功能:

    • 可以根据用户来路和运营商智能判断最优访问线路;
    • 服务器故障自动替换宕机节点,保障最优访问线路;
    • 负载均衡:对于流量比较大的网站,可以把流量分配到几台不同的服务器上,以提高网站速度;
  • 比方一个企业的站点三个运营商的带宽都有:电信、联通、移动;同样来自三个不同 运营商网络的访问用户,假设电信用户访问企业网址的时候,智能DNS会自动根据IP判断,再从电信返回给电信用户,其他的也同理;

    • 电信用户:访问 www.sina.com 返回 1.1.1.1;

    • 联通用户:访问 www.sina.com 返回 2.2.2.2;

    • 移动用户:访问 www.sina.com 返回 3.3.3.3;

image

1.2 ACL控制列表

acl:访问控制列表;把一个或多个地址归并一个命名的集合,随后通过此名称即可对此集全内的所有主机实现统一调用;

  • bind内置了四个四种ACL

    • any :允许所有主机节点查询;

    • none :拒绝所有主机节点查询;

    • localhost :仅允许本地接口网络主机查询;

    • localnet :本地子网所有IP;

  • 也可以自定义ACL规则,示例如下:

    #1.复杂acl规则定义
    acl "ips" { 						 	<==定义一个名为ips的ACL 
    	10.0.0.1; 10.0.0.2; 192.168.1.1; 	<==包含3个单个IP 
    	172.16.1.0/24; 
    	... 
    };
    
    #2.复杂acl规则定义 
    acl "all_rule" {						<==定义一个名为all_rule的ACL 
    	"ips"; 								<==可以嵌套包含其他ACL 
    	10.0.15.0/24;						<==包含10.0.15.0子网中的所有IP
    	!10.0.16.1/24; 						<==非10.0.16.1子网的IP 
    	{10.0.17.1;10.0.18.2;}; 			<==包含了一个IP组 
    	localhost; 							<==本地网络接口IP(含实际接口IP和127.0.0.1) 
    };
    

1.3 智能DNS实现

1.3.1 bind-view功能

view 语句定义了视图功能,视图是BIND9提供的强大的新功能,允许DNS服务器根据不同的客户端,请求相同的域名,但返回不同的解析结果。

view的语法格式为:

view view_name [class] {                			<==view为声明关键字 ,后面加上自定义的view名称
	match-clients { address_match_list } ;			<==匹配的客户端ACL
    match-destinations { address_match_list } ;		<==匹配访问的目标地址的ACL; 
    match-recursive-only { yes_or_no } ; 			
    [ view_option; ...] 
};

view的功能的主要事项如下:

  • 一个bind服务器可定义多个view,每个view中可定义一个或多个zone;
  • 每个view用来匹配一组客户端;
  • 多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件;
  • 一旦启用了view,所有的zone都只能定义在view中,否则会失效;
  • 仅在允许递归请求的客户端所在view中定义根区域;
  • 客户端请求到达时,是自上而下检查每个view所服务的客户端列表;

1.3.2 智能DNS场景实现

  • 目标:

    • 客户端192.168.20.17请求域名eip.xuzhichao.com是解析到地址100.1.1.1;
    • 客户端192.168.20.30请求域名eip.xuzhichao.com是解析到地址100.2.2.2;
  • bind的配置文件如下:

    [root@dns01 named]# cat /etc/named.conf 
    options {
    	listen-on port 53 { localhost; };
    	listen-on-v6 port 53 { localhost; };
    	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";
    	recursing-file  "/var/named/data/named.recursing";
    	secroots-file   "/var/named/data/named.secroots";
    	allow-query     { any; };
    
    	recursion yes;
    	allow-recursion { 192.168.20.0/24; 192.168.50.0/24; };
    
    	allow-transfer {192.168.20.71;};
    	also-notify {192.168.20.71;};
    
    	dnssec-enable yes;
    	dnssec-validation yes;
    
    	bindkeys-file "/etc/named.root.key";
    
    	managed-keys-directory "/var/named/dynamic";
    
    	pid-file "/run/named/named.pid";
    	session-keyfile "/run/named/session.key";
    };
    
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
    
    acl "test-env" {        <==定义ACL
    	192.168.20.17;
    };
    
    acl "shengchan-env" {
    	192.168.20.30;
    };
    
    view "test-env-view" {   <==定义view
    	match-clients { "test-env"; };	<==匹配客户端地址
    	zone "xuzhichao.com" IN {   <==在view下定义区域配置文件
    		type master;
    		file "xuzhichao.com.test.zone";
    	};
    };
    
    
    view "shengchan-env-view" {
    	match-clients { "shengchan-env"; };
    	zone "xuzhichao.com" IN {
    		type master;
    		file "xuzhichao.com.shengchan.zone";
    	};
    };
    
    view "default" {
    	zone "." IN {
    		type hint;
    		file "named.ca";
    	};
    
    	include "/etc/named.rfc1912.zones";
    	include "/etc/named.xuzhichao.com.zone";
    };
    
    
    include "/etc/named.root.key";
    
  • 区域解析文件如下:

    [root@dns01 named]# cat /var/named/xuzhichao.com.shengchan.zone 
    $TTL 86400
    
    xuzhichao.com.	IN	SOA	ns1.xuzhichao.com.	mail.xuzhichao.com. (
    2021071603
    10800
    900
    604800
    86400
    )
    
    xuzhichao.com.	IN	NS	ns1.xuzhichao.com.
    xuzhichao.com.	IN	NS	ns2.xuzhichao.com.
    
    ns1		IN	A	192.168.20.70
    ns2		IN	A	192.168.20.71
    
    xuzhichao.com.	IN	MX	 10 mx1.xuzhichao.com.
    mx1		IN	A	 192.168.20.11
    
    eip.xuzhichao.com.	IN	A	100.2.2.2
    
    
    [root@dns01 named]# cat /var/named/xuzhichao.com.test.zone 
    $TTL 86400
    
    xuzhichao.com.	IN	SOA	ns1.xuzhichao.com.	mail.xuzhichao.com. (
    2021071603
    10800
    900
    604800
    86400
    )
    
    xuzhichao.com.	IN	NS	ns1.xuzhichao.com.
    xuzhichao.com.	IN	NS	ns2.xuzhichao.com.
    
    ns1		IN	A	192.168.20.70
    ns2		IN	A	192.168.20.71
    
    xuzhichao.com.	IN	MX	 10 mx1.xuzhichao.com.
    mx1		IN	A	 192.168.20.11
    
    eip.xuzhichao.com.	IN	A	100.1.1.1
    
    
    #修改属组和权限:
    [root@dns01 named]# chgrp named /var/named/xuzhichao.com.test.zone 
    [root@dns01 named]# chmod 640 /var/named/xuzhichao.com.test.zone
    [root@dns01 named]# chgrp named /var/named/xuzhichao.com.shengchan.zone 
    [root@dns01 named]# chmod 640 /var/named/xuzhichao.com.shengchan.zone 
    
  • 检测语法,重启bind服务:

    [root@dns01 named]# named-checkconf 
    [root@dns01 named]# named-checkzone xuzhichao.com /var/named/xuzhichao.com.test.zone 
    zone xuzhichao.com/IN: loaded serial 2021071603
    OK
    [root@dns01 named]# named-checkzone xuzhichao.com /var/named/xuzhichao.com.shengchan.zone 
    zone xuzhichao.com/IN: loaded serial 2021071603
    OK
    
  • 使用客户端测试效果:

    #1.使用192.168.20.17的客户端进行测试:
    [root@xuzhichao ~]# dig eip.xuzhichao.com @192.168.20.70 +short
    100.1.1.1
    
    #2.使用192.168.20.30的客户端进行测试:
    [root@dns-son ~]# dig eip.xuzhichao.com @192.168.20.70 +short
    100.2.2.2
    

1.3.3 生产场景配置示例

根据不同的运营商地址返回不同的DNS解析结果:

//电信IP访问控制列表
acl "telecomip"{ 
	telecom_IP; 
	... 
}; 
//联通IP访问控制列表 
acl "netcomip"{ 
	netcom_IP; 
	... 
}; 

view "telecom" { 
	match-clients { "telecomip"; }; 
	zone "ZONE_NAME" IN { 
		type master; 
		file "ZONE_NAME.telecom.zone"; 
	}; 
};

view "netcom" { 
	match-clients { "netcomip"; }; 
	zone "ZONE_NAME" IN { 
		type master; 
		file "ZONE_NAME.netcom.zone"; 
	}; 
};

view "default" { 
	match-clients { any; }; 
	zone "ZONE_NAME" IN { 
		type master; 
		file "ZONE_NAME.zone"; 
	}; 
};


这篇关于DNS(7) -- 智能DNS实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程