工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表分类:dns

bind DNSSEC

 

BIND简易教程(3):DNSSec配置

http://www.cnblogs.com/anpengapple/p/5879363.html
 
DNS BIND之dnssec安全实例配置-根节点
http://blog.csdn.net/zhu_tianwei/article/details/45075577
 

用 BIND 搭建高可用性 DNSSEC 仅权威服务器

https://www.v2ex.com/t/143009

bind查询攻击

 http://zj1991.blog.51cto.com/1847949/1609068

 

目前好多做DNS解析的服务,都采用了bind开源软件。好处就不多说了。但是在安全方面是个软肋,遭受DDOS流量攻击和放大攻击是常有的事情。在14年12月isc发布了最新的bind9.10-p1稳定版,同时对rate-limit默认支持(之前bind9.9的扩展支持版本,同样支持处于开发功能,需要在编译安装的时候./configure --enable-rrl开启rate-limit功能)。rate-limit可以有效防止放大攻击和DDOS流量攻击。

    DDOS流量攻击就不多说了,关于放大攻击原理,大家可参考博文:

http://blog.sina.com.cn/s/blog_90bb1f200101iazl.html

http://blog.csdn.net/yatere/article/details/6418888

https://blog.cloudflare.com/deep-inside-a-dns-amplification-ddos-attack/

isc官方对放大攻击的解释:

https://kb.isc.org/article/AA-00897/11/What-is-a-DNS-Amplification-Attack.html

 

 

了解了DNS放大攻击后,我们来看下bind最新功能rate-limit的使用方法:

isc官方给出的说明:

https://kb.isc.org/article/AA-00994/189/Using-the-Response-Rate-Limiting-Feature-in-BIND-9.9-Subscription-Version.html

 

 

在我们的named.conf配置文件中,添加方法可参考如下配置方式:

1

2

3

4

5

6

7

8

9

10

11

12

options{

    .......

     rate-limit {

            ipv4-prefix-length 32;

            window 10;

            responses-per-second 20;

            errors-per-second 5;

            nxdomains-per-second 5;

            slip 2;

              };

    ..........

};

 

关于参数具体使用说明情况,大家可参考bind手册Page53-P59的说明情况。 

 

同样,在此之前,或者不愿升级bind的,可通过iptables防止DDOS攻击和放大攻击

iptables -A INPUT -p udp --dport 53 -m recent --set --name dnslimit

iptables -A INPUT -p udp --dport 53 -m recent --update --seconds 60 --hitcount 11 --name dnslimit -j DROP

效果也不错。大家可有选择性的去使用。

 

 

 

 

 

 

 

 

 

雖然這些查詢被deny,但是持續不斷,真如殭屍一般,對系統造成不小的壓力,所以,根據 之前log的特徵值,以iptables進行封檔    iptables -t raw -A PREROUTING -p udp --dport 53 -m string --algo bm --hex-string "|0000ff0001|" -j DROP 

 

http://kecheng.baidu.com/view/723365f2bceb19e8b9f6ba5f.html

 

修改BIND9实现TCP DNS

由于习惯于使用UDP协议的DNS,很多人不知道其实DNS也是支持TCP协议的,功夫网只对UDP的DNS进行了劫持和污染,TCP DNS则可畅通无阻。
 
唯一的问题就是,浏览器、操作系统等都无法直接使用TCP DNS,我前一段时间一直在使用Tcp-DNS-proxy解决这个问题。这是一个基于Python的小程序,可以通过TCP连接DNS服务器,并在本地监听UDP53端口,实现TCP DNS的中转,程序简单运行方便,比较推荐。
 
不过Tcp-DNS-proxy本身也存在着一些问题,比如没有完整的缓存机制,导致查询速度较慢,程序稳定性和抗并发性一般。于是我考虑能否有更加稳定的解决方案?
 
最终还是选定了BIND这一老牌的DNS服务器,利用forward功能可以比较容易的实现对DNS的转发。Ubuntu 14.04下修改配置如下:
 
