bind9 patch

# bind9 パッチ

- 概要
- named
- リゾルバ
- dig/host/nslookup

## 概要

mDNkit では bind9 用のパッチファイルを提供しています。 このパッチを適用することにより、 bind9 において多言語ドメイン名を扱うことが可能になります。

具体的には、このパッチは bind9 に次のような機能を追加します。

- bind9 の DNS サーバ (named) において、ドメイン名をテキストに 変換する際にUTF-8 文字がそのまま通るようになります。
- bind9 のリゾルバ (lightweight resolver) の提供する名前解決用の API 関数に、ホスト名としてローカルエンコーディングで表現されたホスト名を 指定できるようになります。
- 同じく名前解決結果として、ローカルエンコーディングで表現された ホスト名が返されるようになります。
- dig、host、nslookup コマンドがローカルエンコーディングのドメイン名を 受け付け、また問い合わせ結果に含まれるドメイン名をローカルエンコーディングで 表示するようになります。

bind9 へのパッチの適用方法は、パッチファイルの先頭に記載してあります。 インストールガイドの bind9 用パッチの適用とインストールも ご覧ください。

## named

このパッチの適用により、DNS サーバである named に対して、 UTF-8 文字の透過機能が追加されます。

bind9 の named ではドメイン名の処理はほとんど8ビットスルーになって いるのですが、named 内のドメイン名の内部表現からテキスト表現への 変換部分は8ビットスルーになっておらず、ASCII 文字以外 はバックスラッシュでクォートされ、`\DDD` という形式の表現に 変換されてしまいます。

これは DNS プロトコル上で用いられるエンコーディングとして UTF-8 を 使用する場合に問題となります。

本パッチでは、変換しようとする文字がUTF-8 文字の 場合にはバックスラッシュによるクォートをせずそのまま透過させる機能を 追加しました。 この動作は named の設定ファイル (named.conf) で切り替えることができます。 デフォルトは互換性のため透過しない設定になっています。 もしDNS プロトコル上で用いるエンコーディングとして UTF-8 を用いる場合には、 設定ファイルの options セクションの `allow-utf8` パラメータを 次のように指定してください。

>     options {
>         ...
>         allow-utf8 yes;
>         ...
>     };

DNS プロトコル上で用いられるエンコーディングとして RACE 等の ASCII 互換エンコーディングを 使用する場合には、この設定は不要です。

## リゾルバ

bind9 のリゾルバは、bind8 までのものとは全く異なり、 lightweight resolver ライブラリと呼ばれるアプリケーションに リンクされるライブラリと、lightweight resolver デーモンと呼ばれる サーバから構成されています。

本パッチを適用することにより、このリゾルバに多言語ドメイン名の 処理機能が加わります。具体的には次のような機能が追加されます。

- 多言語ホスト名の指定
  リゾルバライブラリが提供する名前解決用の API 関数に対して、 ホスト名引数にローカルエンコーディングで表されたホスト名を指定することが できるようになります。 ローカルエンコーディングで入力されたこれらのドメイン名は 自動的に DNS プロトコル上で用いられるエンコーディングに変換され、 DNS サーバへの問い合わせが行われます。エンコーディングの変換の際には 同時に正規化も行われます。
- 多言語ドメイン名の返却
  リゾルバライブラリが提供する名前解決用の API 関数が、 名前解決結果のデータとしてローカルエンコーディングで表されたホスト名を 返すことができるようになります。

DNS プロトコル上で用いられるエンコーディングや使用する正規化方式の指定は あらかじめコンフィギュレーションファイルで設定しておきます。 このファイルの設定方法については mDNkit リゾルバのコンフィギュレーション をご覧ください。

以下に、パッチによって多言語化される名前解決用 API 関数の一覧を示します。 多言語化された API 関数は、従来の ASCII ドメイン名に加え、 非 ASCII ドメイン名を扱うことができます。

- lwres_getaddrinfo()
- lwres_getnameinfo()
- lwres_gethostbyname()
- lwres_gethostbyname2()
- lwres_gethostbyname_r()
- lwres_gethostbyaddr()
- lwres_gethostbyaddr_r()
- lwres_getipnodebyname()
- lwres_getipnodebyaddr()

引数の型や返り値の型に変更はありません。 パッチを当てる前と同様の呼び出し方法で、従来の ASCII ドメイン名と、 非 ASCII ドメイン名の両方を扱うことができます。

本パッチを適用した bind9 リゾルバは MDN ライブラリ を利用してエンコーディング 変換や正規化を行います。従って bind9 リゾルバを使用したクライアントを コンパイルする場合、MDN のライブラリ libmdn をリンクする必要が あります。もしあなたのシステムが iconv() をサポートしていない 場合には、iconv() のライブラリも合わせてリンクする必要があります。

## dig/host/nslookup

bind9 には DNS の問い合わせツールとして dig、host、nslookup という コマンドが付属します。bind9 パッチを適用することにより、これらはいずれも 多言語ドメイン名が扱えるようになります。具体的には以下の機能が 付加されます。

- 多言語ドメイン名の入力
  コマンド引数、あるいは標準入力で、ローカルエンコーディングで 表現された非 ASCII のドメイン名を指定することができるようになります。 ローカルエンコーディングで入力されたこれらのドメイン名は 自動的に DNS プロトコル上で用いられるエンコーディングに変換され、 DNS サーバへの問い合わせが行われます。エンコーディングの変換の際には 同時に正規化も行われます。
- 多言語ドメイン名の表示
  DNS サーバからの返答に含まれる多言語ドメイン名がローカルエンコーディングに 変換され、表示されるようになります。

DNS プロトコル上で用いられるエンコーディングや使用する正規化方式の指定は あらかじめコンフィギュレーションファイルで設定しておきます。 このファイルの設定方法については mDNkit リゾルバのコンフィギュレーション をご覧ください。