メンバー: 山本 和彦, 日比野 啓
カテゴリー: Underpinning
- 背景:DNSを取り巻く環境は常に変化しており、DNSプロトコルの検証に利用できる独自のDNSフルリゾルバが望まれている。
- 目的:IIJ独自のDNSフルリゾルバを実装する
概要
Haskellで bowline
というフルリゾルバを開発している。bowline
は、DNS over UDP、TCP、TLS、QUIC、HTTP/2 および HTTP/3 をサポートしている。
成果
- ソフトウェア: dnsext ライブラリ – フルリゾルバ
bowline
、コマンドツールdug
、ddrd
を含む - 暗号化されたDNSサーバの探索, IIJ エンジニアブログ, 2025
- SVCB RRでよく使われる3つのポイントを紹介, IIJ エンジニアブログ, 2025
- DNSフルリゾルバの実装への DNSSEC の組み込み – DNSSEC と反復検索, IIJ エンジニアブログ, 2024
- DNSフルリゾルバの実装への DNSSEC の組み込み – NSEC/NSEC3 による否定応答の証明, IIJ エンジニアブログ, 2024
- DNS検索コマンドdugの紹介, IIJ エンジニアブログ, 2024
進捗
2025FY2Qの進捗
- 機能拡張: local-data で SVCB 記述をサポートし、簡易的に DDR (RFC 9462) に対応した。またクライアント向けの TC bit に対応した
- 堅牢性: DoT、DoH のクライアント・セッション・スレッドの例外処理を強化することで堅牢性を向上した。また、GHC eventlog に対応し、アプリケーション、ランタイムに関わるデバッグ効率を向上した
- bowlineやdugのサイトを立ち上げ、ドキュメントを充実させた
2025FY1Qの進捗
dug
: サーバ証明書と指名関係を検証できるようにした。並列実行時に、再接続のための情報が正しく保存されるようにした。ddrd
: LinuxでDDR(Discovery of Designated Resolvers)を利用できるようにするためのデーモンを開発した。- パブリックリリース: サイトを立ち上げ、マニュアルを整備し、
dug
/ddrd
をリリースした。 - バグ修正: TXTレコードの解釈の誤りを修正した。
- 攻撃耐性: DNSメッセージエンコード時の、文字列長の桁溢れを検査し、圧縮回数を制限することで攻撃耐性を向上した。
- 拡張性: Tagless-Final方式により、ゾーンファイル/設定ファイルの解釈、反復検索記述ロジックの拡張性と再利用性を向上した。
2024FY4Qの進捗
bowline
の運用機能の拡充: 運用現場の要望に応えて、モニタのkeepalive化、NSID/id.server/version.serverの機能追加、ネガティブトラストアンカーの機能追加を行い、DNSSEC検証結果のカウンタを実現してmetricsへの追加を行った。bowline
の安定化: TCP53のVirtual Circuitのサーバーのバッファ管理の問題を修正することにより、通信の安定性を向上させた。また、設定ファイル解釈を事前に行うことで、reload失敗時もサービスを継続できるよう安定化させた。さらに、root権限が必要な処理の分離し、必要なときのみ root 権限を回復する方式によって、reload機能とユーザー変更機能の競合を解消した。
2024FY3Qの進捗
bowline
の可用性の改善: 反復検索において、すべての NS に対してフォールバックを行ない、解決できる場合を増やした。その際、権威サーバへの攻撃とならないようにするために、反復検索内のクエリ回数を制限した- 不具合修正: テストで発見された次の問題を修正した。応答用のエラーコード読み替え、NSEC/NSEC3 レコードのキャッシュ、応答 AD flag の対応
2024FY2Qの進捗
bowline
の通信安定性の改善: 中間のNATが頻繁にポートを変更する環境でも、リゾルバと安定した通信を可能としたbowline
の運用機能の改善: 提供するメトリックス情報を強化したbowline
の安定性の改善: STM(Software Transactional Memory) のトランザクションを用いてクライアント向けのセッション状態の決定性を向上したことにより、リソース管理を明確化した. また、ランダムテストにより、セッション状態管理用 STMトランザクションの頑健性を向上したdug
のリリースと紹介記事:dug
を紹介するIIJエンジニアブログを書いた。それに合わせて、dug
を複数回リリースした
2024FY1Qの進捗
bowline
の改善: 評価中に発見した問題を解決し、またCheckDisabledフラグ、キャッシュの削除など新たな要望に対応したdug
の改善: TLS、QUIC、HTTP/2、HTTP/3でセッションの再開と0-RTTができるようになった。また、QUIC や TLS のハンドシェークモードなどの情報を出力の最後に表示するように変更した。NSEC/NSEC3 の検証情報出力を強化した
2023FY4Qの進捗
- パイプラインのテスト:
dug
コマンドに対して、DNS over TLS/QUIC/H2/H3のパイプライン機能を組み込んだことにより、フルリゾルバbowline
のパイプライン機能がテストできるようになった - ローカルゾーンデータ対応: ゾーンデータの解釈によって、ローカルゾーンおよび、ルートヒント、トラストアンカーが定義できるようになった。
- 脆弱性対策: 入力サイズおよび検証回数の制限によって、KeyTrap攻撃に対する計算量を低減できるようになった
2023FY3Qの進捗
- 下位ライブラリTLS、HTTP/2、QUICの安全性の向上
- 入れ子反復検索キャッシュと否定キャッシュの条件緩和による応答入れ子反復検索キャッシュと否定キャッシュの条件緩和による応答性能の向上
2023FY2Qの進捗
- キャッシュサーバのテスト運用に向けた機能強化
- トランスポート層の拡充 (TLS、QUIC、HTTP2、HTTP3)
- DNSTAPを使ったロギング機能の実装
- サーバー管理のためのWeb APIの実装
- 監視のための Prometheus へ対応
- 否定応答の DNSSEC 検証機能 (NSEC/NSEC3) の組み込み
- 反復検索およびDNSSEC の問題の修正
- 必要のない DS クエリを発行しないよう修正
- RRセット正規化の問題の修正 (TTL復元、正規順序)
2023FY1Qの進捗
- 開発中のフルリゾルバ実装への DNSSEC 検証機能の組み込み
- 反復検索時の委任情報の暗号鍵の署名(DS)検証機能
- 結果レコードの署名(RRSIG)検証機能
- 親子ゾーン同居ケースのフォールバック機能(“.” と “arpa.” 等)
- 検証結果(成功、失敗、検証無し)のログ出力
- デモを目標とした機能強化
- SVCBからトランスポート(QUIC、TLS、H2、H3)を選択し、それを使って名前解決
- フルリゾルバの動作(反復検索)の可視化
- DNSSECの結果をカラーで表示
- Open Houseで使用
2022FY4Qの進捗
- DoX(DNS over HTTP/2, HTTP/3, TLS, QUIC) の実装
- SVCB RRに従ったDoXの自動選択
- Power Safe なキャッシュ失効化と読み取り効率の両立
- DNSSEC 検証付き root-priming
2022FY3Qの進捗
- 拡張可能DNSライブラリの開発を継続
- HTTPS RR、SVCB RRの実装
- DNS over HTTP2/HTTP3、DNS over TLS、DNS over QUICの実装
- ドメイン用のデータ型の洗練化
- 既知の攻撃に対する耐性を確認
- DNSSEC の基本的な検証機能をDNSライブラリに追加
- 暗号鍵 (DNSKEY RR) の検証 (DS RR)
- リソースレコードの検証 (RRSIG RR)
- ドメイン不在証明 (NSEC3 RR、NSEC RR)
2022FY2Qの進捗
- 実用性を高めるための調整
- unbound等、既存の実装との互換性の検証と修正
- 並列実行性能の検証
- DNSキャッシュサーバの機能拡張
- キャッシュヒット率の計測機能
- DNSSECの検証機能の追加のための調査
- DNSライブラリの再実装
- コアライブラリの変更なしでリソースレコード(RR)を拡張可能
- 今後 SVCB RR と HTTPS を拡張する予定
- 長期間RRをキャッシュしてもメモリの断片化を起こさない
- コアライブラリの変更なしでリソースレコード(RR)を拡張可能
2022FY1Qの進捗
- DNSキャッシュサーバの開発
- 反復検索機能とキャッシュ機能をサーバー化
- ネガティブキャッシュを RFC2308 を参考に実装
- 実用性を高めるための調整
- スレッドまわりの整理
- キャッシュのサイズが破綻しないように制限