LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1249|回复: 7

slackware10.1+BIND9做自己的公网DNS服务器详解

[复制链接]
发表于 2005-7-29 00:40:39 | 显示全部楼层 |阅读模式
环境: slackware10.1/kernel 2.4.29/pIII550/64m/10g

使用slackware10.1的BIND包默认安装

公网网卡eth0 地址211.137.217.251


前提:

理解 DNS 的授权模式 ? 是怎样进行的?
理解 DNS 正解和反解 ?
理解 DNS 的查询模式 ? 查询过程是怎样的?


如果您对于以上问题还不了解,那么我建议您到这里看看

http://slackware.zzmobile.com/bl ... d=a_20050727_235508



--------------------------------------------------------------------------------


下面进入正题

1 设置named.conf
首先﹐打开named.conf文件﹐路径 /etc/named.conf

我先将我自己的文档列了出来﹕



  1. options {
  2. directory "/var/named";
  3. /*
  4. * If there is a firewall between you and nameservers you want
  5. * to talk to, you might need to uncomment the query-source
  6. * directive below.  Previous versions of BIND always asked
  7. * questions using port 53, but BIND 8.1 uses an unprivileged
  8. * port by default.
  9. */
  10. // query-source address * port 53;
  11. forward first;
  12.        forwarders {                    
  13. 202.102.224.68;
  14. 202.102.227.68;
  15. };                  
  16.                
  17.                
  18. };

  19. //
  20. // a caching only nameserver config
  21. //
  22. zone "." IN {
  23. type hint;
  24. file "caching-example/named.ca";
  25. };

  26. zone "localhost" IN {
  27. type master;
  28. file "caching-example/localhost.zone";
  29. allow-update { none; };
  30. };

  31. zone "0.0.127.in-addr.arpa" IN {
  32. type master;
  33. file "caching-example/named.local";
  34. allow-update { none; };
  35. };

  36. zone "hnzzcc.com" IN {
  37.        type master;
  38.        file "db.hnzzcc.com";
  39. };
  40. zone "217.137.211.in-addr.arpa" IN {
  41.        type master;
  42.        file "db.211.137.217";
  43. };

  44. zone "ln.hnzzcc" IN {
  45. type forward;
  46. forwarders { 10.87.13.87; 10.87.13.96; };
  47. };

复制代码


options 设置﹐首先用 directory 指定了 named 的资源记录( RR - Resource Record )目录所在位置為﹕“/var/named”﹔它说明了我们配置NAMED的设置文件都在这个目录下

接下?砜匆幌伦⑹

接下?碓僮屛覀兛聪乱欢尉渥萤s 如果您要设置的DNS服务器和DNS client之间要是有防火墙的话,要将"“// query-source address * port 53;"前面的"//"注解拿掉.这些设置对8.1之前的版本影响

我们用的是BIND9,不必担心.如果您设置的有防火墙我建议您在iptables 中添加以下语句:



  1. iptables -A INPUT -p tcp -i eth0 --dport 53 -j ACCEPT
  2. iptables -A INPUT -p udp -i eth0 --dport 53 -j ACCEPT

复制代码


接下来的是转发(forward)设定



  1. forward first;
  2.        forwarders {                    
  3. 202.102.224.68;
  4. 202.102.227.68;
  5. };  

复制代码


它说明了:如果服务器查找不到相关的DNS信息,那么转发到202.102.224.68和202.102.227.68来查询

接下来是zone区域



  1. zone "." IN {
  2. type hint;
  3. file "caching-example/named.ca";
  4. };

  5. zone "localhost" IN {
  6. type master;
  7. file "caching-example/localhost.zone";
  8. allow-update { none; };
  9. };

  10. zone "0.0.127.in-addr.arpa" IN {
  11. type master;
  12. file "caching-example/named.local";
  13. allow-update { none; };
  14. };

复制代码


"."定义了根区域,它同时又是一个INTERNET类别,详细解释需要很多篇幅,建议大家看一下相关书籍

