iptablesでDNSクエリーを 引っ掛けてみた

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もお待ちしてます。。。
•  おしまい。