2025年4月2日 星期三 乙巳(蛇)年 正月初三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 系统应用 > Linux

Oracle Linux下内网DNS服务器的配置

时间:03-31来源:作者:点击数:59

在做一些实验时,经常需要一个内网的DNS服务器。本文详细描述了构建整个DNS服务器的过程。

前提条件

  • 使用 VirtualBox 虚拟机,联网方式选择内部网络,如果你不知道怎么配置网络,看这里
  • Oracle Linux 6.5 (可以认为=CentOS)下,Desktop软件组已经安装好
  • 不使用IPv6
  • 不使用DNSSEC
  • 域名是 example.com
  • DNS服务器的内网IP地址是 192.168.0.2
  • DNS服务器的主机名是 server.example.com
  • DNS服务器的外网IP地址是 192.168.1.2(真正的外网肯定不是这种地址,这里只是实验)
  • 全部操作以root用户完成

环境准备

强烈推荐在安装任何服务之前先把SELinux和iptables(也就是防火墙)暂时禁止掉,这样的话我们可以专注于安装服务本身,而不会被各种SELinux上下文和防火墙规则所干扰。

在全部服务都安装好之后,你可以根据需要,开启SELinux和iptables。注意,本文不包含SELinux和iptables的配置。

禁用SELinux

  • # vim /etc/sysconfig/selinux
  • SELINUX=disabled # 由enforcing 改成 disabled

清空并禁用iptables

  • # iptables -F
  • # iptables -L
  • # service iptables save

也可以彻底关闭iptables服务:

  • # service iptables stop
  • # chkconfig iptables off

打开IP Forward 功能

之所以打开这个功能,是因为我想把Linux当做一个路由器来用。

  • # vim /etc/sysctl.conf
  • net.ipv4.ip_forward = 1 #修改:由0改成1
  • # sysctl -p

重启机器

为了让SELinux的禁用的设置生效,必须重启机器。

DNS服务器构成规划

如下图所示:

DNS构成
DNS构成

配置 DNS服务器

设置IP地址以及主机名

这里不使用图形界面,使用命令行的方式来配置。

首先配置一下IP(192.168.0.2)以及相关的参数(因为我的虚拟机有多个网卡,这里用第二个网卡 eth1 来进行配置)。

  • # vim /etc/sysconfig/network-scripts/ifcfg-eth1
  • DEVICE=eth1
  • TYPE=Ethernet
  • UUID=06dbc3e2-4d24-4cb5-9b24-89c166a71e5a
  • ONBOOT=yes
  • NM_CONTROLLED=yes
  • BOOTPROTO=none
  • HWADDR=08:00:27:6D:CA:57
  • IPADDR=192.168.0.2
  • NETMASK=255.255.255.0
  • PREFIX=24
  • DEFROUTE=no
  • IPV4_FAILURE_FATAL=yes
  • IPV6INIT=no
  • NAME="System eth1"
  • HWADDR=08:00:27:C6:79:2B
  • MTU=1500
  • UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
  • LAST_CONNECT=1409908255

