linux下dns的安装配置总结
--------------------------
1.基本的安装
2.建立一个简单的dns server
3.分离式dns和view语句
4.辅助域名服务器
5.单纯的cache-only域名服务器
6.域名服务器的日志配置
7.域名服务器的安全相关
7.1 acl控制语句
7.2 普通用户身份运行named
7.3 chroot环境
7.4 TSIG技术
7.5 DNSSEC技术
8.动态更新DNS
--------------------------
互联网的2个关键组成:route和dns,前者解决了主机的连接,后者解释了主机是谁,方便了人们的记忆。
dns建立了主机名和IP地址之间的映射关系。
dns是一个分布式数据库。
bind是使用最广泛的一种DNS实现。
dns工作原理:(以 www.example.com举例说明)
所有的域名服务器都知道根服务器(.),根服务器知道com、net、org、cn等顶级域,
而顶级域com又知道example.com子域,子域example.com知道主机 www.example.com的IP。
dns采取层层授权的形式建立起一种分布式的域名管理机制,授权是单向的,只能从父域到子域,
每个子域都必须向父域注册。
用户查询主机过程:
文件/etc/nsswitch.conf(hosts: files dns)说明查询主机信息顺序先从/etc/hosts开始,
先查看本地/etc/hosts文件,找不到主机名对应的IP,再进行dns查询,
到/etc/resolv.conf文件指定的本地域名服务器查询,如果有对应域example.com,则直接返回 www.example.com主机的IP(或没有对应主机的消息)
如果本地域名服务器不知道example.com这个域,也不知道com域的信息,不过它知道根域的信息(在named.ca中),
如果允许递归查询的话(recursion yes),它就发送一个查询到根域,根域返回一个com域服务器的IP,
然后再到com域查询example.com子域的信息,返回一个example.com域服务器的IP,
最后在example.com域的域名服务器上得到主机 www.example.com的IP,
本地域名服务器把查询结果返回给用户,并缓存查询结果。
1.基本的安装
tar -zxvf bind-9.7.0-p1.tar.gz
cd bind-9.7.0-p1
./configure --prefix=/usr/local/named \
--enable-threads \
--enable-largefile \
--disable-openssl-version-check
make && make install
环境设置;
可执行文件路径:
echo "export PATH=$PATH:/usr/local/named/bin:/usr/local/named/sbin" >>~/.bash-profile
. ~/.bash_profile
帮助文档:
echo "MANPATH /usr/local/named/share/man" >>/etc/man.config
2.建立一个简单的dns server
2.1 创建named.conf配置文件
cd /usr/local/named
vi etc/named.conf
options {
directory "/var/named";
pid-file "/var/named/named.pid';
dump-file "/var/named/named_dump.db";
statistics-file "/var/named/named.stats';
};
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" {
type master;
file 127.0.0.rev";
};
zone "example.com" {
type master;
file "example.com.zone";
};
zone "10.10.in-addr.arpa" {
type master;
file "10.10.rev";
};
说明:
named.conf文件中的单行注释//或#,多行注释 /* */
options语句用于设置服务器全局参数
directory 指定程序运行基准文件存放目录
pid-file 指定named服务运行时pid存放文件
dump-file 指定缓存文件
statistics-file 指定服务器运行状态统计文件
2.2 创建数据存放目录:
mkdir /var/named
2.3 创建named.ca根线索文件
dig @61.139.2.69 -t NS .
dig @198.41.0.4 -t NS . >/var/named/named.ca
2.4 创建正向区文件localhost.zone和example.com.zone
;localhost
$TTL 1d
@ IN SOA localhost. root (
2010050101 ;serials
1h ;refresh
15m ;retry
1w ;expire
1d ) ;ttl
IN NS localhost.
IN A 127.0.0.1
;example.com
$TTL 1d
@ IN SOA log.example.com. root.log (
2010050101 1h 15m 1w 1d )
IN ns1.example.com.
IN ns2
IN MX 10 mail
IN A 10.10.0.10
ns1 IN A 10.10.0.2
ns2 IN A 10.10.0.3
mail IN A 10.10.0.11
log IN A 10.10.0.10
www IN A 10.10.1.1
ftp IN A 10.10.1.10
web IN CNAME www
2.5 创建反向区文件127.0.0.rev和10.10.rev
;127.0.0.rev
$TTL 1d
@ IN SOA localhost. root.localhost. (
2010050101 1h 15m 1w 1d )
IN NS localhost.
1 IN PTR localhost.
;10.10.rev
$TTL 1d
@ IN SOA log.example.com. root.log.example.com. (
2010050101 1h 15m 1w 1d )
IN NS ns1.example.com.
IN NS ns2.example.com.
10.0 IN PTR log.example.com.
11.0 IN PTR mail.example.com.
1.1 IN PTR www.example.com.
10.1 IN PTR ftp.example.com.
2.6 使用rndc来控制dns服务器
a)产生rndc控制文件
rndc-confgen -a
修改named.conf配置文件,添加以下内容:
include "/usr/local/named/etc/rndc.key";
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
b)测试rndc和域名解析效果
启动前检查配置文件和区文件的语法:
named-chechkconf etc/named.conf
named-checkzone "example.com" /var/named/example.com.zone
启动域名服务:/usr/local/named/sbin/named
用rndc查看域名服务器状态:rndc status
测试域名解析:
echo "nameserver 127.0.0.1" >/etc/resolv.conf
host www.example.com
echo "search example.com" >> /etc/resolv.conf
host www
2.7 有关区文件的一些说明
区文件(zone file)包含2个部分:分析器命令和资源记录(Resource Records)
分析器命令有:
$TTL 存活时间(time to live)
$ORIGIN 默认域,区文件中不完整(不以.结尾)的任何域名自动在其后添加默认域,
没有设置此命令时,以named.conf文件中zone语句多指定的域名作为初始域。
$INCLUDE 引入外部文件,注意引入文件的格式要匹配
$GENERATER 创建一系列不同的资源记录
例如:
$ORIGIN 0.10.10.in-addr.arpa.
$GENERATOR 1-3 IN PTR www.example.org.
等同于:
$ORIGIN 0.10.10.in-addr.arpa.
1 IN PTR www.example.org.
2 IN PTR www.example.org.
3 IN PTR www.example.org.
区文件格式:
[name] [ttl] [class] type data
RR中的特殊符号:
; 注释(半角分号)
@ 代表当前域名,named.conf文件中zone语句指定的初始域,或$ORIGIN 指定的默认域
() 括号允许跨行
* 通配符(仅由name字段使用)
[name] 字段表示记录的实体(通常是一个主机或域),连续相同的[name],可以省略除第一个外的[name]字段,例如:
www IN 10.10.0.1
IN 10.10.0.10
IN 10.10.0.11
[ttl] (time to live存活时间)字段指定数据可以被缓存的时间,单位秒,也可以用w,d,h,m等后缀来表示周,天,小时,分钟。
后面记录的时间跟前面一条记录相同时,或区文件开头使用了$TTL命令设置了默认的值,可以省略[ttl]字段。例:
www 3600 IN 10.10.0.1
ftp IN 10.10.0.10
mail 1d IN 10.10.0.11
[class] 字段指定网络类型,可识别的值有3个:IN(Internet)、HS(Hesiod)、CH(Chosnet)。默认值IN,其他的基本不用。
type字段指定了记录的类型。常用的有:
SOA 定义一个DNS区
NS 标识区的服务器,授权子域
MX 控制邮件的投递
A 名字到地址的转换
PTR 地址到名字的转换
CNAME 主机的别名
AAAA 名字到IPv6地址的转换
data字段的类容取决于记录类型(type)。例如:类型为A,data字段就是IP地址;SOA记录,data字段就包括区主名字服务器,联系人邮箱等;而MX记录,则包括优先级和邮件主机
举例:
chinaunix.net. 86400 IN SOA ns1.chinaunix.net. postmaster.chinaunix.net. (2010050101 1h 15m 1w 1d)
;上面第一个chinaunix.net.可用@替代,后面的联系人邮件地址postmaster.chinaunix.net.也可缩写为postmaster
IN NS ns1.chinaunix.net.
IN MX 10 mail
IN A 10.10.0.10
ns1 IN A 10.10.0.1
mail IN A 10.10.0.10
区文件SOA记录中的序列号不必连续,但必须单调递增。
3.分离式DNS和view语句
分离式DNS(split dns)实现了不同用户查询域名,返回不同的查询结果,
view语句控制哪些用户能看到哪个view的访问列表、用于view中所有区的一些选项和区本身。
如果启用了view,那么named.conf文件中所有的zone语句都必须在view中出现。
view "internal" {
match-clients { 10.10.0.0/16;};
recursion yes;
zone "example.com" {
type master;
file "internal/example.com.in.zone";
};
};
view "external" {
match-clients { any; };
recursion no;
zone "example.com" {
type master;
file "external/example.com.ex.zone";
};
};
注意:view是按顺序来处理的,所以要先加上限制最严格的view,
如果view次序反了,所有查询都首先匹配any,而不会匹配到10.10.0.0/16,从而造成谁都无法看到内部view了。
4.辅助域名服务器
主配置文件:/etc/named.conf
zone "chinaunix.net" {
type slave;
file "chinaunix.net.zone";
};
为了让辅助域名服务器自动根据主域名服务器自动建立区文件,
需要让运行named服务的用户在相应目录具有写权限
chgrp -R named /var/named
chmod g+w /var/named
主、辅域名服务器同步前需要同步时间:
ntpdate 0.cn.pool.ntp.org && hwclock -w
然后重新启动服务:
killall named && named
5. 单纯的Cacha-Only 域名服务器
仅用于帮助client端向外部dns主机请求查询,没有自己的域名解析数据库。
vi etc/named.conf
options {
directory "/var/named";
pid-file "/var/named/named.pid";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/named_stats.txt";
forward only;
forwar
ders {
61.139.2.69;
};
};
include "/etc/rndc.key";
6.域名服务器的日志配置
logging {
channel <string>; {
file <logfile>;;
syslog <optional_facility>;;
null;
stderr;
severity <logseverity>;
print-time <boolean>;
print-severity <boolean>;
print-category <boolean>;
};
category <string>; { <string>;; ... };
};
日志中主要有2个概念:channel(通道)和category(类别)。
channel规定了日志应该发往哪里(file、syslog、null、stderr)
category指定了特定类别的日志通个哪个channel来发送。
syslog指定的facility(设备)主要有:kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local0 - local7
severity(严重性):定义消息的等级,critical |error|warning|notice|info|debug[level]|dynamic
print-category yes|no 定义是否输出消息类别
print-severity yes|no 定义是否输出严重级别
print-time yes|no 定义是否输出消息的时间
bind中预定义的日志通道:
default_syslog 发送到syslog、设备为daemon,严重性为info
default_debug 日志记录到文件named.run中,严重性为dynamic
default_stderr 发送到named进程的标准出错设备(stderr),严重性为info
null 丢弃所有消息
category(日志类别)主要有:
client 客户机请求
config 配置文件分析和处理
database 有关数据库操作的信息
default 没有明确分配通道的类别
delegation-only 按delegation-only区对NXDOMAIN的查询
dispatch 把传入的包分发给多个服务器模块
dnssec DNSSEC消息
general 未分类的消息
lame-servers 残缺服务器的错误消息
network 网络操作
notify 有关“区已更改”通知协议的消息
queries 服务器接受到的每个查询的简短日志消息
resolver DNS解析,如客户机的递归查询
security 批准/未批准的请求
unmatched named不能对查询进行分类(错误的类,没有view)
update 有关动态更新的消息
xfer-in 服务器正在接受的区传送
xfer-out 服务器正在发送的区传送
举例:把所有的dns查询日志单独写入一个文件,把lame-servers消息丢掉
logging {
channel queries_log {
file "/var/named/log/queries.log" version 3 size 50m;
severity info;
print-severity yes;
print-category yes;
print-time yes;
};
category queries {
queries_log;
};
category lame-servers {
null;
};
7.域名服务器的安全相关
7.1 acl控制语句
acl "inside" {
10.10.0.0/16;
};
zone "example.org" {
type master;
file "example.org.zone";
allow-query { inside; };
};
acl定义的地址匹配列表可以出现在allow-query、allow-transfer、allow-update、allow-recursion、backhole、match-clients等语句中
acl有4个预定义的地址匹配:
any 匹配所有
none 所有都不匹配
localhost 匹配系统上所有本地网络接口地址(环回地址和接口地址)
localnets 匹配所有与本地网络接口地址在同一段的地址块
7.2 以普通用户身份运行named程序
创建用户和组
groupadd named
useradd -g named -s /sbin/nologin -d /var/named -M named
修改目录权限:
chown -R named.named /var/named
chmod -R 700 /var/named
修改named.conf文件:
options {
directory "/var/named";
pid-file "/var/named.named.pid";
statistics-file "/var/named/named.stats";
};
以普通用户权限运行服务:
/usr/local/named/sbin/
named -u named
7.3 chroot环境限制named
创建必要的目录:
mkdir -p /var/named/{etc,dev,var/{run,named}}
创建必要的设备文件:
cd /var/named
file /dev/{null,zero,random}
mknod dev/null c 1 3
mknod dev/zero c 1 5
mknod dev/random c 1 8
复制本地时区文件:
cp /etc/localtime etc/
创建bind的配置文件named.conf和zone区文件,并放入相应etc、var/named目录
文件和目录权限修改:
chown -R root.named /var/named
find /var/named -type f -print | xargs chmod u=rw,og=r
find /var/named -type d -print | xargs chmod u=rwx,og=rx
chmod -R ug=rwx,o=rx /var/named/var
启动服务:
/usr/local/named/sbin/
named -u named -t /var/named
7.4 TSIG技术
通过使用“事务签名(transaction signature)”来保障服务器之间的通信安全。TSIG能保护主、从服务器之间区传送的安全,并能实现安全的动态更新。
7.4.1使用dnssec-keygen产生加密密钥:
dnssec-keygen -a hmac-md5 -b 512 -n HOST chinaunix
产生公钥:Kchinaunix.+157+56132.key
私钥:Kchinaunix.+157+56132.private
文件内容一般包括以下内容:
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: hSPUdopy1pDYfu1ZEfTg3GhCWrR4uDB8R9RoQiQ+9x7JNdA97DfWjqe6je8nBe3i855hax3JlVS3yWAvTi4VpQ==
用scp复制密钥到主、从服务器: scp Kchinaunix.+157+56132.key
[email protected]:/root
7.4.2 使用TSIG密钥分别对主、从服务器的named.conf设定:
key "chinaunix" {
Algorithm HMAC_MD5;
secret "hSPUdopy1pDYfu1ZEfTg3GhCWrR4uDB8R9RoQiQ+9x7JNdA97DfWjqe6je8nBe3i855hax3JlVS3yWAvTi4VpQ==";
};
7.4.3 在主服务器named.conf添加:
server 10.10.0.253 { #发往从服务器10.10.0.253的消息用key加密
keys ( chinaunix; };
};
zone "chinaunix.net" {
type master;
file "chinaunix.net.zone";
allow-transfer { key chinaunix; }; //本区传送只允许key
};
7.4.4 在辅助域名服务器named.conf添加:
server 10.10.0.254 { #发往主服务器10.10.0.254的消息用key加密
keys { chinaunix; };
};
7.4.5 验证TSIG技术是否生效:
删除辅助域名服务器的区文件chinaunix.net.zone
同步一下主、从域名服务器的时间
重新启动辅助域名服务器
检查辅助域名服务器的区文件是否自动建立。
7.5 DNSSEC技术
DNSSEC是一套对DNS的扩展,它使用公钥加密,对区数据的来源进行身份验证,并验证其完整性。
私钥用来加密,公钥用来解密。下面以chinaunix.net域来建立DNSSEC配置:
7.5.1 创建密钥对:
ZSK密钥对:dnssec-keygen -a DSA -b 768 -n ZONE chinaunix.net
产生公钥 Kchinaunix.net.+003+49219.key
私钥 Kchinaunix.net.+003+49219.private
密钥文件名包括:key name(chinaunix.net.)、algorithm(001表示RSAMD5,003表示DSA,005表示RSASHA1等)、key tag(此处是49219)
KSK密钥对: dnssec-keygen -a DSA -b 768
-f KSK -n ZONE chinaunix.net
产生的密钥文件为:Kchinaunix.net.+003+03483.key 和 Kchinaunix.net.+003+03483.private
7.5.2 对区文件签名
先在原区文件(chinaunix.net.zone)中引入密钥文件:
$TTL 1d
;chinaunix.net.
@ IN SOA localhost. root.localhost. (
2010050101 1h 15m 1w 1d )
IN NS ns1.chinaunix.net.
IN NS ns2
IN MX 10 mail
IN A 10.10.0.10
ns1 IN A 10.10.0.1
ns2 IN A 10.10.0.2
mail IN A 10.10.0.10
www IN A 10.10.0.11
web IN CNAME www
$INCLUDE Kchinaunix.net.+003+49219.key ;ZSK
$INCLUDE Kchinaunix.net.+003+03483.key ;KSK
然后对区文件签名:
dnssec-signzone -o chinaunix.net chinaunix.net.zone Kchinaunix.net.+003+49219.key Kchinaunix.net.+003+03483.key
生成区文件的签名后版本:chinaunix.net.zone.signed
同时生成了密钥集文件: dsset-chinaunix.net.
dsset-chinaunix.net.文件内容:
chinaunix.net. IN DS 3483 3 1 5D46B000BC003AF35A9541B57F79923C71036185
chinaunix.net. IN DS 3483 3 2 36EC5EAD7E5C00917E294089EDB01FC64106F1D6C17E8BA749A02C00 E2AF4D61
此密钥集文件用于对密钥做签名
7.5.3 修改named.conf配置文件:
options {
directory "/var/named";
dnssec-enable yes;
dnssec-validation yes;
};
zone "chinaunix.net" {
type master;
file "
chinaunix.net.zone.signed";
};
7.5.4 在DNSSEC中,什么是KSK和ZSK ?
KSK 表示密钥签名密钥 (Key Signing key) (一种长期密钥),
ZSK 表示区域签名密钥 (Zone Signing Key) (一种短期密钥)。
如果有足够的时间和数据,加密密钥最终都会被破解。对于 DNSSECv 中使用的非对称密钥或公钥密码系统而言,
这意味着攻击者可通过强力攻击方法或其他方法确定公钥 �C 私钥对的私钥部分(该部分用于创建对 DNS 记录的有效性进行验证的签名),从而使 DNSSEC 提供的保护失效。
DNSSEC 使用短期密钥(即区域签名密钥 (ZSK) ) 来定期计算 DNS 记录的签名,同时使用长期密钥(即密钥签名密钥 (KSK) ) 来计算 ZSK 上的签名,以使其可以得到验证,从而挫败了这些破解企图。
ZSK 被频繁更改或滚动,以使攻击者难以“猜测”,而期限较长的 KSK 则经过一个长得多的时段之后才更改(当前的最佳做法是以年为单位设置此时段)。
由于 KSK 对 ZSK 进行签名而 ZSK 对 DNS 记录进行签名,因此只需具有 KSK 即可对区域中的 DNS 记录进行验证。
它是以 授权签名者 (Delegation Signer, DS) 记录形式传递到“父”区域的一个 KSK 示例 。父区域(例如,根区域)使用其自己的、由其自己的 KSK 签名的 ZSK 对子区域(例如, .org )的 DS 记录进行签名
7.5.4 DNSSEC的缺点:
标记和校验DNS数据会产生额外的开销,从而影响网络和服务器的性能
8. 动态更新DNS
下面主要以通过dhcp服务器来动态更新dns的A记录为例:
8.1 创建密钥对:
dnssec-keygen -a hmac-md5 -b 128 -n user dhcp_update
生成了两个密钥文件:Kdhcp_update.+157+53578.key 和 Kdhcp_update.+157+53578.private
公钥密钥文件Kdhcp_update.+157+53578.key的内容如下:
dhcp_update. IN KEY 0 3 157 Vb289/ZfG85RfrP8YTVCGg==
8.2 修改dhcpd.conf文件:
ddns-update-style
interim;
ignore client-updates;
key dhcp_update { #更新dns的key,必须的
algorithm hmac-md5;
secret Vb289/ZfG85RfrP8YTVCGg==;
};
zone chinaunix.net. { #要更新的zone区
primary 127.0.0.1; #dns服务器的IP,此处为本机
key dhcp_update;
};
subnet 10.10.1.0 netmask 255.255.255.0 {
rang 10.10.1.10 10.10.1.254;
option routers 10.10.1.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 10.10.0.10 10.10.0.11;
option domain-name "chinaunix.net";
default-lease-time 86400; # 1 day
max-lease-time 259200; #3 days
};
8.3 修改named.conf文件:
options {
directory "/var/named";
};
include "/etc/rndc.key";
controls {
inet 127.0.0.1 allow { 127.0.0.1; } keys { rndc-key: };
key "dhcp_update" {
algorithm hmac-md5;
secret "Vb289/ZfG85RfrP8YTVCGg==";
};
zone "chinaunix.net" {
type master;
file "chinaunix.net.zone";
update-policy {
grant dhcp_update subdomain chinaunix.net. A;
};
};
上面的update-policy语句可以直接用allow-update { key dhcp_update; }; 替代
update-policy语句比allow-update语句能实现更精细的控制,二者不能同时存在。
update-policy语句的规则:
( grant | deny ) identity nametype name [types]
每个规则都说明是允许还是拒绝,一个信息如果与一条规则成功匹配,允许或拒绝立即执行,不再向下检查。
一个匹配是签名与inentity字段匹配,名字与name字段匹配,类型与type字段匹配。
identity 字段指授权更新需要的密钥名
nametype 字段有4个值: name, subdomain, wildcard, 和 self
name 名称:当更新名与name字段中的名字相同时匹配。
subdomain 子域:当更新名是name字段值的子域或name字段本身时匹配。
wildcard 通配名称:当更新名是name字段值的通配名称时匹配。
self 自已:当更新名是信息签名者自身时匹配,name字段被忽略