Unbound,知ってる? この先10年を見据えたDNS
第1回 5分でわかるUnbound
本特集では,次世代DNSサーバソフトウェア「Unbound」にフォーカスし,機能や特徴を解説しながら,実際の運用ノウハウについてお届けします。第1回目はUnboundの基礎知識について解説します。
Unboundの概要
UnboundはBINDの代替を目指したDNSキャッシュサーバです。2008年5月20日に正式版1.0がリリースされました。オープンソースのソフトウェアとして公開されており,ライセンスはBSDライセンスです。
UnboundはNLnet Labsにより開発と保守が行われています。UnboundはVerisign labs,Nominet,Kirei,ep.netによりJavaで開発したプロトタイプを,NLnet LabsがCで実装し直したものです。ちなみに,NLnet Labsはルートサーバとしても利用されているDNSコンテンツサーバのNSDも開発しています。リリースされたばかりのソフトウェアでありますが,実績のある組織や技術者が開発を行っているため,十分に信頼性はあります。
UnboundはDNSキャッシュサーバとしてはフルスペックであるため,BINDを置き換えることができます。しかし,DNSコンテンツサーバとしては機能しないので,BINDを完全に置き換えることはできません。しかし,後述するようにDNSキャッシュサーバとDNSコンテンツサーバの役割は異なるため,この割り切りは良いでしょう。
Unboundの位置付けをはっきりさせるために,本題に入る前にDNSサーバについて簡単に復習してみましょう。
DNSコンテンツサーバとDNSキャッシュサーバ
DNSサーバには役割に応じてDNSコンテンツサーバとDNSキャッシュサーバという2つの種類のサーバがあります。
DNSコンテンツサーバは権威サーバとも呼ばれ,自身が権威を持っているゾーンに対する問い合わせのみに回答します。外部に対して公開するサーバです。
DNSキャッシュサーバとはフルリゾルバとも呼ばれ,ユーザプログラムからの再帰問い合わせの要求に応じて,DNSコンテンツサーバに問い合わせを行い,受け取った回答をユーザプログラムに返します。内部に対してのみ公開するサーバです。UnboundはこのDNSキャッシュサーバとして機能します。
これらのサーバの関係は図1のようになります。
BINDは両方の機能を持っているため,この機能の役割の違いを意識せずに利用しているケースも見られます。DNSコンテンツサーバの公開と同時に,DNSキャッシュサーバを外部に対して公開してしまっているサーバもあり,DNSキャッシュ汚染の攻撃にさらされる羽目になります。
DNSコンテンツサーバとDNSキャッシュサーバは役割も設置すべき場所も異なるため,もし同じように考えていたら,分離することを検討してみてください。その際にDNSキャッシュサーバにUnboundを使うことも検討してみてください。
Unboundの特徴
Unboundの特徴について紹介します。
DNSキャッシュサーバ
先ほど説明したように,再帰問い合わせを行うDNSキャッシュサーバとして動作します。
DNSSECサポート
UnboundはDNSプロトコルのセキュリティ拡張であるDNSSECをサポートしています。オープンソースのDNSキャッシュサーバでDNSSECをサポートしているのはBINDとUnboundだけです。
キャッシュ汚染に対する耐性
DNSキャッシュ汚染に対する根本的な解決方法はDNSSECを使用して問い合わせの結果に対してデジタル署名の検証を行うことです。しかし,現状ではDNSSECは普及していませんので現実的には利用できません。このようなことは初めからわかっているため,Unboundは次のような機能を持つことで,キャッシュ汚染に対する耐性を強めています。
- 問い合わせの回答に対するサニタイジング
- 暗号学的に強いランダム性を持つ問い合わせIDの利用
- 暗号学的に強いランダム性を持つソースポート番号の利用
- ランダムなデスティネーションアドレスの利用
- ランダムなソースアドレスの利用
そのため,2008年8月に発表されたDan Kaminsky氏による攻撃方法に対しても,キャッシュ汚染対策を理由(※1)にUnboundをアップデートする必要はありませんでした。
- ※1)
- 同時期にバグフィックスのためのアップデートはありました。
セキュリティ
セキュリティに関しては次のような特徴を持っています。
- デフォルトでchrootで動作します。
- デフォルトで一般ユーザ権限に落として動作します。
- 再帰問い合わせを要求するクライアントに対してアクセス制御できます。
- version.bindやhostname.bindの内容を変更したり,問い合わせをブロックしたりすることができます。
さらに,ソースコードを読みやすく記述し,ドキュメント化を行うことにより,コードレビューをしやすくしています。これはセキュリティホールの混入を防ぐための良い工夫です。
性能
詳細なメモリ管理ができ,マルチスレッドにも対応して,スケーラブルです。
BINDより処理性能が良いです。参考までにUnboundの開発者であるWouter Wijngaards氏がRIPE 56 Meetingで発表した資料によると,UnboundはBINDの2~3倍の処理性能をたたき出しています。
使いやすさ
設定ファイルの形式は非常に単純であり,「パラメータ名: 設定値」のように記述します。設定ファイルunbound.confの例を次に示します。
server:
interface: 0.0.0.0 ←バインドするインターフェースの指定
access-control: 192.168.0.0/24 allow ←アクセス制御
do-ip6: no ←IPv6での転送ができない場合
デフォルトではlocalhostからのみのアクセスしかできません。そのため,この例ではアクセス許可の追加を記述しています。なお,デフォルトの設定が安全側に倒れているため,ほぼデフォルトのままで利用できます。
IPv4/IPv6デュアルスタック対応
IPv4とIPv6の両方に対応しており,設定ファイルで必要に応じて無効にすることもできます。
簡易的なコンテンツサーバ
簡易的なコンテンツサーバとしての機能を持ち,LAN内のホストの名前の解決などに利用できます。
他のDNSサーバとの連携
スタブゾーンの設定により,特定のゾーンに対して,指定したDNSコンテンツサーバに問い合わせを行うようにすることができます。フォワードゾーンの設定により,特定のゾーンに対して,指定したDNSキャッシュサーバに再帰問い合わせを行うようにすることができます。
BINDとの違い
Unboundの特徴で述べたこと以外で,BINDとの大きな違いがある点をここで紹介します。
設定ファイルの形式
設定ファイルの形式は「パラメータ名: 設定値」という単純な形式であり,BINDのように括弧「{ }」の対応で警告が出たり,セミコロン「;」を付け忘れて警告が出たりしません。
loopbackアドレスの名前解決
localhostの正引きや127.0.0.1や::1の逆引きのゾーンをデフォルトで持っています。そのため,BINDのようにゾーンファイルを記述する必要はありません。
プライベートアドレスの逆引き
プライベートアドレスやリンクローカルアドレスなどの逆引きの問い合わせをインターネットに対して行うことは非常に無駄であり迷惑です。
Unboundはこのような逆引きの問い合わせに対してはNXDOMAIN(情報なし)を返し,インターネットに無駄な問い合わせを行いません。BINDでは明示的にゾーンの設定を行う必要があります。
DNSラウンドロビン
簡易的な負荷分散の方法としてDNSラウンドロビンというものがあります。1つのドメイン名に対して複数のホストのIPアドレスを割り当て,さらに,DNSコンテンツサーバがそのドメイン名の問い合わせに対して複数のIPアドレスを毎回並び替えて回答します。クライアントは複数のIPアドレスの回答に対して1番目の回答を利用する傾向にあるため,結果として負荷分散になります。
BINDはキャッシュした内容を毎回異なる順番で結果を返すため,DNSラウンドロビンに対応できます。しかし,Unboundはキャッシュした内容を毎回同じ順番で結果を返すため,DNSラウンドロビンに対応できません。しかし,DNSラウンドロビンを運用しているサイトではTTLを短めに設定していることが多いため,実際にはそれほど問題にはならないでしょう。
まとめ
今回はUnboundの概要について紹介しました。お読みいただいたように,DNSキャッシュサーバとしてはフルスペックの機能を持っており,BINDの代わりに利用することができます。
次回は新規導入の方法を紹介します。