重启网络服务,并查看eth1的配置信息:

  • # service network restart
  • # ip addr show eth1
  • 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  • link/ether 08:00:27:c6:79:2b brd ff:ff:ff:ff:ff:ff
  • inet 192.168.0.2/24 brd 192.168.0.255 scope global eth1
  • inet6 fe80::a00:27ff:fec6:792b/64 scope link
  • valid_lft forever preferred_lft forever
  • ```language

修改主机名(server.example.com),先:

  • # vim /etc/sysconfig/network
  • NETWORKING=yes
  • HOSTNAME=server.example.com

再:

  • # vim /etc/hosts
  • 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  • ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  • 192.168.0.2 server.example.com

重启,使 hostname 生效:

  • # reboot

安装Bind

使用yum进行安装:

  • # yum -y install bind bind-chroot

编写一个 chroot(/root/bind-chroot-admin)脚本,内容如下:

  • #!/bin/sh
  • #bind-chroot install check
  • rpm -q bind-chroot > /dev/null 2>&1
  • [ $? -ne 0 ] && echo bind-chroot not install && exit 1
  • # bind-chroot enabled
  • sed -i '/^ROOTDIR=/d' /etc/sysconfig/named
  • echo ROOTDIR=/var/named/chroot >> /etc/sysconfig/named
  • # file copy
  • filelist=`mktemp`
  • rpm -ql bind|grep ^/etc >> ${filelist}
  • rpm -ql bind|grep ^/var >> ${filelist}
  • for file in `cat ${filelist}`
  • do
  • # directory make
  • if [ -d ${file} ]; then
  • DIRNAME=/var/named/chroot${file}
  • [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
  • fi
  • # file copy
  • if [ -f ${file} ]; then
  • DIRNAME=/var/named/chroot`dirname ${file}`
  • [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
  • /bin/cp -a ${file} ${DIRNAME}
  • fi
  • done
  • rm -f ${filelist}
  • chown named:named /var/named/chroot/var/named/data
  • chmod 770 /var/named/chroot/var/named/data
  • chown named:named /var/named/chroot/var/named/dynamic
  • exit

执行此脚本:

  • # sh bind-chroot-admin

配置Bind

编辑bind的配置文件(/var/named/chroot/etc/named.conf):

  • //
  • // named.conf
  • //
  • // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
  • // server as a caching only nameserver (as a localhost DNS resolver only).
  • //
  • // See /usr/share/doc/bind*/sample/ for example named configuration files.
  • //
  • options {
  • #listen-on port 53 { 127.0.0.1; }; #注释掉
  • #listen-on-v6 port 53 { ::1; }; #注释掉
  • 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";
  • allow-query { localhost; localnets; }; # 修改: 添加 localnets
  • recursion yes;
  • empty-zones-enable no; #追加: 启动时对于空的zone的错误日志不输出
  • dnssec-enable no; #修改: yes -> no, 不使用DNSSEC
  • dnssec-validation no; #修改: yes -> no, 不使用DNSSEC
  • #dnssec-lookaside auto; #注释掉
  • /* Path to ISC DLV key */
  • bindkeys-file "/etc/named.iscdlv.key";
  • forwarders{ #追加
  • 192.168.0.2; #追加: 路由器的IP,我把本机当路由了
  • }; #追加
  • managed-keys-directory "/var/named/dynamic";
  • };
  • logging {
  • channel default_debug {
  • file "data/named.run";
  • severity dynamic;
  • };
  • category lame-servers { null; }; #追加
  • };
  • view "internal" { #追加
  • match-clients { localnets; }; #追加
  • match-destinations { localnets; }; #追加
  • zone "." IN {
  • type hint;
  • file "named.ca";
  • };
  • include "/etc/named.rfc1912.zones";
  • include "/etc/named.root.key";
  • include "/etc/named.example.com.zone"; #追加
  • }; #追加
  • view "external" { #追加,可选,如果你的DNS服务器不准备连接外网的话,这里不用写
  • match-clients { any; };#追加,可选,如果你的DNS服务器不准备连接外网的话,这里不用写
  • match-destinations { any; };#追加,可选,如果你的DNS服务器不准备连接外网的话,这里不用写
  • recursion no; #追加,可选,如果你的DNS服务器不准备连接外网的话,这里不用写
  • include "/etc/named.example.com.zone.wan"; #追加:注意这里和你的域名做相应的调整,,可选,如果你的DNS服务器不准备连接外网的话,这里不用写
  • }; #追加,可选,如果你的DNS服务器不准备连接外网的话,这里不用写

编辑内部Zone的定义文件

文件名:/var/named/chroot/etc/named.example.com.zone

  • zone "example.com" {
  • type master;
  • file "example.com.db";
  • };
  • zone "0.168.192.in-addr.arpa" {
  • type master;
  • file "0.168.192.in-addr.arpa.db";
  • };

编辑外部Zone的定义文件(可选)

文件名:/var/named/chroot/etc/named.example.com.zone.wan

如果你的DNS服务器不打算接入Internet的话,这个文件不需要。

  • zone "example.com" {
  • type master;
  • file "example.com.db.wan";
  • allow-query { any; };
  • };
  • zone "1.168.192.in-addr.arpa" {
  • type master;
  • file "1.168.192.in-addr.arpa.db";
  • allow-query { any; };
  • };

仅开放IPv4

文件名:/etc/sysconfig/named

  • OPTIONS="-4" # 在文件的最后加入这行

更新根域名服务器列表(可选)

再次提醒,如果你只是内网使用DNS的话,这一小节的内容请无视。

  • # dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca

为了方便起见,可以使用一个自动脚(named.root_update)本来跟新根DNS域名服务器的列表:

  • #!/bin/bash
  • new=`mktemp`
  • errors=`mktemp`
  • dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors
  • if [ $? -eq 0 ]; then
  • sort_new=`mktemp`
  • sort_old=`mktemp`
  • diff_out=`mktemp`
  • sort $new > $sort_new
  • sort /var/named/chroot/var/named/named.ca > $sort_old
  • diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
  • if [ $? -ne 0 ]; then
  • (
  • echo '-------------------- old named.root --------------------'
  • cat /var/named/chroot/var/named/named.ca
  • echo
  • echo '-------------------- new named.root --------------------'
  • cat $new
  • echo '---------------------- difference ----------------------'
  • cat $diff_out
  • ) | mail -s 'named.root updated' root
  • cp -f $new /var/named/chroot/var/named/named.ca
  • chown named. /var/named/chroot/var/named/named.ca
  • chmod 644 /var/named/chroot/var/named/named.ca
  • /etc/rc.d/init.d/named restart > /dev/null
  • fi
  • rm -f $sort_new $sort_old $diff_out
  • else
  • cat $errors | mail -s 'named.root update check error' root
  • fi
  • rm -f $new $errors

然后让这个脚本可执行;

  • # chmod 700 named.root_update

最后让这个脚本每个月自动执行(前提是你的crond已经打开):

  • # mv named.root_update /etc/cron.monthly/

配置解析文件

内部用正解文件

也就是从域名到IP地址的解析关系。

文件名:/var/named/chroot/var/named/example.com.db

  • $TTL 86400
  • @ IN SOA example.com. root.example.com.(
  • 2013120801; Serial
  • 28800 ; Refresh
  • 14400 ; Retry
  • 3600000 ; Expire
  • 86400 ) ; Minimum
  • IN NS example.com.
  • IN MX 10 example.com.
  • @ IN A 192.168.0.2
  • * IN A 192.168.0.2
  • dns IN A 192.168.0.2
  • server IN A 192.168.0.2
  • ldap IN A 192.168.0.2
  • www IN A 192.168.0.2
  • mail IN A 192.168.0.2
  • ftp IN A 192.168.0.2
  • sgd-server IN A 192.168.0.3
  • win IN A 192.168.0.4
  • lin IN A 192.168.0.5
  • sol IN A 192.168.0.6
  • wins IN A 192.168.0.7

内部用反解文件

也就是从IP到域名的关系。

文件名:/var/named/chroot/var/named/0.168.192.in-addr.arpa.db

  • $TTL 86400
  • @ IN SOA example.com. root.example.com.(
  • 2013120801 ; Serial
  • 28800 ; Refresh
  • 14400 ; Retry
  • 3600000 ; Expire
  • 86400 ) ; Minimum
  • IN NS example.com.
  • 2 IN PTR example.com.
  • 2 IN PTR dns.example.com.
  • 2 IN PTR server.example.com.
  • 2 IN PTR ldap.example.com.
  • 2 IN PTR www.example.com.
  • 2 IN PTR mail.example.com.
  • 2 IN PTR ftp.example.com.
  • 3 IN PTR sgd-server.example.com.
  • 4 IN PTR win.example.com.
  • 5 IN PTR lin.example.com.
  • 6 IN PTR sol.example.com.
  • 7 IN PTR wins.example.com.

外部用正解文件(可选)

也就是从外部访问时,从域名到IP地址的解析关系。

文件名:/var/named/chroot/var/named/example.com.db.wan

  • $TTL 86400
  • @ IN SOA ns1.example.com. root.example.com.(
  • 2013120801 ; Serial
  • 7200 ; Refresh
  • 7200 ; Retry
  • 2419200 ; Expire
  • 86400 ) ; Minimum
  • IN NS ns1.example.com.
  • IN MX 10 example.com.
  • ns1 IN A 192.168.1.2
  • @ IN A 192.168.1.2
  • www IN A 192.168.1.2
  • ftp IN A 192.168.1.2
  • mail IN A 192.168.1.2
  • server IN A 192.168.1.2
  • ldap IN A 192.168.1.2
  • dns IN A 192.168.1.2
  • example.com. IN TXT "v=spf1 ip4:192.168.1.2 ~all"

外部用反解文件(可选)

文件名:/var/named/chroot/var/named/1.168.192.in-addr.arpa.db

  • $TTL 86400
  • @ IN SOA example.com. root.example.com.(
  • 2013120801 ; serial
  • 3600 ; refresh (1 hour)
  • 900 ; retry (15 minutes)
  • 604800 ; expire (1 week)
  • 86400 ; negative (1 day)
  • )
  • IN NS example.com.
  • 2 IN PTR example.com.
  • ```languag

