web-dev-qa-db-ja.com

iptables:DNS増幅攻撃の悪用に対するルールセットの構築

私は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の部分は機能します。これは質問ではなく回答のサイズであるため、出力の芸術であるべきだと考えて、かなりいじっています。「無制限のアウトバウンドを許可する」も試してみました。トラフィックの部分ですが、それはひどく間違っていました。

あなたの考えと助けは大歓迎です。

6
Tiffany Walker

質問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

1