iptablesでDNSクエリーを 引っ掛けてみた 其田 学 iptableとDNSといえば? u32module • パケットに対して、色々なマッチングパターン を書けるモジュール。 • 標準ライブラリなので、追加でインストールす る必要はない。 例:qname=isc.org.qtype=ANY iptables–mu32–u32\ 0>>22&0x3C@20&0xFFDFDFDF=0x03495343&& 0>>22&0x3C@24&0xFFDFDFDF=0x034f5247&& 0>>22&0x3C@28&0xFFFFFF00=0x0000FF00% U32モジュールの欠点 • ルールを作るのが難しい – ツールありますけどね。 – generate-neOilter-u32-dns-ruleとかで検索 • 静的なマッチングしかできない。 – QNAMEは可変長なので、決め打ちしたQNAMEし かマッチングできない。 – QNAMEの後にQTYPEが来るので、QTYPEだけの マッチングもできない。 作りました • iptables-ext-dns(xt_dns) – hYps://github.com/mimuret/iptables-ext-dns xt_dnsmodule – 主な機能 • DNSHeaderのflagbit系でのマッチング • QNAMEでのマッチング(後方一致有り) • QTYPEでマッチングが可能 • IPv4/IPv6,TCP/UDPに対応 – 動作環境 • Kernel2.6以降 使用例 • example.jpをマッチングする場合 iptables-AINPUT-mdns--qnameexample.jp ip6tables-AINPUT-mdns--qnameexample.jp 使用例 • $(randam).example.jpをマッチングする場合 iptables-AINPUT-mdns–rmatch--qnameexample.jp ip6tables-AINPUT-mdns–rmatch--qnameexample.jp 使用例 • QTYPEがANYのものをマッチング iptables-AINPUT-mdns–qtypeANY ip6tables-AINPUT-mdns--qtypeANY 使用例 • マッチングしたものは、iptablesのターゲットモ ジュールで処理できます。 – DROP,REJECT – LIMIT – MARK – LOG – などなど • 使い方いろいろ 想定している使用例 • DDoSに使用されているドメイン名をMARKして LVSを使って通常とは別のサーバへフォワード • ランダムサブドメイン攻撃を受けた時に、攻撃 を受けているドメイン名とゾーンの中にある最 大のドメイン名のサイズ以上でマッチングして DROP ちょっと構築してみた • LBの下にNSDとUnboundを置く • LBのiptablesでRDbitを見てMARKをつける。 • IpvsでNSDとUnboundを振り分ける。 NSD tester LB Unbound DEMO公開しました。 hYps://github.com/mimuret/iptables-ext-dns-demo 今後の開発予定 • dnsset(開発中) – ipsetのqname版 – xt_dnsは実はたくさんルール書くとQPSがガタ落ち します。 – dnssetは複数のQNAMEを木構造のデータベース に入れて、複数のマッチングをいっぺんにやって しまうコンセプトです。 今後の開発予定(ネタ編) • DNS(妄想中) – パケットの処理を行うモジュール – NOERRORとかREFUSEDとかDNS的に正しい responseを返したいなーと思ってます。 • DNSTAP(ネタ) – 行ってみただけ 今後の開発予定 • ご意見は下記のissueにお願いします。 hYps://github.com/mimuret/iptables-ext-dns • Pullreqもお待ちしてます。。。 • おしまい。
© Copyright 2024 Paperzz