在做软件样本分析的时候(主要是该样本的网络流量的分析),不可避免的会需要自己架设一个DNS服务器以配合IP欺骗的技术来试图获取软件样本的网络流量。下面就将以CentOS 5.2为例介绍一下在Linux上架设DNS服务器的办法。
安装bind
Linux下的dns功能是通过bind软件实现的。在CentOS下面安装bind很方便:
yum install bind
相关的配置文件
1./etc/hosts
定义了主机名和ip地址的对应,其中也有将要运行dns这台电脑的ip地址和主机名。初始内容如下:
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 TestServer localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
2. /etc/host.conf
当系统中同时存在DNS域名解析和/etc/hosts主机表机制时,由该/etc/host.conf确定主机名解释顺序。示例:
order hosts,bind #名称解释顺序
multi on #允许主机拥有多个IP地址
nospoof on #禁止IP地址欺骗
3. /etc/resolv.conf
该文件是DNS域名解析的配置文件,它的格式很简单,每行以一个关键字开头,后接配置参数。resolv.conf的关键字主要有四个,分别是:
nameserver #定义DNS服务器的IP地址
domain #定义本地域名
search #定义域名的搜索列表
sortlist #对返回的域名进行排序
/etc/resolv.conf的一个示例:
domain ringkee.com
search www.ringkee.com ringkee.com
nameserver 202.96.128.86
nameserver 202.96.128.166
4. /etc/named.conf
这个文件是bind的主配置文件。这个文件比较复杂,我们先看一个例子,然后再逐段解释。
需要注意的是对于在CentOS里面自带的bind因为启动脚本更改了根目录的原因,在这里以及后面提到的所有文件的存放路径都是相对于/var/named/chroot/目录来说的,比如这里的/etc/named.conf的真实路径为/var/named/chroot/ect/named.conf。
/*
* log option
*/
logging {
channel default_syslog { syslog local2; severity error; };
channel audit_log { file "/var/log/named.log"; severity error; print-time yes; };
category default { default_syslog; };
category general { default_syslog; };
category security { audit_log; default_syslog; };
category config { default_syslog; };
category resolver { audit_log; };
category xfer-in { audit_log; };
category xfer-out { audit_log; };
category notify { audit_log; };
category client { audit_log; };
category network { audit_log; };
category update { audit_log; };
category queries { audit_log; };
category lame-servers { audit_log; };
};
options {
directory "/var/named";
};
zone "." {
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";
allow-update { none; };
};
zone "test.com" {
type master;
file "test.com.zone";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "test.com.rev";
};
下面部分将逐段进行解释。
4.1 日志设定
/*
* log option
*/
logging {
channel default_syslog { syslog local2; severity error; };
channel audit_log { file "/var/log/named.log"; severity error; print-time yes; };
category default { default_syslog; };
category general { default_syslog; };
category security { audit_log; default_syslog; };
category config { default_syslog; };
category resolver { audit_log; };
category xfer-in { audit_log; };
category xfer-out { audit_log; };
category notify { audit_log; };
category client { audit_log; };
category network { audit_log; };
category update { audit_log; };
category queries { audit_log; };
category lame-servers { audit_log; };
};
这一部分是日志的设置,其中最主要的是 file "/var/log/named.log" 这一句指定了日志文件的位置,要正常启动named,必须要保证这一文件是存在的,并且named 进程对它有读写权限。
4.2 options
options {
directory "/var/named";
// listen-on-v6 { any; };
/*
* If you've got a DNS server around at your upstream provider, enter
* its IP address here, and enable the line below. This will make you
* benefit from its cache, thus reduce overall DNS traffic in the Internet.
*/
//forwarders {
// your.upper.DNS.address;
//};
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
/*
* If running in a sandbox, you may have to specify a different
* location for the dumpfile.
*/
//dump-file "/etc/named_dump.db";
};
这一部分是一些基本的配置项:
directory "/etc/named"; 指定域名解析等文件的存放目录(须手动建立);
listen-on-v6 { any; }; 支持ipv6的请求;
forwarders {
your.upper.DNS.address;
}; 指定前向DNS,当本机无法解析的域名,就会被转发至前向DNS进行解析。
dump-file "/etc/named_dump.db"; 指定named_dump.db文件的位置。
4.3线索域和回环域
zone "." {
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"; //反向解析文件
allow-update { none; };
};
指定线索域和本地回环域,这一部分使用一些标准的例子就可以。
在这里type类型有三种,它们分别是master,slave和hint它们的含义分别是:
master:表示定义的是主域名服务器
slave :表示定义的是辅助域名服务器
hint:表示是互联网中根域名服务器
文件“named.ca”; 指定该域的解析文件,其目录为options中directory "/var/named";指定的。在本例中为/var/namd。如果缺少named.ca,可以试试看从这里下载:ftp://ftp.rs.internic.net/domain/named.root
或者是使用如下命令产生一份named.ca:
dig -t NS . > named.ca
[注:如果根节点查询不全则可以使用一下命令]
dig -t NS . @a.root-servers.net > named.ca
文件“localhost.zone”定义了回环域的正向解析文件,其内容可以为:
$TTL 86400 //全局ttl值.以下记录不指定,则使用全局值
localhost. 600 IN SOA localhost. admin.localhost. (
2011081601 //序列号 版本号
1H //H小时 M分钟 D天 W星期 默认为秒
10M //重试时间间隔
7D //过期时间 7D找不到主服务器 则自杀
1D ) //否定回答ttl值
IN NS localhost.
localhost. IN A 172.0.0.1
文件“named.local”定义了回环域的反向解析文件,其内容可以为:
$TTL 86400
@ 600 IN SOA localhost. admin.localhost. (
2011081601
1H
10M
7D
1D )
IN NS localhost.
1 IN PTR localhost.
关于正向解析文件与反向解析文件的内容会在后文中进行详细解释。
4.4 自定义域
zone "test.com" {
type master;
file "test.com.zone";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "test.com.rev";
};
这一部分是配置文件中我们需要重点关心的部分:
zone "test.com" {
type master;
file "test.com.zone";
}; 设定test.com域;
type master 指明该域主要由本机解析;
file " test.com.zone"指定其解析文件为test.com.zone,目录为options中设定的目录本例中为/etc/named。
zone "0.168.192.in-addr.arpa" {
type master;
file "test.com.rev";
}; 指定ipv4地址逆向解析
type master 指明该域主要由本机解析;
file "test.com.rev"指定其解析文件为test.com.rev,目录为options中设定的目录本例中为/etc/named。
至此我们就初步建立了一个标准的named 的主配置文件,接下来建立对应的域名解析或逆向解析文件。
5. 域名解析文件
在named.conf的自定义域中指定了自定义域的域名解析文件,在我们的例子中,test.com这个域的解析文件是test.com.zone,下面来看看test.com.zone的内容:
@ IN SOA ns.test.com. root.test.com(
2005030116; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS ns
ns IN A 192.168.0.1
linux IN A 192.168.0.2
www IN CNAME linux
在这行里面@ IN SOA ns.test.com. root.test.com
上面的IN表示后面的数据使用的是INTERNET标准。而@则代表相应的域名,如在这里代表test.com,即表示一个域名记录定义的开始。而 ns.test.com则是这个域的主域名服务器,而root.test.com则是管理员的邮件地址。注意这是邮件地址中用.来代替常见的邮件地址中的@。而SOA表示授权的开始。
Serial行前面的数字表示配置文件的修改版本,格式是年月日当日修改的修改的次数,每次修改这个配置文件时都应该修改这个数字,要不然你所作的修改不会更新到网上的其它DNS服务器的数据库上,即你所做的更新很可能对于不以你的所配置的DNS服务器为DNS服务器的客户端来说就不会反映出你的更新,也就对他们来说你更新是没有意义的。
Refresh定义的是以为单位的刷新频率 即规定从域名服务器多长时间查询一个主服务器,以保证从服务器的数据是最新的。
Retry值规定了以秒为单位的重试的时间间隔,即当从服务试图在主服务器上查询更时,而连接失败了,则这个值规定了从服务多长时间后再试。
Expire这个用来规定从服务器在向主服务更新失败后多长时间后清除对应的记录,上述的数值是以分钟为单位的。
Minimum这个数据用来规定缓冲服务器不能与主服务联系上后多长时间清除相应的记录
IN NS ns
这一行必须有,指定本域的域名解析服务器。注意这一行前面必须有空格或者TAB
接下来的三行制定了本域的主机
ns IN A 192.168.0.1
ns 为主机名,A 代表地址类型为IPV4地址,192.168.0.1 是实际ip地址,这一条记录的含义是ns.test.com 的ip地址为 192.168.0.1;同理,linux.test.com的ip地址为192.168.0.2。
www IN CNAME linux
这一行定义了一个别名。即www.test.com与linux.test.com指的是同一个主机。
6. 反向域名解析文件
在named.conf的自定义域中除了指定了自定义域的域名解析文件,还需要指定自定义域的反向域名解析文件。它让dns服务器提供由ip地址查找主机名的服务。由于一些程序会要求反向查询,所以反向查询域的记录文件最好不要省略。在我们的例子中,test.com这个域的反向域名解析文件是test.com.rev,下面来看看test.com.rev的内容:
@ IN SOA ns.test.com. root.test.com (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns
1 IN PTR ns.test.com.
2 IN PTR linux.test.com.
在反向域名解析文件中,@ IN SOA ns.test.com. root.test.com这个部分各自字段含义与正向域名解析文件一致。
最后2行定义了反向域名解析中ip与域名的对应关系。
第一列表示的是主机的IP地址。省略了网络地址部分。如1完整应该是:192.168.0.1。
PTR:表示反向记录
最后一列表示的是主机的域名。
7.语法检查
#named-checkconf
//检测区域文件语法错误,不检测逻辑错误.
#named-checkzone "localhost" /var/named/localhost.zone
//检查localhost文件
#named-checkzone "0.0.127.in-addr.arpa" /var/named/named.local
//检查named.local文件
8.杂项
启动服务:
#service named start
设置域名解析服务开机自动启动:
chkconfig --level 2345 named on
设置新建的DNS服务器为本机的DNS服务器:
修改/etc/resolv.conf 将nameserver 后改为本机IP地址