威斯尼人娱乐场C#落成DNS深入分析服务和智能DNS服务

为了满足需求,不少单位和个人都创建了多个不同的Web站点,为了尽可能地节省站点建设费用,这些站点一般都采用一机多站技术,也就是我们平时所提到的虚拟主机技术,这种技术就是在一台只有一个公网IP的服务器中,同时运行多个独立域名的Web站点,
多个不同的网站域名同时指向相同的一个公网IP地址。这就要求在实际建站的时候,要让DNS服务器实现集中解析。

DNS解析是一种非常常见的解析方式,来看一下百度百科的说明:

智能DNS又称为解析切割,是对请求DNS解析的IP地址进行判断,将域名解析成不同的地址

C#实现DNS解析服务有一个开源项目ARSoft.Tools.Net,
ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation,
SenderID validation以及DNS Client、DNS
Server接口。使用该接口可轻松实现DNS客户请求端及服务器解析端。项目地址:。用法可以参考这篇文章《【原创】C#编程实现DNS
Client和Server》。

DNS智能解析的实质:基于不同的来源,dns服务器返回不同的结果

逐一绑定法,其实就是指将不同网站的域名用手工设置的方法逐一解析到相同的一个IP地址上。以Windows
2003服务器系统为例,假设我们事先已经向ISP申请了一个aaaa.com的域名,我们首先要做的第一项工作就是要将该域名解析到单位服务器的公网IP地址上,假设该公网IP地址为123.123.123.123,该域名的具体解析步骤如下:

DNS(Domain Name
System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC
2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC
2308对DNS查询的反向缓存进行说明。

一般智能DNS应用常见的场景就是CDN,中国特色社会主义的网络导致了电信和联通这2个特色的运营商,而这2个运营商通过在北京某机房的100G带宽相连,这就导致了电信用户访问联通的网络就会非常慢。玩游戏的童鞋就知道用游戏加速器来解决问题,但一般的用户访问在不同运营商网络的服务器时,变得非常慢。于是苦逼的服务提供商为了更好的用户体验就不得不去花费一笔钱去买CDN服务了。。。。

Codeplex上还有一个HDDevWebTeam开发的一款智能DNS服务器,实现不同网络运行商用户请求同一个域名地址
得到不同ip解析结果功能,从而使不同网络运行商用户的访问得到足够优秀的网络体验.
项目地址,这个项目也用到了AlexReinert 的
ARSoft.Tools.Net项目。

DNS策略解析最基本的功能是可以智能的判断访问您网站的用户,然后根据不同的访问者把您的域名分别解析成不同的IP地址。如访问者是网通用户,DNS策略解析服务器会把你的域名对应的网通IP地址解析给这个访问者。DNS策略解析服务器会把您域名对应的电信IP地址解析给这个访问者。

首先依次单击“开始”/“程序”/“管理工具”/“DNS”命令,打开本地服务器系统中的DNS控制台窗口,然后用鼠标右键单击本地服务器的主机名称,从弹出的右键菜单中执行“新建区域”命令,然后在弹出的新建区域向导窗口中将新的区域名称设置为“aaaa.com”,单击
“确定”按钮。

简单点说就是我们想登陆某一个网页,只需要记住有主观意义的域名,比如说www.bytedance.com,
www.baidu.com, www.sina.cn
等等,甚至可以简单地把dns理解为一个key-value的分布式数据库,其中key值就是域名,而value就是域名对应的ip地址,这里并不是一一对应的关系,一个域名可以对应多个ip地址,这样做是为了防止当一个ip地址不可用时,可以切换到另一个ip地址,从而不会影响用户的业务。

CDN的原理就是在智能DNS基础上进行web的反向代理缓存实现的。通过不同地域的请求解析到对应地域的缓存服务器上,然后缓存服务器对主服务器进行数据请求,最终返回给客户。这对于静态页面的网站有着很好的加速。

威尼斯人彩票 1

实验环境:dns服务器是在CentOS6.4
32位操作系统上实现的,中间用了一台H3C的防火墙。Internet用的是一台电脑pc模拟的。

然后,我们还需要在域名下面创建一个“www”的主机名记录。用鼠标右键直接单击前面已经创建好的“aaaa.com”区域名称,从弹出的右键菜单中执行“新建主机”命令,并在其后出现的主机创建对话框的“名称”框中输入“www”,在IP地址框中输入“123.123.123.123”,最后再单击一下“添加主机”按钮,这么一来域名为“www.aaaa.com”的Web站点就会被成功解析到单位服务器中的公网IP地址上了。当解析设置操作完成后,该网站的域名一般都能即时生效,因此我们可以使用Ping命令检查一下自己设置的域名是否能够Ping通,要是已经Ping通的话就说明解析操作已经成功了。

关于dns的原理我们就简单介绍到这里,今天我们要讲的是chromium是如何实现dns解析的。大家可能对chromiun有点陌生,但我相信很多人一定都用过chrome浏览器,实际上chromiun就是chrome的项目源码名称,可不要小瞧chrome浏览器,其复杂程度不亚于一个操作系统,甚至你可以直接把chrome浏览器看成一个web操作系统,关于这个项目有很多值得学习的地方,比如说它的多进程调度,渲染器的使用,浏览器加速算法等等,在这里我们只关注它对于网络部分的实现.

这里就不得不提一下著名的提供智能DNS解析服务的DNSpod(目前已被腾讯收购,软件源代码已经开源,宣称非BIND可以比拟,有兴趣的童鞋可以去研究研究)。还有比较著名的CDN服务提供商有帝盟等。。。

 

实验中用到的mysql-5.5.15-linux2.6-i686.tar.gz可以到mysql的官方网站
www.mysql.com 下载,bind-9.8.6-P1.tar.gz

一般情况下,网友除了喜欢用带“www”的网址“www.aaaa.com”来访问目标网站外,还喜欢直接用不带“www”的“aaaa.com”域名来访问,现在我们把“aaaa.com”域名也同时解析到服务器的公网IP地址上。在进行这种解析操作时,我们还需要用鼠标右键单击“aaaa.com”域名,从弹出的右键菜单中执行“新建主机”命令,并在其后出现的主机创建对话框的“名称”框中不输入任何内容,在IP地址框中输入“123.123.123.123”,然后再单击一下“添加主机”按钮,这么一来域名为“aaaa.com”的Web站点也会被成功解析到单位服务器中的公网IP地址上了。如此一来,域名解析操作就算全部结束了,域名“www.aaaa.com”和“aaaa.com”都能成功地解析到了唯一的公网IP地址上了。当然要是还有其他的网站域名需要解析时,我们可以依照上面的操作来逐一将它们绑定到唯一的公网IP地址上。

Chromium中关于网络方面的实现均在net库中,实现了包括dns、http、udp、ftp、quic等等大家熟知的协议,大家感兴趣的话可以去网上下载chromium的源代码。

还会一种会使用到智能DNS的场景:在公司内部NS服务器上区分内部和外部的请求,将内部请求解析到内网地址上,外网请求解析到外网地址上,此篇博文针对此应用展开

DNS.NET Resolver
(C#)

网络拓扑图如下:

下面,我们可以创建两个Web站点,并将这些站点的域名分别设置为“www.aaaa.com”、“bbbb.aaaa.com”,每个站点的名称最好能和域名对应起来,这样一来服务器中日后保存有多个站点时能够方便辨认与管理。在创建Web站点时,我们可以依次单击Windows
2003服务器系统桌面中的“开始”/“程序”/“管理工具”/“Internet信息服务(IIS)管理器”命令,打开IIS6管理窗口,在该窗口的左侧区域用鼠标右键单击“网站”项目,从弹出的右键菜单中依次选择“新建”/“网站”命令,打开网站创建向导设置窗口。

dns的代码路径是 src/net/dns,
通过下图可以看到文件有很多个,如果一个个点进去看,既浪费时间又很难真正理解dns的精髓。

BIND实现智能DNS的原理是通过view的方式,首先判断客户请求的来源,然后返回不同的IP

威尼斯人彩票 2

单击其中的“下一步”按钮后弹出网站描述向导界面,考虑到要和对应的域名保持一致,以便日后管理网站,因此在“描述”文本框中输入“www主站”;继续单击“下一步”按钮打开如图2所示的“IP地址和端口设置”窗口,
在这里我们通常将“IP地址”设置为缺省的“全部未分配”,将“端口号”设置为缺省的80,将“此网站的主机头”设置为“www.aaaa.com”。

威尼斯人彩票 3

规划:为lustlost.com域进行智能解析

试验结果预期:内网用户解析出来的地址是192.168.80.12,外网地址解析出来的地址是61.130.130.1.

接下来向导窗口会自动提示我们选择缺省网站文件存放位置,我们可以单击“浏览”按钮打开文件选择对话框,找到目标Web站点所对应的文件夹就可以了。在指定好目标网站的正确目录信息后,继续点击“下一步”按钮,然后在目标网站的访问权限处选择“读取”权限,要是目标站点是ASP动态页面的话,我们还需要选中这里的“运行脚本”项目,最后再单击“下一步”按钮结束”站点的创建工作,站点也就发布成功了,当我们日后需要访问该站点的内容时,可以直接打开IE浏览器并在地址栏中输入。

下面我就带大家看一看chrome对于dns解析的实现:

分2个网段,192.168.92.0/24网段的请求解析到192.168.92.102主机上,
其它网段解析到172.19.19.102主机

[root@localhost ~]# tar -zxvf mysql-5.5.15-linux2.6-i686.tar.gz -C
/usr/local/

第一步首先关注核心函数,这里的核心函数是指dns整个模块对外的一个接口,简单点说就是当用户在浏览器中输入网址时,主进程便会调用dns模块中的这个文件来获取相应的ip地址,而这里的核心函数就位于
host_resolver_impl.cc 中,其核心函数为:

这里172.19.19.102模拟外网。

把源码解压到/usr/local/目录下

int HostResolverImpl::Resolve(const RequestInfo& info,

这和一般公司的模式很接近,为公司内部提供内部私网地址的解析,避免路由器性能浪费。为外部提供公网地址的解析。

[root@localhost ~]# cd /usr/local/

RequestPriority priority,

ns服务器的IP地址为192.168.92.102和172.19.19.102

[root@localhost local]# ln -s mysql-5.5.15-linux2.6-i686 mysql

AddressList* addresses,

[root@lustlost ~]# yum install bind caching-nameserver –y
#安装bind和caching-nameserver,这里的caching-nameserver已经给我们在相应目录下提供了配置文件,根区域和本地区域的数据文件,而且它的主配置是默认以view方式配置的

进入解压好的目录,为了方便访问给此目录创建一个快捷方式

const CompletionCallback& callback,

[root@lustlost etc]# cp /etc/named.caching-nameserver.conf named.conf
#用cp备份原配置文件,建立要使用的配置文件,然后进行修改

[root@localhost local]# cd mysql

RequestHandle* out_req,

[威斯尼人娱乐场,root@lustlost etc]# vim /etc/named.conf

[root@localhost mysql]# vim INSTALL-BINARY

const BoundNetLog& source_net_log) ;

  1. #首先定义控制列表,这里定义了内网的网段 
  2.  
  3. acl innet {  
  4.         127.0.0.0/8;  
  5. 威尼斯人彩票,        192.168.92.0/24;  
  6. }; 
  7.  
  8. #全局配置,精简一点,只配置数据文件目录位置 
  9.  
  10. options {  
  11.         directory       “/var/named”;  
  12. }; 
  13.  
  14. #创建内网用户的view 
  15.  
  16. view in {  
  17.         match-clients      { innet; };            #定义用户为控制列表中所定义的  
  18.         recursion yes;  #允许内网用户进行递归查询 
  19.  
  20. #下面是定义根区域和本地区域的正反解析 
  21.  
  22.         zone “.” IN {                
  23.                 type hint;  
  24.                 file “named.ca”;  
  25.         }       
  26.  
  27.         zone “localhost” IN {  
  28.                 type master;  
  29.                 file “localhost.zone”;  
  30.         } 
  31.  
  32.         zone “0.0.127.in-addr.arpa” IN {  
  33.                 type master;  
  34.                 file “named.local”;  
  35.         } 
  36.  
  37.   
  38.  
  39. #定义内部网络用户解析 
  40.  
  41.         zone “lustlost.com” IN {  
  42.                 type master;  
  43.                 file “lustlost.com.in”;  
  44.                 allow-transfer { none; }; #不允许区域传送  
  45.                 allow-update { none; }; #不允许更新  
  46.         }  
  47. }; 
  48.  
  49.   
  50.  
  51. #定义外部网络用户解析 
  52.  
  53. view out {  
  54.         match-clients      { any; }; #允许所有用户(这里之所以允许所有用户,
  55.                                      
    是因为bind对配置文件是从上往下读取解析的,
  56.                                       匹配不到上面view所定义的acl,
  57.                                       才会到这个view中来)  
  58.         recursion no;  #不允许外部网络用户进行递归查询(我们不是免费的公共dns) 
  59.  
  60.         zone “lustlost.com” IN {  
  61.                 type master;  
  62.                 file “lustlost.com.out”;  
  63.                 allow-transfer { none; };  
  64.                 allow-update { none; };  
  65.         } 
  66.  
  67. }; 

进入mysql目录,里边有一个INSTALL-BINARY文件,这是个安装帮助文档,可以看到如下步骤介绍:

Key key = GetEffectiveKeyForRequest(info, source_net_log);

威尼斯人彩票 4

威尼斯人彩票 5

这里的key值时根据info得出的一组可以唯一标志dns中一种主机解析job,关于job的概念等会就会提到。

[root@localhost ~]# groupadd mysqlsts

int rv = ResolveHelper(key, info, addresses, source_net_log);

[root@localhost ~]# useradd -r -g mysql mysql

可以看到在这里又新引入了一个ResolveHelper函数,这个函数的作用时根据计算得到的key值以及info值,依次判断是否为ip,能否从cache中得到,能否从host中得到,这个函数可以理解为一个辅助的解析函数。

创建一个mysql组并添加一个账号mysql

JobMap::iterator jobit = jobs_.find(key);

[root@localhost mysql]# chown -R mysql .

Job* job;

[root@localhost mysql]# chgrp -R mysql .

加入辅助解析函数并未找到需要的ip地址,并且之前未启动相同的job(这里通过find函数来查找指定key值的job是否存在),则需要启动一个job来进行相应的dns解析,关于dns解析,这里有两种方式:

改变所有文件的所有者和所有组都改为mysql

一种是要提到一个函数getaddrinfo(),
这个函数可以根据域名得到相应的ip地址,并且既可以用在ipv4上,也可以用在ipv6上,但由于其是一个系统级别的调用,因此是一个阻塞调用,chrome将这种方式称之为ProcTask方式:

[root@localhost mysql]# scripts/mysql_install_db –user=mysql

而另外一种调用方式则是chromium按照dns协议规范,通过异步非阻塞的调用方式,实现了getaddrinfo()函数,这种方式被称之为DnsTask。

以sql的身份来初始化数据库

那究竟如何选择使用哪种方式来进行dns解析呢?还是要看代码,下面这些代码时job类中start()方法的实现:

[root@localhost mysql]# chown -R root .

void Start() override {

[root@localhost mysql]# chown -R mysql data

DCHECK_LE(num_occupied_job_slots_, 1u);

再把所有者和所有组改回来

[root@localhost mysql]# cp support-files/my-medium.cnf /etc/my.cnf

// Caution: Job::Start must not complete synchronously.

将support-files/my-medium.cnf拷贝到 /etc/my.cnf,是否覆盖选择y。

if (!system_only && had_dns_config_ &&

[root@localhost mysql]# cp support-files/mysql.server
/etc/init.d/mysqld

!ResemblesMulticastDNSName(key_.hostname)) {

[root@localhost mysql]# chmod a+x /etc/init.d/mysqld

StartDnsTask(); //满足上述条件后才使用DnsTask

给mysqld执行权限

} else {

[root@localhost mysql]# service mysqld start

StartProcTask(); //其余情况均使用ProcTask

启动服务mysqld。

}

发现出现错误:

}

威尼斯人彩票 6

当满足系统未指定解析方式、dns已经配置完成主机名满足一定条件才可以使用DnsTask,其余情况均使用ProcTask。

如果出现此错误的话,就把刚才做的命令重新执行一遍:

先来说一下ProcTask,这种方式较为简单,其最终回调用到函数SystemHostResolverCall()
中去, 而这个函数只是对 getaddrinfo()
做了一层封装而已,逻辑相对简单一些,感兴趣的同学可以去看一下源码,位置是在host_resolver.cc这个文件里。

[root@localhost mysql]# chown -R mysql .

DnsTask相对来说就复杂一些,简单点说就是通过调用StartA(),紧接着再调用

[root@localhost mysql]# chgrp -R mysql .

dns_query.cc、dns_transaction.cc,同时调用udp协议获取fd,然后将这个fd注册到网络库的io线程事件循环中,从而使得dns解析流程统一写到了异步回调的编程框架中。

[root@localhost mysql]# scripts/mysql_install_db –user=mysql

好了,关于chromium中dns的解析暂时先说到这里,后续如果有更进一步的解析,我会及时更新并分享出来的。

[root@localhost mysql]# chown -R root .

[root@localhost mysql]# chown -R mysql data

后边拷贝的那两步就不用重做了,然后再次开始mysqld服务,运行成功!

[root@localhost mysql]# netstat -tupln |grep 3306

查看mysqld端口是否打开

威尼斯人彩票 7

 

端口已经打开。

[root@localhost mysql]# chkconfig –add mysqld

[root@localhost mysql]# chkconfig mysqld on

将mysqld设为开机自动启动。

[root@localhost mysql]# vim /etc/profile

PATH=$PATH:/usr/local/mysql/bin

为了方便使用目录下的bin文件,将它加入到系统文件中:

[root@localhost mysql]# . /etc/profile

重新读取profile文件:(重新登录也可以)

[root@localhost mysql]# mysqladmin -u root -p password
‘123’然后直接回车

给mysql创建一个管理员用户,密码为123

到这里,mysql已经安装完毕。

相关阅读

RHEL6服务器搭建DNS服务器
http://www.linuxidc.com/Linux/2013-10/91256.htm

精解Linux RHEL 6.x DNS 服务器
http://www.linuxidc.com/Linux/2013-08/88986.htm

Ubuntu DNS服务器配置
http://www.linuxidc.com/Linux/2013-07/87181.htm

Solaris中配置DNS服务器
http://www.linuxidc.com/Linux/2013-06/86724.htm

CentOS 6.3 x64下借助MySQL和DNS view实现智能DNS
http://www.linuxidc.com/Linux/2013-06/86430.htm

威尼斯人彩票 8

相关文章