/etc/bind/named.conf.options
...
options {
    directory "/var/cache/bind";
    // If there is a firewall between you and nameservers you want
    // to talk to, you may need to fix the firewall to allow multiple
    // ports to talk.  See http://www.kb.cert.org/vuls/id/800113
    // If your ISP provided one or more IP addresses for stable
    // nameservers, you probably want to use them as forwarders.
    // Uncomment the following block, and insert the addresses replacing
    // the all-0's placeholder.
    forward only;
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };
    allow-query {
        any;
    };
    //========================================================================
    // If BIND logs error messages about the root key being expired,
    // you will need to update your keys.  See https://www.isc.org/bind-keys
    //========================================================================
    dnssec-validation auto;
    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
};
...
仅仅这样是不够的,我们需要的是TCP DNS转发(代理),但经过测试BIND会首选UDP解析进行递归查询,经过搜索Google、查看官方文档、查看源代码,我发现从配置上修改这条路是行不通的。
 
没有办法,只能动手改源代码了。不过还好,最近嵌入式课程实验我尝试把NginX移植到了ARM平台上,对于裁剪代码还是有心理准备的。
 
经过几个小时的努力,翻看了几个重要的.c文件,最终我确定了BIND9(这里选用bind-9.10.0-P1)发出查询的函数,是位于lib/dns/resolver.c文件第1403行的fctx_query函数,节选其中1446至1451行如下:
 
    query->mctx = fctx->mctx;
    query->options = options;
    query->attributes = 0;
    query->sends = 0;
    query->connects = 0;
    query->dscp = addrinfo->dscp;
其中query->options = options;这一行中options利用位运算存储了是否使用TCP连接的变量DNS_FETCHOPT_TCP,我们需要做的就是将这一行改为:
 
query->options = options | DNS_FETCHOPT_TCP;
强制让BIND使用TCP进行递归查询。之后进行编译,覆盖二进制文件即可,在此就不再赘述。效果如下:
 
WireShark截包
 
可以看到,第1、36报文是客户端查询BIND服务器,为UDP协议;其他报文为BIND查询8.8.8.8,为TCP报文(颜色不同)。

dns的srv记录

大家一起扫扫盲。
SRV 记录是一个域名系统 (DNS) 资源记录,用于标识承载特定服务的计算机。
例子:
_xmpp-server._tcp.ioio.name. IN SRV 5 0 5269 xmpp-server.l.google.com.
项目的含义:
_xmpp-server 服务(Service)的名字
_tcp 所使用的协议(Protocol)类型,比如 “_tcp” 或者 “_udp”
ioio.name SRV所在域的名字(Name)
5 - 优先级(Priority),类似MX记录
0 - 权重(Weight)
5269 - 端口(Port)
xmpp-server.l.google.com - 实际提供服务的主机名(Target )。
要验证域控制器的 SRV 定位器资源记录,可以使用 Nslookup 命令:
Nslookup 是一个命令行工具,它显示的信息可以用来诊断域名系统 (DNS) 的基础结构。
要使用 Nslookup 来验证 SRV 记录,请按照下列步骤操作:
1. 在 DNS 上,单击“开始”,然后单击“运行”。
2. 在“打开”框中,键入 cmd。
3. 键入 nslookup,然后按 Enter。
4. 键入 set type=all,然后按 Enter。
5. 键入 _xmpp-server._tcp.ioio.name,其中 ioio.name 为域名,然后按 Enter。
Nslookup 将返回显示为以下格式的一个或多个 SRV 服务位置记录:
Server:localhost
Address: 127.0.0.1
_xmpp-server._tcp.ioio.name SRV service location:
priority = 5
weight = 0
port = 5269
svr hostname = xmpp-server.l.google.com
参考文献:
什么是SRV记录
 它是DNS服务器的数据库中支持的一种资源记录的类型,它记录了哪台计算机提供了哪个服务这么一个简单的信息
 
  SRV 记录:一般是为Microsoft的活动目录设置时的应用。DNS可以独立于活动目录,但是活动目录必须有DNS的帮助才能工作。为了活动目录能够正常的工作,DNS服务器必须支持服务定位(SRV)资源记录,资源记录把服务名字映射为提供服务的服务器名字。活动目录客户和域控制器使用SRV资源记录决定域控制器的IP地址。  
 
  SRV记录功能包括(基于它们在DNS控制台的分组)
