我一直在build立规则集来检测和阻止DNS放大攻击。
我卡住了,希望能在这里find帮助。
我会在这里发布我所拥有的(bash脚本,涉及DNS的部分):
IPTABLES='/sbin/iptables -v' SERVERIP=abcd echo '################ Previously initiated and accepted exchanges bypass rule checking #' $IPTABLES --append INPUT -m state --state ESTABLISHED,RELATED --jump ACCEPT echo '################################################ Allow unlimited outbound traffic #' $IPTABLES --append OUTPUT -m state --state NEW,ESTABLISHED,RELATED --jump ACCEPT echo '################################################################## Rules for DNS #' # DIG ANY ISC.ORG attack preventer. # QUESTION1: this one does not work, why!?!? $IPTABLES --append INPUT --proto udp --dport 53 -m string --string "isc.org" --algo bm --to 65535 --jump LOG --log-prefix "iptables: UDP ISC0 " $IPTABLES --append INPUT --proto udp --dport 53 -m string --hex-string "|03697363036f726700|" --algo bm --to 65535 --jump LOG --log-prefix "iptables: UDP ISC " $IPTABLES --append INPUT --proto udp --dport 53 -m string --hex-string "|03697363036f726700|" --algo bm --to 65535 --jump DROP # DNS DNSIPSOK list $IPTABLES --new DNSFLOODRULES $IPTABLES --append DNSFLOODRULES --source 127.0.0.1 --jump RETURN $IPTABLES --append DNSFLOODRULES --source $SERVERIP --jump RETURN $IPTABLES --append DNSFLOODRULES --jump LOG --log-prefix "iptables: UDP BLOCK " $IPTABLES --append DNSFLOODRULES --jump ACCEPT #$IPTABLES --append DNSFLOODRULES --jump DROP # I have it turned off right now, because echo '# S & D port rules' # DNS limit rule for standard acceptance # QUESTION2: can't get the connbytes to work properly :( $IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 \ -m state --state NEW \ -m connbytes --connbytes 75 --connbytes-dir reply --connbytes-mode bytes -m limit --limit 1/s --limit-burst 10 --jump ACCEPT # DNS log / drop the abusers EXEPT the whitelisted IP numbers $IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 -m state --state NEW --jump DNSFLOODRULES $IPTABLES --append INPUT --proto udp --source 0/0 --sport 53 -m state --state NEW --jump DNSFLOODRULES # DNS allow the whitelisted IP numbers $IPTABLES --append INPUT --proto udp --source 0/0 --dport 53 -m state --state NEW --jump ACCEPT $IPTABLES --append INPUT --proto udp --source 0/0 --sport 53 -m state --state NEW --jump ACCEPT
问题1:为什么它需要是hexstring,简单的一个会更容易维护,但是一个不会字节,你能告诉我为什么吗?
问题2:通过TCPdump我可以看到,大部分答案都很小,因此需要列入白名单。 另外localhost(和我自己的一些服务器,我广泛的查询名称服务器(DNSFLOODRULES))DNS放大攻击是一个“大”的答案,我想限制的连续激增。问题是我无法得到' connbytes的部分工作,我一直在摸索它,也认为这应该是OUTPUT的艺术,因为它是关于答案的大小,而不是问题,我也试验了“允许无限的出站交通“的一部分,但这是可怕的错误。
你的想法和帮助非常感谢。
问题1:
该string不匹配,因为“。” 不包含在数据包中。 DNS数据包不包含“主机名”,而是包含“标签”。 在数据包中,域名的每个部分都是一个标签,以标签的字节数为前缀。
所以“isc.org”翻译成:
isc: 03 69 73 63 org: 03 6f 72 67
或者在数据包中:
03697363036f7267
每个标签限制为63个字节,全名限制为255个字节。
这在DNS RFC中解释:
http://tools.ietf.org/html/rfc1035#section-2.3.4
http://tools.ietf.org/html/rfc1035#section-4.1.2
问题2:
您需要启用net.netfilter.nf_conntrack_acct标志来使用conntrack选项(请参阅iptables联机帮助页)。 但是我不认为像这样使用它是明智的。 总会有合法的答案是大包。
也许你最好使用hashlimit扩展。 它已经提到:
https://lists.dns-oarc.net/pipermail/dns-operations/2012-October/009321.html