私はDNS増幅攻撃を検出してブロックするためのルールセットの構築に取り組んできました。
私は行き詰まり、ここで助けを見つけたいと思っています。
私が持っているもの(bashスクリプト、DNSに関係する部分)をここに投稿します:
IPTABLES='/sbin/iptables -v'
SERVERIP=a.b.c.d
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:なぜそれが16進文字列である必要があるのですか、プレーンなものは保守が簡単ですが、それはバイトしません、理由を教えてください。
質問2:TCPdumpを使用すると、ほとんどの回答が非常に小さいため、ホワイトリストに登録する必要があります。また、ローカルホスト(および私自身のサーバーのいくつかはネームサーバーに広範囲にクエリを実行します(DNSFLOODRULES)。DNS増幅攻撃は、制限したい「大きな」回答の継続的な急増です。問題は、「」を取得できないことです。 connbytesの部分は機能します。これは質問ではなく回答のサイズであるため、出力の芸術であるべきだと考えて、かなりいじっています。「無制限のアウトバウンドを許可する」も試してみました。トラフィックの部分ですが、それはひどく間違っていました。
あなたの考えと助けは大歓迎です。
質問1:
「。」のため、文字列が一致しません。パケットには含まれていません。 DNSパケットには、「ホスト名」自体は含まれていませんが、「ラベル」が含まれています。パケットでは、ドメイン名のすべての部分がラベルであり、ラベルのバイト数がプレフィックスとして付けられています。
したがって、「isc.org」は次のように解釈されます。
isc: 03 69 73 63
org: 03 6f 72 67
またはパケット内:
03697363036f7267
すべてのラベルは63バイトに制限されており、名前全体は255バイトに制限されています。
DNSRFCで説明されています。
http://tools.ietf.org/html/rfc1035#section-2.3.4
http://tools.ietf.org/html/rfc1035#section-4.1.2
質問2:
Conntrackオプションを使用するには、net.netfilter.nf_conntrack_acctフラグを有効にする必要があります(iptables
マンページを参照)。しかし、そのように使うのは賢明ではないと思います。大きなパケットである正当な答えが常にあります。
おそらく、hashlimit拡張機能を使用したほうがよいでしょう。それはすでに言及されました:
https://lists.dns-oarc.net/pipermail/dns-operations/2012-October/009321.html