‘ _MSDCS。这个分组中,SRV记录是根据它们的状态来收集的。各种状态包括DC、域调用、GC以及PDC。DC和GC按站点来划分,这样一来,AD客户端就能快速的知道去哪里寻找本地服务。“域调用”用于支持复制。每个DC都获得了一个GUID,它会在调用复制时用到。PDC条目包含了被设定为PDC模拟器的DC的SRV记录。
‘ _SITES。站点代表的是一个高速连接区域,根据DC的站点从属关系来建立了DC索引之后,客户端就可以检查_SITES来寻找本地服务,而不必通过WAN来发送它们的LDAP查询请求。标准LDAP查询端口是389,全局编录查询则使用3268。
‘ _TCP。在这个分组中,收集了DNS区域中的所有DC。如果客户端找不到它们特定的站点,或者具有本地SRV记录的任何DC都没有响应,需要寻找网络中其他地方的DC,就应该将这些客户端放到这个分组中。
‘ _UDP。Keberos v5允许客户端使用“无连接”服务来获取票证并更改密码。这是通过与相同服务的TCP端口对应的UDP端口来完成的。具体说,票证交换使用UDP的88端口,而密码更改使用464.

rndc: ‘reload’ failed: not found解决

在执行rndc reload abc.com的时候,系统返回错误:
rndc: ‘reload’ failed: not found

发生这个错误的原因在使用单独域名reload时,rndc命令不能对新添加的域名生效,只能对已经存在的域名有效果。

也就是说当在bind里面配置对新的域名解析时,需要通过rndc reload方式去读取全部conf文件。

在这之后就可以使用rndc reload abc.com进行单独域名的更新了。

同时提示,如果使用了view方式话,需要在rndc的时候指定下
rndc reload abc.com in view_name

bind nsupdate

#设置一些必要的变量    
keyname=rndc-key    
keysecret=gAnBYq6xSv7FKTZFmzAD0Q==    
          
#用来检测本机网络是否正常    
function network_detect(){    
ping -c1 8.8.8.8 >/dev/null 2>&1 && echo connect || exit 1
}    
          
#用来删除DNS记录    
function del_record(){    
/usr/local/bind/bin/nsupdate <<EOF    
key $keyname $keysecret    
update delete $domain A $1
send    
quit    
EOF    
}    
          
#用来增加DNS记录    
function add_record(){    
/usr/local/bind/bin/nsupdate <<EOF    
key $keyname $keysecret    
update add $domain 3600 A $1
send    
quit    
EOF    
}  

nxdomain redirect 以及在bind 9.9中的实现

今天客户有个需求,就是将不存在的解析域名请求都解析到他们的一台设备上,其实这个就是类似与电信或者联通的域名纠错系统了。

其中SSAC有一篇文章,就是讲这个的,sac-032-en

这个根据网上的资料有几个实现思路

A、F5上配合filter进行实现

B、修改dns源码

C、bind原生支持

F5的实现方式

首先说一下F5上的实现:我们的产品前面确实有F5的负载均衡设备,但是在上面跑着很重要的服务,所以也没去实验,但根据网上的说法这个是可行的:利用rules,就是拆解dns的响应包,如果状态码是NXDOMAIN,则插入A记录或者其它东西;

