Hickory DNSで始める自作DNSフォワーダ Ibaraki.dev #14 もくもく会
自己紹介 • @jyuch • 自称ソフトウェアエンジニア • 最近はデータエンジニアっぽいことをしている 2
アジェンダ 1. DNSのしくみのおさらい 2. Hickory DNSの紹介 3. Hickory DNSのいいところ・わるいところ 3
DNSのしくみのおさらい 4
通信の流れ ① www.example.comのIPアドレスを教えて ② アドレスは203.0.113.1です DNSサーバ ③ Webサーバにアクセス Webサーバ 5
通信の流れ サーバへのアクセスに先行してDNS問い合わせが実行される DNS応答を通してネットワークアクセスを制御できる • ロードバランシング • ランダム・レイテンシ・地理的近接に振り分ける • コンテンツ・違法サイトのフィルタリング • ポリシーに従ってアクセスを遮断 • セキュリティ • C&Cサーバへのアクセスを検知・遮断 6
DNS問い合わせの流れ 管理を委任している サーバを応答する 受け取ったリクエストを フルリゾルバに転送する ルートネームサーバから 順に問い合わせる フォワーダ (宅内ルータなど) フルリゾルバ ルートネームサーバ 権威DNSサーバ 問い合わせに回答する 権威DNSサーバ 7
DNS問い合わせのインターセプト フォワーダで問い合わせをインターセプトすれば、アクセスしてほしくない サイトへのアクセスを阻止できる そのドメインは存在しないっぽいですね(嘘) フォワーダ ルートネームサーバ フルリゾルバ 権威DNSサーバ アクセスしてほしくないドメイン へのリクエストを捨てる 権威DNSサーバ 8
Hickory DNSの紹介 9
Hickory DNSの紹介 • Rustで実装されているDNSライブラリ • 機能ごとにクレートで分割されている https://hickory-dns.org/ 10
Hickory DNSを使ったフィルタの実装 フォワーダ Rustの非同期ランタイム Server クレート Tokioランタイム フィルタ ロジック リクエストをフルリゾルバ に転送する Client クレート フルリゾルバ リストを参照してフィルタ Webフレームワークのように ハンドラを書くだけ アクセス拒否リスト 11
Hickory DNSのいいところ・わるいところ 12
Hickory DNSのいいところ • Rustで書ける • Rustでアプリケーションを書くのは全人類の願望のはず • Rustのメリットを簡単に享受できる • シングルバイナリ • 複数のOS向けにビルドできる • メモリセーフ • GCがない • メモリフットプリントが小さい • 動作が軽い 13
Hickory DNSのいいところ • Tokioランタイム(非同期ランタイム)で動作する • Tokioランタイムにおんぶにだっこで非同期サーバが書ける • smolは未サポート(RuntimeProviderを実装すればワンチャン?) • DNSを抽象的に扱える • ペイロードのレイアウトなどは気にしなくてもよい • 構造体に詰めればあとはよしなにしてくれる 14
Hickory DNSのわるいところ • ドキュメントがほとんどない • 使い方を解説しているブログもほとんどない • ソースコードを読んで使い方を調べる必要がある • APIの互換性を破壊する変更が入る事が稀にある • まだメジャーリリースはされてない • 今のところ軽微な修正で済んでいる • リクエストログは自分で作りこむ必要がある • DNS Tapが簡単に扱える機能があるとすごいうれしい(願望) 15
Hickory DNSのわるいところ 16
Hickory DNSのわるいところ … 遣強 ういあ な型ま よをり コ 通ン らパ なイ いル が ※ コンプライアンス愛染様 17
Hickory DNSのわるいところ • 面妖なシグネチャが頻出する • ライフタイム修飾子・型パラメータ • 非同期を前提としているのも難解さを加速させている • 型パズルがしんどい • Rustで書く必要がある • やっぱりRustは難しい 18
まとめ • DNSを制する者は通信を制する • Hickory DNSを使えば簡単にDNSフォワーダが書ける • やっぱりRustは難しい・・・ 19