Submitted by admin on 2017, April 20, 10:34 PM
Submitted by admin on 2016, December 16, 11:14 AM
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
Submitted by admin on 2014, October 9, 5:57 PM
Submitted by admin on 2013, December 20, 3:23 PM
Submitted by admin on 2013, June 19, 3:00 PM
在执行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
Submitted by admin on 2013, June 18, 10:55 PM
#设置一些必要的变量
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
}
Submitted by admin on 2013, June 9, 5:39 PM
今天客户有个需求,就是将不存在的解析域名请求都解析到他们的一台设备上,其实这个就是类似与电信或者联通的域名纠错系统了。
其中SSAC有一篇文章,就是讲这个的,sac-032-en
A、F5上配合filter进行实现
B、修改dns源码
C、bind原生支持
首先说一下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 & 0x000f] if {$rcode == 3 }{ binary scan [string range [UDP::payload] 12 13 ] c foo set byte [expr $foo & 0xff] set offset 12 set i 0 while {$byte > 0 && $i < 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 & 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 功能
wget ftp://ftp.isc.org/isc/bind9/9.9.2-P1/bind-9.9.2-P1.tar.gz
tar zxf bind-9.9.2-P1.tar.gz
cd bind-9.9.2-P1
./configure --prefix=/var/named --enable-threads --without-openssl --sysconfdir=/var/named/etc --with-libtool
make install
/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 |
/var/named/sbin/named -c /var/named/etc/named.conf -u named
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 |
Submitted by admin on 2013, April 12, 12:12 PM
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了!思路方面:多类比,多尝试,遇到问题不要急于找资料,先理顺思路、分析透彻,一切慢慢来