DNS Summer Day 2017

本記事は、DNS Summer Day 2017で発表した内容を記事として書き起こし、加筆修正したものです。

XACK DNSの概要

当社がフルスクラッチで自社開発をした、UNIX系OSで動作する純国産DNSサーバーです。

  • 主な機能
    • 権威サーバー(マスター、スレーブ)
    • フルサービスリゾルバー(キャッシュサーバー)
    • フォワーダー
    • 日本語GUI&CLI
    • ゾーンファイル編集機能
    • 内外同居連携機能(Swing機能)
    • DNSSEC 他

XACK DNSの特徴

特徴① 純国産フルスクラッチ自社開発

  • C++で開発
  • 自社開発ライブラリー
    • OS、C/C++標準ライブラリー及びSTL以外はすべて自社開発)
      • XTL (XACK Template Library)
        • DSO (Dynamic Shared Object Library)
        • TLS (Transport Layer Security Library)
      • BIND、OpenSSL等OSS実装固有の脆弱性の影響なし
  • マニュアル、電話、メールなどすべて日本語対応

特徴② 高性能・大容量・高信頼

  • 応答性能190,000~420,000qps
    • ハードウェア環境に応じて異なります。
  • レコード数最大10億件
    • 実装メモリーに応じて異なります。
    • 最大256GBまで対応できます。
    • 起動時間はレコード数400万件で18秒
  • マルチコアCPUを有効活用するアーキテクチャ
  • 独自インメモリDB

特徴③ DSOモジュールによる機能ブロック化

  • ログモジュール (log)
  • 受信制限モジュール (client、limitation)
  • 権威モジュール (master、slave、local)
  • キャッシュモジュール (cache)
  • フォワーダーモジュール (forwarder)
  • ゾーンモジュール (rfc1035、binary)
  • その他 (statistics、filter、rate、policy)
【ISC BINDの場合】

  • namedに全機能が実装
  • 権威サーバー、キャッシュサーバーとして使うかは設定で変更
  • 「XXX機能を有効にしていない場合でも、本脆弱性の影響を受けます。」

【Unbound、NSDの場合】

  • 権威サーバーとキャッシュサーバーでバイナリーは分離
  • それぞれのサーバー内の機能は全機能が実装
  • コンパイルオプションで機能を無効にできたりはする

【XACK DNSの場合】

  • 機能をモジュール化することで必要な機能のみがロードされる
  • 設定で変更可能で再コンパイル不要

XACK DNSのプロセス構成

  • 制御プロセス
    • 起動、設定ファイルの更新、キャッシュの更新等
  • ログプロセス
  • マスタープロセス (複数可)
    • UDPの受信処理、TCPの接続処理
  • ワーカープロセス (複数可)
    • 名前データベースの検索、応答の作成と送信
    • ノンプリエンプティブな複数スレッドにより処理

XACK DNSの名前データベース

  • ドメイン名をハッシュと二分木で管理
    • murmur64ハッシュ、AVL木
  • 64ビット環境に最適化
    • 二分木のリンク等で64ビットポインターの代わりに32ビットインデックス値を使用
  • ドメイン名の重層化
    • ルートヒントとルートサーバーからの応答
    • 委譲元と委譲先のNSレコード

XACK DNSの構成例

・設定ファイル dnsd.conf

【キャッシュサーバーとして使用する例】
【権威サーバーとして使用する例】

BINDからの移行機能

ビュー機能

  • -INDのVIEWのような機能
    • クライアントアドレスで振り分け(match-clients相当)
    • サーバーアドレスで振り分け(match-destinations相当)
    • RDフラグで振り分け(match-recursive-only)
      • RDフラグなしの場合のみに振り分けることも可能
    • QNAMEで振り分け(BINDにはない…ハズ)
      • 複数マッチする場合は最長一致が優先
  • 実態としては仮想サーバー機能
  • BINDではできなさそうで、XACK DNSならできること(やりたいかは別として)
    • 特定ゾーンのみ別キャッシュサーバーにする。
      • 大事なゾーン(例えばjpとか)の設定値を変えて動作可能
  • キャッシュサーバーでRDフラグがない場合に何等かのペナルティーを与える。
    • match-recursive-only yesのVIEWを前段に置くことでBINDでもできないこともないがVIEWの数によっては組み合わせが爆発的になるかも。

外部NS名Notify送信機能

設定ファイル変換ツール

DNS開発メモ

あーんな事やこんな事。。。

  • ゾーンファイル対応
    • レコード先頭に「#」
      • コメントを意図してる?
    • レコード先頭に「//」
      • C++?
    • シブリンググルー
      • 実装の対応が大変
  • 変な権威DNSサーバーの存在
    • AAAAを問い合わせているのにA応答
      • 何故か他のRTYPEにはNODATAを返す
    • Aに応答するがAAAAにはNXDomain応答
      • AAAAフィルター?
    • IPv4アドレスではAを応答してIPv6アドレスではAAAAを応答
      • 何か勘違いしている?
    • Queryを書き換えた応答をしてくる権威
      • やめて
    • CNAMEがゾーン頂点
    • CNAMEが他レコードと共存
    • CNAMEが複数
      • むしろ設定できる実装の詳細が気になります
    • キャッシュっぽい挙動をしてる権威
      • もはや権威ではない
    • NXDomainだが回答は付けてくる権威
      • 何故そうなった
    • EDNS0付だと壊れた応答をしてくる権威
      • AnswerにOPTレコードが、Additionalに回答が入る。
    • CLASSをANYで問い合わせるとANYで応答
      • 受けたQCLASSをそのまま使っている様子
    • NSレコードのRDATAが『localhost.』
      • ADDITIONALに『localhost. IN A 127.0.0.1』
    • より深いゾーンの権威応答を返してくる
      • やはり実装が気になる。
    • 権威サーバーガチャ
      • 再帰問合せ先によっては絶対に解決できない袋小路
    • 2000個以上のPTRレコード応答
      • 仕様の範疇ではありますが
    • 俺はルートサーバーだ
      • 違います

XACK DNSのロードマップ


XACK製品一覧



課題抽出やどの製品を選定すればよいかの整理からご相談ください

システムの新規構築や更改にお悩みのお客様もお待ちしています。
現状の課題抽出や要件の整理、解決に導くための機能紹介やシステム
構成まで、アプライアンス・ソフトウェア問わずご提案します。