启动 bind 服务,测试运行

启动服务:

  • # service named start

开机自动运行DNS服务:

  • # chkconfig named on

配置网卡eth1的DNS,使用本机做为DNS服务器:

  • # vim /etc/sysconfig/network-scripts/ifcfg-eth1
  • DNS1=127.0.0.1

测试

先测试正向解析:

  • # dig example.com
  • ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.0.2.el6_4.6 <<>> example.com
  • ;; global options: +cmd
  • ;; Got answer:
  • ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5153
  • ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
  • ;; QUESTION SECTION:
  • ;example.com. IN A
  • ;; ANSWER SECTION:
  • example.com. 86400 IN A 192.168.0.2
  • ;; AUTHORITY SECTION:
  • example.com. 86400 IN NS example.com.
  • ;; Query time: 4 msec
  • ;; SERVER: 127.0.0.1#53(127.0.0.1)
  • ;; WHEN: Tue Sep 9 15:08:27 2014
  • ;; MSG SIZE rcvd: 59

观察上面的ANSWER SECTION,可以看出解析成功了。

接下来试试反向解析:

  • # dig -x 192.168.0.2
  • ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.0.2.el6_4.6 <<>> -x 192.168.0.2
  • ;; global options: +cmd
  • ;; Got answer:
  • ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31947
  • ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 1, ADDITIONAL: 1
  • ;; QUESTION SECTION:
  • ;2.0.168.192.in-addr.arpa. IN PTR
  • ;; ANSWER SECTION:
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR mail.example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR ftp.example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR dns.example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR server.example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR ldap.example.com.
  • 2.0.168.192.in-addr.arpa. 86400 IN PTR www.example.com.
  • ;; AUTHORITY SECTION:
  • 0.168.192.in-addr.arpa. 86400 IN NS example.com.
  • ;; ADDITIONAL SECTION:
  • example.com. 86400 IN A 192.168.0.2
  • ;; Query time: 4 msec
  • ;; SERVER: 127.0.0.1#53(127.0.0.1)
  • ;; WHEN: Tue Sep 9 15:09:31 2014
  • ;; MSG SIZE rcvd: 210
  • ```language

观察上面的ANSWER SECTION,可以看出解析也成功了。

至于外部解析,因为和上面的步骤相同,这里就不在赘述。

至此为止,所有的配置都完成了。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门