您的位置:首页 > 理论基础 > 数据结构算法

7.1.2 C# 中的函数式数据结构

2011-05-28 15:33 357 查看
域名服务(DNS )是一种组织成域层次结构的计算机和网络命名系统。通过DNS服务可以将域名解析为IP地址,从而使得人们能通过简单好记的域名来代替IP地址访问网络。
通过建立DNS数据库,记录主机名称与IP地址的对应关系,驻留在服务器端,为客户端的主机提供IP地址解析服务。当某台主机要与其他主机通信时,就可以利用主机名称向DNS服务器查询该主机的IP地址。
整个DNS域名系统包括以下部分
1 DNS域名空间;
顶级域名(Top Level Domain):国家顶级域名、通用顶级域名、基础结构域名(反向域名)。



2 资源记录;将DNS域名映射到特定类型的资源信息,以便在名称注册和解析时使用。
3 DNS服务器;提供存储和应答资源记录的名称查询服务。
4 DNS客户端;用来查询DNS服务,将域名解析为查询中指定的资源记录。
一个服务器所负责管辖的(或有权限的)范围叫做区(zone)。每个区设置相应的权限域名服务器(authentication name server),用来保存该区中的所有主机的域名到IP地址的映射。
DNS服务器管辖是以“区”为单位。区是DNS服务器实际管辖的范围。区可能小于等于域,但不可能大于域。



树状结构的DNS域名服务器
域名解析过程:
递归查询:即一级一级地找。主机向本地域名服务器的查询一般都采用递归查询。
如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机进行下一步查询。递归查询返回的结果或者是所要查询的IP地址,或者是报错。
迭代查询:一个一个地找。本地域名服务器向根域名服务器的查询通常采用迭代查询。
当根域名服务器收到本地域名服务器发出的迭代查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步该向哪个域名服务器进行后续的查询,然后让本地域名服务器进行后续的查询(而不是替本地域名服务器进行后续查询)。即告诉你怎么查,而不是替你去查。
为提高DNS查询效率,减轻根域名服务器的负荷和减少因特网上DNS查询报文数量,在域名服务器中广泛使用了高速缓存(或高速缓存服务器),用来存放最近查询过的域名以及从何处获得域名映射信息的记录。



本地域名服务器采用迭代查询