DNS用于响应的报文由12字节长的首部和4个长度可变的字段组成。其中从第28位开始的4位的标志字段的子字段为rcode为返回码字段,通常的值为0(没有差错)和3(名字差错),名字差错从一个授权的名字服务器上返回,表示在查询中指定的域名不存在。因此把rcode字段返回的值变更为指定的字符串,就可以完成nxdomain redirect的要求

具体实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
rule dns_redirect {
 when RULE_INIT {
 set ::header_without_id [binary format S5 {0x8180 0x0001 0x0001 0x0000 0x0000}]
 set ::answerpart [binary format S6c4 {0xC00C 0x0001 0x0001 0x0000 0x0D1B 0x0004} {8 8 8 8}] #后面的这四个8 代表ip,8.8.8.8
 }
 when SERVER_DATA {
 binary scan [ string range [UDP::payload] 2 3 ] S sflags
 set rcode [expr $sflags &amp; 0x000f]
 if {$rcode == 3 }{
 binary scan [string range [UDP::payload] 12 13 ] c foo
 set byte [expr $foo &amp; 0xff]
 set offset 12
 set i 0
 while {$byte &gt; 0 &amp;&amp; $i &lt; 10} {
 
# grab a part and put it in our text QNAME section
 set offset [expr $offset + $byte + 1]
 # grab the length of the next part, and make it an unsigned integer
 set byte [string range [UDP::payload] $offset [expr $offset + 1]]
 binary scan $byte c foo
 set byte [expr $foo &amp; 0xff]
 incr i
 }
 incr offset
 binary scan [string range [UDP::payload] $offset [expr $offset + 2]] S qtype
 content
 if {$qtype == 0x0001} {
 UDP::payload replace 0 0 [binary format a2a*a*a* [string range [UDP::payload] 0 1] $::header_without_id [string range
 [UDP::payload] 12 [expr $offset+3]] $::answerpart]
 }
 }
 }
 }

总之,F5还是很灵活的,并且很多isp都在使用,上面的方案就是某isp的一个方案;

修改源代码的方案

接着说下修改源代码的这个方案,当然可以实现,但是开发成本挺高,暂时不考虑

bind-9.9.2 nxdomain redirect

下面就说下使用bind-9.9.2中最新的nxdomain redirect 功能

1、下载

wget ftp://ftp.isc.org/isc/bind9/9.9.2-P1/bind-9.9.2-P1.tar.gz

2、解压

tar zxf bind-9.9.2-P1.tar.gz

3、编译安装

cd bind-9.9.2-P1

./configure --prefix=/var/named --enable-threads --without-openssl --sysconfdir=/var/named/etc --with-libtool

make install

4、几个重要的配置文件

/var/named/etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@chenqing ~]# cat /var/named/etc/named.conf
options {
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 { any; };
 
recursion yes;
//forward first ;
//forwarders {127.0.0.1;};
dnssec-enable no;
 
dnssec-validation no;
 
dnssec-lookaside no;
 
/* Path to ISC DLV key */
 
bindkeys-file "/etc/named/bind.key";
};
 
logging {
 
channel default_debug {
 
file "data/named.run";
 
severity dynamic;
};
 
};
 
zone "." IN {
 
type hint;
 
file "named.ca";
 
};
zone "." {
 
type redirect;
 
file "redirect.db";
 
};

/var/named/named.ca

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.              IN  NS
 
;; ANSWER SECTION:
.           518400  IN  NS  M.ROOT-SERVERS.NET.
.           518400  IN  NS  A.ROOT-SERVERS.NET.
.           518400  IN  NS  B.ROOT-SERVERS.NET.
.           518400  IN  NS  C.ROOT-SERVERS.NET.
.           518400  IN  NS  D.ROOT-SERVERS.NET.
.           518400  IN  NS  E.ROOT-SERVERS.NET.
.           518400  IN  NS  F.ROOT-SERVERS.NET.
.           518400  IN  NS  G.ROOT-SERVERS.NET.
.           518400  IN  NS  H.ROOT-SERVERS.NET.
.           518400  IN  NS  I.ROOT-SERVERS.NET.
.           518400  IN  NS  J.ROOT-SERVERS.NET.
.           518400  IN  NS  K.ROOT-SERVERS.NET.
.           518400  IN  NS  L.ROOT-SERVERS.NET.
 