以上zone设置是默认设置;定义了本机的DNS﹕第一个 zone 是 localhost 的正解 zone﹐其服务器属于DNS master﹐记录文件名称是 localhost.zone (在 /var/named/caching-example 目录下面)﹐但這个 zone 不允许客戶主机(或服务器)自行更新 DNS 的记录.

而第二个 zone 则是本机区域的反解 zone

现在我建议您先看一下named.conf中的directory "/var/named"

ls /var/named/caching-example我们会看到这些文件

named.ca
localhost.zone
named.local

也就是说每一个区域对应一个记录文件

      2   zone区域记录文件
我们来打开这些文件看一下,首先是localhost.zone



  1. $TTL    86400
  2. $ORIGIN localhost.
  3. @                       1D IN SOA       @ root (
  4.                                        42              ; serial (d. adams)
  5.                                        3H              ; refresh
  6.                                        15M             ; retry
  7.                                        1W              ; expiry
  8.                                        1D )            ; minimum

  9.                        1D IN NS        @

  10.                        1D IN A         127.0.0.1
复制代码


內容很简单﹐但您是否真的了解每一行的设定意思呢﹖如果不清楚或不确定﹐那就让我们一起探讨。

首先﹐第一行是一个 TTL 设定﹐目前是定义出记录文件里面的各项记录的默认 TTL 值为 86400 秒(刚好是一天)。没有这一行并不影响功能﹐但会出现一些警告.

第二行是一个 ORIGIN 设定﹐说明下面的记录出自何处.请您加倍留意最后的一个小小数点"."

然后﹐第三行﹐是一个 SOA 记录的设定﹐在这里我们看到一个特殊字符@,它就是 ORIGIN 的意思﹐也就是刚刚所定义的 $ORIGIN localhost. 內容﹐您可以写成 localhost. 也可以用@ ?泶妗<偃缯飧鑫募前面沒有定义 $ORIGIN 的话﹐那這个@的值就以 named.conf 里的 zone .

在@之后﹐是 TTL 的设定﹐这里是 1D﹐也就是一天的意思.

SOA ﹐也就是“Start Of Authority”的意思﹐表示目前区域的授权开始。每一个记录文件只能有一个 SOA ﹐不能重复﹐而且必须是所负责的 zone 中第一个"记录".


接着 SOA 后面,指定了这个区域的授权主机和管理者的信箱,这里分别是@和“ root ”,也就是 localhost. 主机和 root 信箱。这里要注意的是:SOA 的主机名称必须能够在 DNS 系统中找到一个 A 记录 (以后会提到);另外,我们平时使用的信箱通常是“user@host”这样的格式,但因为@在 DNS 记录中是个保留字符(刚才已经提过),所以在 SOA 中就用“.”来代替了@。目前这个信箱是 root (并没有主机地址),也就是本机,您可以写成 “root.localhost.”但不能写成“root@localhost.”。

接下来的 SOA 设置,是被括在“( )”之间的 5 组数字,主要作为和 slave 服务器同步 DNS 资料所使用的资料:


Serial:其格式通常会是“年月日+修改次序”(但也不一定如此,您自己能够记得就行)。当 slave 要进行资料同步的时候,会比较这个号码。如果发现在这里的号码比它那边的数值“大”,就进行更新,否则忽略。不过设 serial 有一个地方您要留意:不能超过 10 位数字!
Refresh:这里是是告诉 slave 要隔多久要进行资料同步(是否同步要看 Serial 的比较结果)。
Retry:如果 slave 在进行更新失败后,要隔多久再进行重试。
Expire:这是记录逾期时间:当 slave 一直未能成功与 master 取得联系,那到这里就放弃 retry,同时这里的资料也将标识为过期( expired )。
Minimum:这是最小默认 TTL 值,如果您在前面没有用“$TTL”来定义,就会以此值为准。

以上的数字都是以秒为单位,但您也可以用 H(小时)、D(天)、W(星期)来做单位,如:3H 和 259200 是一样的。

请注意:SOA 记录中这对 “ ( ) ”符号之第一个 “ (”括号一定要和 SOA 写在同一行,而不能用 Enter 断行到下一行去(有时候您在书本的范例中看到这个符号排在下一行去了,那是因为版面的关系而已),而且其左边最好有一个空格键或 tab 建。而最后一个 “ )”括号也不能写在注解符号 “ ;”的右边。

设置 DNS 的 RR 记录档,其格式要求非常严格,我们丝毫不能掉以轻心。比方说:如果句子不是以空格键、Tab 键、 或注解符号 ( ; )开头,也不在 SOA 的 “ ( ) ”之内, 则表示要定义一个“新记录项 (Entry) ”;如果句子是以空格键或 tab 键开始的话,其设置被视为上一个“记录项”的内容。所以,如果您要为“同一个记录项”定义多个记录设置,而不想重复打字,您倒可以偷懒:在接着它的后面几行用空白或 Tab 来缩排就可以了。所以,最后这两行还是关于 localhost. 的设置,因为上一个“资料项”为 “ @ ”,也就是 localhost. 。当然,您如不喜欢,这两行句子也可以这样写:

;; 修改前:
1D IN NS @

1D IN A 127.0.0.1

;; 修改后:
@1D IN NS @
@1D IN A 127.0.0.1

;; 或:
localhost.1D IN NS localhost.
localhost.1D IN A 127.0.0.1


这两行的意思是说:负责 localhost. 这个记录的 name server ( NS ) 是 localhost. 这台机器;而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 里面的 A 记录应该是最常见的记录类型之一,如果在 IPv6 版本中,地址记录名称则改为 AAAA 。


Tips:关于更多的记录名称,请参阅“学习网络”中的“DNS 协议”。

最后,让我们检查剩下的 named.local 文件吧。如果您还没忘记 /etc/named.conf 的内容的话,应知道这个文件是 zone "0.0.127.in-addr.arpa" 的‘反解’记录档,它的内容也很简单:



  1. $TTL 86400
  2. @ IN SOA localhost. root.localhost. (
  3. 1997022700 ; Serial
  4. 28800 ; Refresh
  5. 14400 ; Retry
  6. 3600000 ; Expire
  7. 86400 ) ; Minimum
  8. IN NS localhost.

  9. 1 IN PTR localhost.

复制代码


前面的部份应该不用多解释了(如果您还不清楚,那就必须重读前面的文章)。最后一行我们看到一个“ PTR ”记录,它是“Pointer”的意思。 PTR 通常用于反记录当中,将 IP 指向主机名称(刚好和 A 记录相反)。您或许还不是很清楚这个句子为什么是这样设置的吧?或许您会这样问:您不是说 PTR 是从 IP 反查询主机名称的吗?为什么这里是 1 而不是 127.0.0.1 ?

哦,如果您有这样的问题,那证明您对 DNS 的查询模式还不是了解得很透彻,不过也不用紧张,在后面的实作例子中,您将获得更进一步的感性认识。这里,我暂时简单解释上面这行就是了:

我们知道 127.0.0.1 所映射的主机名称就是 localhost ,因为这里是反向查询,所以 IP 顺序是掉过来写的,于是这个反查询 IP 就是:“ 1.0.0.127.in-addr.arpa. ”,由于我们这里的 ORIGIN @ 是“ 0.0.127.in-addr.arpa." ”,因为在记录档中,如果名称不带小数点,则被补上 $ORIGIN 或 zone 的名称,所以这个 “ 1 ”就成了 1.0.0.127.in-addr.arpa. ”。同样道理,后面的“ localhost. ”如果漏了最后的小点的话,则会成为“ localhost.0.0.127.in-addr.arpa. ”,这显然是不对的。假如您喜欢,可以将这行句子修改成为下面的样子:

;;修改前:
1 IN PTR localhost.

;;修改后:
1.0.0.127.in-addr.arpa. IN PTR localhost.

3 设定自己的NAMED

下面设置我们自己定义的域名

设置之前首先要说的是必须已经申请过自己的DNS,拥有自己的固定IP的公网主机.