本地域名服务器采用递归查询
DNS资源记录类型: ——摘自《鸟哥的linux私房菜》
$TTL :当有外部 DNS 服务器对你的 DNS 的这个领域进行查询时,这一笔记录会放置在对方 DNS 服务器内几秒钟的意思。
$ORIGIN:这个设定值可以重新指定 zone 的定义。在预设的情况下, 这个正反解数据库档案中的 zone 是由 /etc/named.conf 所指定的,就是 zone 那个参数的功能。 不过,这个 zone 是可以改的,就是用 $ORIGIN 来修订就是了。通常这个设定值不会用到的。
@:这个符号代表 zone 的意思! 以上面的 named.local 来说, 这个档案由 /etc/named.conf 定义出 zone 为 localhost. ,因此在本档案的 @ 就代表 localhost. !
. :这个点 (.) 很重要!因为他代表一个完整主机名称 (FQDN) 而不是仅有 hostname 而已。举例来说,如果你在本设定档上面规范一个主机名称为 www 时,那部主机的 FQDN 为 www.localhost. 如果你写出 www.localhost 时,由于末了没有那个小数点,则 zone 会主动加入该主机名称, 所以最终的 FQDN 会变成 www.localhost.localhost. !
SOA:Start of Authority 的意思。 这个标志代表着 master/slave 相关的认证、授权资料。 不论你的 DNS 系统有没有设定 master/slave 的架构,都需要含有这个设定才好。 SOA 后面共带有三个参数,所以该行为:
[zone] IN SOA [主机名] [管理员 email] ([五组更新时间参数])
每个设定项目你可以这样看:
主机名:就是 master DNS 的主机名称,通常填写本身主机名即可。还是要注意那个小数点的存在与否!非常重要!
管理员 email:本来应该是 "root@localhost." 的,不过因为 @ 已经被作为特殊代号 (zone), 所以就用小数点来取代,因此 email 就成为 "root.localhost." 。
(五组数字):这五个数字分别代表 serial, refresh, retry, expire, ttl。
至于那五个数字的意义是这样的:
1 Serial:只是一个序号,但这个序号可被用来作为 slave 与 master 更新的依据。 举例来说, master 序号为 100 但 slave 序号为 90 时,那么这个 zone file 的资料就会被传送到 slave 来更新了。 由于这个序号代表新旧资料,通常我们建议你可以利用日期来设定!举例来说,上面的资料是在 2006/10/20 所写的第一次,所以用 2006102001 作为序号代表!
2 Refresh:除了根据 Serial 来判断新旧之外,我们可以利用这个 refresh(更新) 命令 slave 多久进行一次主动更新;
3 Retry:如果到了 Refresh 的时间,但是 slave 却无法连接到 master 时, 那么在多久之后,slave 会再次的主动尝试与主机连线;
4 Expire:如果 slave 一直无法与 master 连接上,那么经过多久的时间之后, 则命令 slave 不要再连接 master 了! 也就是说,此时我们假设 master DNS 可能遇到重大问题而无法上线,则等待系统管理员处理完毕后, 再重新来到 slave DNS 重新启动 bind 吧!
5 Minimun:这个就有点象是 TTL !
NS:就是 name server 的缩写,这个标志的参数是:[zone] IN NS [主机名称]
注意, NS 后面接的一定是主机名称!代表的意思是说:“这个 zone 的查询请向后面这部主机要求”的意思。 所以,如果你这个 zone 有两部以上的 DNS 服务器负责时,那就必需要写两个 NS 了!而 NS 后面接的主机名称必需要有 IP 的对应啊!因此就需要 A 这个标志了!
A:是正解的符号,参数是:[hostname] IN A [IP]
意思是说该部主机的 IP 对应之意!也是最常用的一个标志了!
MX:就是 Mail eXchanger(MX) 的简写,他的参数是这样写的:

[hostname] IN MX [顺序] [主机名称]
注意,这个 MX 与 mail server 有关,没有 mail server 的朋友可以省略这个标志,但是如果你的领域内有 mail server 时,就必需要设定这个 MX 才好。MX 的用途是在于『邮件转递』或者是经由上层邮件主机备份的一个机制, 后面设定的那个主机名称通常是你的上游邮件主机,相关的意义我们会在 mail server 章节再跟大家详谈。 另外, MX 后面接的数值是越小越优先,而接的主机名称必需要具有 A 的标志才可以!