;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET. 3600000 IN  A   198.41.0.4
A.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:ba3e::2:30
B.ROOT-SERVERS.NET. 3600000 IN  A   192.228.79.201
C.ROOT-SERVERS.NET. 3600000 IN  A   192.33.4.12
D.ROOT-SERVERS.NET. 3600000 IN  A   128.8.10.90
E.ROOT-SERVERS.NET. 3600000 IN  A   192.203.230.10
F.ROOT-SERVERS.NET. 3600000 IN  A   192.5.5.241
F.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:2f::f
G.ROOT-SERVERS.NET. 3600000 IN  A   192.112.36.4
H.ROOT-SERVERS.NET. 3600000 IN  A   128.63.2.53
H.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:1::803f:235
I.ROOT-SERVERS.NET. 3600000 IN  A   192.36.148.17
J.ROOT-SERVERS.NET. 3600000 IN  A   192.58.128.30
J.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:c27::2:30
K.ROOT-SERVERS.NET. 3600000 IN  A   193.0.14.129
K.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:7fd::1
L.ROOT-SERVERS.NET. 3600000 IN  A   199.7.83.42
M.ROOT-SERVERS.NET. 3600000 IN  A   202.12.27.33
M.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:dc3::35
 
;; Query time: 147 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon Feb 18 13:29:18 2008
;; MSG SIZE  rcvd: 615

/var/named/redirect.db

1
2
3
4
5
6
7
8
9
10
11
$TTL 300
 
@ IN SOA ns.example.net hostmaster.example.net 0 0 0 0 0
 
@ IN NS ns.example.net
 
; NS records do not need address records in this zone as it is not in the
 
; normal namespace.
 
*. IN A 8.8.8.8

5、启动 named

/var/named/sbin/named -c /var/named/etc/named.conf -u named

6、验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@chenqing ~]# dig  xxxxxx.chenqing.org
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.6 <<>> xxxxxx.chenqing.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37117
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;xxxxxx.chenqing.org.       IN  A
 
;; ANSWER SECTION:
xxxxxx.chenqing.org.    300 IN  A   8.8.8.8
 
;; Query time: 1301 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Mar 20 22:02:43 2013
;; MSG SIZE  rcvd: 53

bind-dlz反向解析

2.实现DNS的反向解析
 
实现DNS的反向解析其实和正向解析的原理是一样的,只要对DNS、DLZ、ACL和VIEW的原理深刻理解一下就可以类比互通,以和正向解析的同样的方式来实现反向解析。
 
插入SOA记录
 
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`,`mx_priority`,
 
`refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`,`second_ns`,
 
`data_count`) VALUES
 
('201.16.172.in-addr.arpa', '@', 'SOA', 'ns1.vtest.org.', 10, NULL, 600, 3600, 86400,
 
10, 2011061200, 'vtest.org.', 'ns1.vtest.org.','ns2.vtest.org.',0);
 
插入@和NS记录
 
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES
 
('vtest.org', '@', 'NS', 'ns1.vtest.org.'),
 
('vtest.org', '@', 'NS', 'ns2.vtest.org.');
 
插入NS和A记录
 
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`) VALUES
 
('201.16.172.in-addr.arpa', '204', 'PTR', 'www1.vtest.org.'),
 
('201.16.172.in-addr.arpa', '205', 'PTR', 'www2.vtest.org.');
 
总之设置方面一句话,只要明白zone记录的写法一切就OK了!思路方面:多类比,多尝试,遇到问题不要急于找资料,先理顺思路、分析透彻,一切慢慢来

 

http://itsecureadmin.com/2010/09/bind-dlz-with-mysql/

Records:20123