那么我的域名是 hnzzcc.com,我联系了ISP把DNS 区域hnzzcc.com 指向了我的主机:211.137.217.251


在named.conf中增加以下内容


  1. zone "hnzzcc.com" IN {//正解区域名称
  2.        type master;//区域类型
  3.        file "db.hnzzcc.com";//记录文件名称
  4. };
  5. zone "217.137.211.in-addr.arpa" IN {//反解....
  6.        type master;//......
  7.        file "db.211.137.217";//.....
  8. };

  9. zone "ln.hnzzcc" IN { //公司内部区域名称,在此文中没有作用.
  10. type forward; //类型是转发
  11. forwarders { 10.87.13.87; 10.87.13.96; };//转发的地址
  12. };

复制代码


建立db.hnzzcc.com文件,文件内容:



  1. $TTL    86400
  2. $ORIGIN hnzzcc.com.
  3. @       IN      SOA     ns.hnzzcc.com. root.ns.hnzzcc.com. (
  4.                        2005072605
  5.                        28800
  6.                        14400
  7.                        3600000
  8.                        86400 )
  9. IN      NS      hnzzcc.com.

  10. IN      NS      ns.hnzzcc.com.
  11. IN      MX      10      ns.hnzzcc.com.  //MX记录

  12. @       IN      A       211.137.217.251   //指定域主机地址

  13. ns      IN      A       211.137.217.251    //A记录
  14. IN      MX      0       ns.hnzzcc.com.   //MX记录

  15. www               IN    A       219.154.96.5   //A记录

  16. bbs               IN    A       211.137.217.251  //A记录
  17. stone             IN    A       211.137.217.251  //A记录
  18. slackware         IN    A       211.137.217.251  //A记录


复制代码


提示:大家一定要注意别忘了域名后边那个"."

然后建立反解文件 db.211.137.217



  1. $TTL    86400
  2. @       IN      SOA     ns.hnzzcc.com.      root.ns.hnzzcc.com.(
  3. 2005072605 1H 1M 1W 1D )
  4. @       IN      NS      ns.hnzzcc.com.

  5. 251     IN      PTR     ns.hnzzcc.com.

复制代码


以上设定就是完全完成了 .

建议你

sh /etc/rc.d/rc.bind restart

然后做测试

dig hnzzcc.com 或者 nslookup hnzzcc.com 都会有正确的信息显示

如果没有显示出解析的地址,那么就要查看/var/log/message和/var/log/syslog文件了,日志中有出错的行数,对应更改,问题总会解决的.经常出错的地方是少了";"或者"."如果一切正常那么查看message应有如下显示:



  1. Jul 28 23:12:28 bbs named[5034]: loading configuration from '/etc/named.conf'
  2. Jul 28 23:12:28 bbs named[5034]: no IPv6 interfaces found
  3. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface lo, 127.0.0.1#53
  4. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface eth0, 211.137.217.251#53
  5. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface eth1, 10.87.145.29#53
  6. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface eth2, 192.168.0.1#53
  7. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface eth2:1, 10.87.200.254#53
  8. Jul 28 23:12:28 bbs named[5034]: listening on IPv4 interface ppp0, 10.87.200.1#53
  9. Jul 28 23:12:28 bbs named[5034]: command channel listening on 127.0.0.1#953
  10. Jul 28 23:12:28 bbs named[5034]: zone 200.87.10.in-addr.arpa/IN: loaded serial 2005072501
  11. Jul 28 23:12:28 bbs named[5034]: zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
  12. Jul 28 23:12:28 bbs named[5034]: zone 217.137.211.in-addr.arpa/IN: loaded serial 2005072605
  13. Jul 28 23:12:28 bbs named[5034]: zone hnzzcc.com/IN: loaded serial 2005072605
  14. Jul 28 23:12:28 bbs named[5034]: zone localhost/IN: loaded serial 42
  15. Jul 28 23:12:28 bbs named[5034]: zone hnzzcc.pn/IN: loaded serial 2005072501
  16. Jul 28 23:12:28 bbs named[5034]: running
复制代码


测试DNS服务是否启动用netstat -a也比较直接,看53是否起就可以了

也许到这里就可以结束了,但是我想还有一些不完善的地方.

4 安全设置
关于 DNS 的安全问题

DNS 系统在网络沟通上面提供了非常便利的途径,一个设置完整的 DNS 系统,无论在管理或除错方面都是非常有效的。然而,在许多网络入侵案例中,往往因为 DNS 提供的信息过多,而让入侵者省却了许多步骤和时间,这也增加了对入侵行为的侦察和预警的难度。

所以,假如您同时需要为内部和外部网络提供 DNS 服务、而又有条件的话,最好设置多台 DNS 服务器,分别对内和对外提供服务。在所有这些对外服务的机器上,我们只设置最少的必须记录就可以了,千万不要把 HINFO 等一些关于主机和网络环境的记录写进去。同时,任何不必要对外提供的 IP 和主机记录,一概删除就是了。而其它的为信任网络提供服务的主机,则无论如何也不要让过多的 DNS 信息流出 internet。您甚至可以通过火墙过滤来保护内部的 DNS 服务查询。

为了获得更好的安全效果,您可以在 /etc/named.conf 文件中设置一些限制,让 DNS 仅对那些信任的网络或主机提供服务,或者挡掉来自不信任主机的查询。下面,我提供一个安全设置的范例给大家参考一下:



  1. logging {  //把错误日志定义到slackware 默认的/var/log/syslog文件中,同时建议查看messages文件中的错误信息
  2.    category default { default_syslog; default_debug; };
  3. };
  4. //---首先定义各安全群组---//
  5. acl "local" { //定义本机IP域
  6. 127.0.0.0/8;
  7. };
  8. acl "CNC_net" { //定义了网通的DNS主机IP域,这样普通主机只能通过网通的转发来查询以增加安全性
  9. 202.0.0.0/8;
  10. };
  11. acl "TRUSTED_net" { //受信任的IP域
  12. 219.156.81.0/24;
  13. 192.168.2.0/24;
  14. };
  15. acl "TRUSTED_host" { //受信任的主机地址
  16. 192.168.100.26/32;
  17. 10.0.1.130/32;
  18. 10.0.1.161/32;
  19. };
  20. acl "VPN_net" { //定义了一个VPN网络IP区域
  21. 10.87.200.0/24;
  22. };
  23. acl "BAD_Guys" { //定义黑名单区域
  24. 221.15.164.250;  
  25. }; //-注:以上 ip 仅作例子 :-)!-//

  26. options {
  27. directory "/var/named";
  28. /*
  29. * If there is a firewall between you and nameservers you want
  30. * to talk to, you might need to uncomment the query-source
  31. * directive below.  Previous versions of BIND always asked
  32. * questions using port 53, but BIND 8.1 uses an unprivileged
  33. * port by default.
  34. */
  35. // query-source address * port 53;
  36. forward first;
  37.        forwarders {                    
  38. 202.102.224.68;
  39. 202.102.227.68;
  40. };                  

  41. allow-transfer { none; }; //默认禁止区域转移
  42. allow-query { any; }; //默认允许查询
  43. blackhole { BAD_Guys; }; //默认黑名单
  44.               
  45.                
  46. };

  47. //
  48. // a caching only nameserver config
  49. //
  50. zone "." IN {
  51. type hint;
  52. file "caching-example/named.ca";
  53. };

  54. zone "localhost" IN {
  55. type master;
  56. file "caching-example/localhost.zone";
  57. allow-update { none; };
  58. };

  59. zone "0.0.127.in-addr.arpa" IN {
  60. type master;
  61. file "caching-example/named.local";
  62. allow-update { none; };
  63. };
  64. zone "hnzzcc.pn" IN {
  65. type master;
  66. file "db.hnzzcc.pn";
  67. allow-query { VPN_net; }; //允许VPN网络查询
  68. allow-transfer { VPN_net; }; //允许VPN网络区域转移

  69. };
  70. zone "200.87.10.in-addr.arpa" IN {
  71.        type master;
  72.        file "db.10.87.200";
  73.       allow-query { VPN_net; };//允许VPN网络查询
  74.        allow-transfer { VPN_net; }; //允许VPN网络区域转移
  75. };
  76. zone "hnzzcc.com" IN {
  77.        type master;
  78.        file "db.hnzzcc.com";
  79.        allow-query { local; CNC_net; TRUSTED_net;VPN_net; }; //允许本机,网通DNS,受信任网络,VPN查询
  80.        allow-transfer { TRUSTED_host; }; //允许受信任网络区域转移
  81. };
  82. zone "217.137.211.in-addr.arpa" IN {
  83.        type master;
  84.        file "db.211.137.217";
  85.        allow-query { local; CNC_net; TRUSTED_net;VPN_net; }; //允许本机,网通DNS,受信任网络,VPN查询
  86.        allow-transfer { TRUSTED_host; }; //允许受信任网络区域转移
  87. };

  88. zone "ln.hnzzcc" IN { //定义转发区域ln.hnzzcc
  89. type forward;
  90. forwarders { 10.87.13.87; 10.87.13.96; }; //转发地址
  91. };


复制代码



在设置 DNS 的安全原则的时候,有些问题您必须注意:

如果 client (包括 localhost ) 如果不在 allow-query 范围内的话,将不能查询该区域的任何信息。


当这一个区域作为 master 且有其它 slave 指向它的时候,slave 主机必须同时被包括在 allow-query 和 allow-transfer 设居中才可以完成区域转移。


那些不在 allow-query 设置当中的主机,虽然不能够直接将 server 指向这台 DNS 来查询所在区域。然而,如果对方先将 server 指向另一台 DNS 主机,且该主机是属于 allow-query 设置之中的话,也可以对该区域进行查询。

例如,如果在 zone "hnzzcc.com" 当中允许 CNC_net 的查询。虽然从外面的主机不能直接查询这个 zone ,但只要对方将 server 指向 CNC_net 其中任一台 DNS 主机,而该主机的 allow-query 可以让其通过的话,那他们也就可以查询 hnzzcc.com 了。

结束语
一个基本的公网DNS服务器建立起来了,不过难免有不足,希望研究BIND的朋友多多交流.需要深入研究的朋友可以参考DNS & BIND 第四版 ,或者登陆我新开的站点http://slackware.zzmobile.com
发表于 2005-7-29 07:16:51 | 显示全部楼层
好贴还是要支持滴……
回复 支持 反对

使用道具 举报

发表于 2005-7-29 10:49:38 | 显示全部楼层
不错,支持.
建议加入精华
回复 支持 反对

使用道具 举报

发表于 2005-7-29 11:20:12 | 显示全部楼层
謝謝樓主, 我要加?妼W習....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-29 11:36:12 | 显示全部楼层

谢谢BABO,你最近虚拟主机搞的怎么样了.

我也正研究,可惜单位太忙.只能晚上研究
回复 支持 反对

使用道具 举报

发表于 2005-7-30 03:04:38 | 显示全部楼层

谢老大。

老大能写一篇设置BIND做本地网DNS(所设域名仅对本地局域网有效)的指引吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-30 10:09:53 | 显示全部楼层
仔细看看上文就能明白其实做一个LAN上的BIND很简单,只不过其服务对象以及端口都是对应lan的
你可以参考上文在LAN中做,不需要设置权限.
1在/etc/named.conf加入正解与反解zone;
2在定义目录(例如:/var/named),建立对应文件;
3测试一下,如果不成功就看日志错误提示/var/log/messages & syslog
回复 支持 反对

使用道具 举报

发表于 2005-8-5 09:57:20 | 显示全部楼层
好文,精华有份量

足量够称!!


谢谢兄弟,辛苦了。。

收入 http://slack.linuxsir.cn/main/?q=node/157

北南 呈上
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表