如果你不知道如何设定,通常建议你直接设定成你的 mail server 主机名称即可
CNAME:顾名思义,这个标志在建立“主机别名”的啦!参数为:[hostname] IN CNAME [主机名称]。注意一下, CNAME 后面接的是主机名称。因为有好几部主机名称都对应到同一个 IP 上头, 你当然可以针对每个主机名称给予一个 A ,不过如果未来要改 IP 时,你就得改好几个啦! 此时改为 CNAME 来处理就很简单。如上表所示,如果我想要知道 ftp.vbird.tsai 的 IP 时, DNS 会先告知 ftp.vbird.tsai 属于 linux.vbird.tsai 的 CNAME ,然后再透过 linux.vbird.tsai 来得到正确的 IP。
TXT:这个东西在进行“说明”而已!亦即是前面那部主机的一些信息。 特别注意的是,没事的话,“信息不要写得太详细,有的时候甚至应该要写些错误的讯息!” 为什么呢?如果写得太详细的话,那么那些个 cracker 不就很简单的就可以将您的网站信息取得, 并进而入侵了吗?
DNS服务器类型:主域名服务器
辅助域名服务器:1)容错能力
2)减少广域链路的通信量
3)减轻主服务器的负载
缓存域名服务器:仅仅负责提供缓存解析的结果。
正向解析:从域名到IP地址解析的过程。
反向解析:从IP地址到域名的解析过程。反向解析的作用为服务器进行身份验证。
BIND:Berkeley Internet Name Domain
PowerDNS MyDNS
bind:进程名称:named
安装包:bind bind-libs bind-utils(提供测试工具) bind-chroot caching-nameserver
[root@station39 ~]# yum install bind
主配置文件/etc/named.conf 需要手动建立
options {
directory "/var/named"; //**数据文件存放位置
};
zone "." IN {
type hint ;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
数据库文件存放位置:/var/named
named.ca 根名称服务器的地址
[root@station39 named]# dig -t NS . @a.root-servers.net > /var/named/named.ca //**查找全球
根域名服务器的地址并重定向到named.ca
区域文件:
localhost.zone 把localhost解析成127.0.0.1
[root@station39 named]# cat localhost.zone
$TTL 86400
@ //*指代当前域 IN SOA @ //* 负责该区域名称解析的授权主机名 root// 管理员 (
//* 序列号 42 ; serial (d. adams)
//* 设置更新时间间隔 3H ; refresh
//* 重试时间间隔 15M ; retry
//* 设置过期时间 1W ; expiry
//* 设置最小默认TTL缓存时间 1D ) ; minimum
IN NS @
IN A 127.0.0.1
IN AAAA ::1
序列号:用于标识该区域的数据是否有更新,一般情况下,主服务器会在数据更新之后将序列号加1,当辅助域名服务器需要与主服务器进行区域复制的时候,就会比较这个数值。
更新时间间隔:定义辅助域名服务器隔多久时间与主域名服务器进行一次区域复制操作。
重试时间间隔:当辅助域名服务器在该时间内一直不能与主要名称服务器取得联系时,重试区域复制的时间间隔。
最小默认TTL:区域的默认生存时间(TTL)和缓存时间否定应答的缓存时间
named.local 把127.0.0.1解析成localhost
[root@station39 named]# cat named.local
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
启动脚本/etc/init.d/named
辅助控制工具:rndc 远程名称进程控制器:可以远程控制DNS服务器 重新加载读取配置文件,停止或者重启DNS服务器。默认监听端口:953.。
主配置文件:/etc/rndc.conf
需要手动生成: rndc-confgen > /etc/rndc.conf
[root@station39 named]# cat /etc/rndc.conf
# Start of rndc.conf
key "rndckey" {
algorithm hmac-md5;
secret "8CIXalFy/sjPl1U79wWj6A==";
};
options {
default-key "rndckey";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndckey" {
# algorithm hmac-md5;
# secret "8CIXalFy/sjPl1U79wWj6A==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndckey"; };
# };
# End of named.conf
[root@station39 named]# tail /etc/rndc.conf | head -9 | sed 's/^# //g'
key "rndckey" {
algorithm hmac-md5;
secret "8CIXalFy/sjPl1U79wWj6A==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndckey"; };
}; //** 将此文件追加到named.conf 就可以使用rndc来控制DNS服务器了。
chown :named /etc/named.conf
chown :named /var/nmed/* -R
service named configtest
rndc flush //**清空缓存
[root@station39 named]# vim a.com.zone
$TTL 86400
$ORIGIN a.com.
@ IN SOA a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns
IN MX 5 mail
ns IN A 192.168.0.39
mail IN A 192.168.0.39
www IN A 192.168.0.1
www IN A 192.168.0.254
bbs IN CNAME www
ftp IN A 192.168.0.254
fw IN A 192.168.0.254
[root@station39 named]# chown :named a.com.zone
下面通过配置一个主域名服务器来说明DNS配置过程:
主配置文件:
options {
directory "/var/named"; //**数据文件存放位置
allow-notify { 192.168.0.127; } ;
querylog 1 ; //** 启用日志功能 1 开启 0 关闭
version "None of your business !" //** 禁止查询版本号
listen-on { 192.168.0.39 ; }; //**指定监听的地址
allow-recursion { 192.168.0.0/24; }; //**只给某个网段递归查询,也可以使用ACL
allow-query { 192.168.0.0/24; }; //**只允许谁来查询
};
zone "." IN {
type hint ;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "a.com" IN {
type master;
file "a.com.zone";
allow-transfer { 192.168.0.127; }; //** 允许区域传送
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "0.168.192.zone" ;
allow-transfer { 192.168.0.127;};
};
正向区域解析文件
[root@station39 named]# vim a.com.zone
$TTL 86400
$ORIGIN a.com.
@ IN SOA a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns
IN NS ns2
IN MX 5 mail
ns IN A 192.168.0.39
ns2 IN A 192.168.0.127
mail IN A 192.168.0.39
www IN A 192.168.0.1
www IN A 192.168.0.254
bbs IN CNAME www
ftp IN A 192.168.0.254
fw IN A 192.168.0.254
[root@station39 named]# chown :named a.com.zone
反向区域解析文件:
$TTL 86400
@ IN SOA a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns.a.com.
39 IN PTR ns.a.com.
39 IN PTR mail.a.com.
1 IN PTR www.a.com.
254 IN PTR www.a.com.
254 IN PTR ftp.a.com.
254 IN PTR fw.a.com.
从域名服务器:192.168.0.127
主配置文件:
options {
directory "/var/named"; //**数据文件存放位置
};
zone "." IN {
type hint ;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "a.com" IN {
type slave;
file "slaves/a.com.zone";
masters { 192.168.0.39 ; };
};
zone "0.168.192.in-addr.arpa" IN {
type slave ;
file "0.168.192.zone" ;
masters { 192.168.0.39; };
};
子域授权
在主域名服务器正向区域文件中添加一条记录
cs.a.com. IN NS ns.cs.a.com.
ns.cs.a.com. IN A 192.168.0.161
在子域名服务器中设置主配置文件:
options {
directory "/var/named"; //**数据文件存放位置
};
zone "." IN {
type hint ;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "cs.a.com" IN {
type master;
file "cs.a.com.zone";
};
/var/named添加正向区域文件cs.a.com.zone
$TTL 86400
$ORIGIN cs.a.com.
@ IN SOA cs.a.com. root (
100 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns
IN NS ns2
IN MX 5 mail
ns IN A 192.168.0.3
ns2 IN A 192.168.0.15
mail IN A 192.168.0.37
www IN A 192.168.0.74
www IN A 192.168.0.25
bbs IN CNAME www
ftp IN A 192.168.0.25
fw IN A 192.168.0.25
PS :父域可以解析子域,子域要想解析父域就要转发。
修改子域主配置文件,添加:
zone "a.com" IN {
type forward
forwarders { 192.168.0. 39 ; };
};
查询服务器版本号:
[root@station39 ~]# dig txt chaos version.bin @127.0.0.1
View:视图,将用户来源分成不同的类别,当属于某一类用户的时候解析成A结果,当属于另一类用户的时候解析成B结果。
PS:只要声明一个view,那么所有的zone都必须在view中建立。
在主配置文件中添加:
view "localhost" {
matche-clients { 127.0.0.0/8 ; };
zone "." IN {
type hint ;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
};
view "internal" {
match-clients { 192.168.0.0/24; };
zone "a.com" IN {
type msater;
file "a.com.int.zone";
};
zone "0.168.192.in-addr.arpa" IN {
type master ;
file "0.168.192.zone" ;
};
};
view "external" {
match-clients { 192.168.10.0/24; };
zone "a.com" IN {
type master;
file "a.com.ext.zone";
};
zone "10.168.192.in-addr.arpa" IN {
type master ;
file "10.168.192.zone" ;
};
};
再编辑对应的区域文件即可!
本文出自 “諸葛草廬” 博客,请务必保留此出处/article/4229643.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: