# DNSサーバの設定

ここでは、DNSサーバで国際化ドメイン名を扱う場合の手順や注意点について 述べています。

- はじめに
- DNSサーバの設定ファイルやゾーンファイルの変換

## はじめに

DNSサーバで国際化ドメイン名を扱う方法について、解説します。 とはいえ、従来のASCIIドメイン名の場合の設定方法と大きく変わるわけでは ありません。 ただ一つ注意すべき点は 「ゾーンファイルやDNSサーバの設定ファイルのエンコーディングを 変換する必要がある」 ということです。

## DNSサーバの設定ファイルやゾーンファイルの変換

「国際化ドメイン名とは」で記したように、 国際化ドメイン名は実際にはUTF-8などのエンコーディングで直接表現される のではなく、PunycodeというASCIIと互換な表現形式を用います。 DNSサーバも同様で、設定ファイルやゾーンファイルに直接UTF-8で国際化 ドメイン名を書いても認識しません。 Punycodeに変換したファイルを用意して、それを読み込ませる必要があります。

DNSサーバで国際化ドメイン名の設定を行う上で必要となるのは、この 「Punycodeに変換したファイル」を用意することです。 もちろん、ゾーンファイルにPunycodeで直接

>     ; こんにちは.example.jp
>     xn--28j2a3ar1p.example.jp. IN CNAME server.example.jp.

のように書ければ苦労はありませんが、これを手作業で行うのは大変です。 idnkit付属のidnconv2という変換ツールを使うと、ファイルを簡単に Punycodeへ変換することができます。 たとえば、BIND 9の設定ファイル (`named.conf`) をUTF-8で 直接次のように記述したとします。

>     options {
>      directory "/etc/namedb";
>     };
>     zone "привет.jp" {
>      type master;
>      file "example.jp.zone";
>     };
>     zone "мир.jp" {
>      type master;
>      file "example.jp.zone";
>     };

この設定ファイルの名前を`named.conf.utf8`とすると、 次のコマンドを実行することで、Punycodeに変換したファイル `named.conf.puny`が生成されます。 必要に応じて、`-in` オプションで入力テキストの エンコーディングを指定します。

> `% idnconv2 -in UTF-8 named.conf.utf8 > named.conf.puny`

変換後のファイルを見てみると、国際化ドメイン名の部分がPunycodeで 置き換わっているのが分かります。

>     options {
>      directory "/etc/namedb";
>     };
>     zone "xn--b1agh1afp.jp" {
>      type master;
>      file "example.jp.zone";
>     };
>     zone "xn--h1ahn.jp" {
>      type master;
>      file "example.jp.zone";
>     };

このようにidnconv2は、国際化ドメイン名の箇所だけを抜き出してPunycode に変換します。 ただし、ASCII以外の文字でファイル内にコメントを記すと、誤って変換して しまうことがありますので、注意して下さい。 上記は設定ファイルの変換例でしたが、ゾーンファイルについても同様の 手順で変換できます。

また大抵の場合は、Punycodeからのデコード (逆変換) も可能です。

> `% idnconv2 -reverse -out UTF-8 named.conf.puny > named.conf.utf8_2`

`-reverse` オプションで、逆変換を指示しています。 しかし残念ながら、必ず元のUTF-8ファイルに戻せる保証はありません。 これは、入力された文字列の中でPunycodeを用いて表記されている箇所と そうでない通常のASCII表記の箇所を、厳密に区別することはできないため です。

> 逆変換では必ず元に戻せるとは限らないため、 変換が済んだ後も元のUTF-8ファイルは保管しておくことをお薦めします。

idnconv2の使い方の詳細については、 「idnconv2コマンドの使用方法」をご覧下さい。

最後に、変換の手間を極力減らす方法を紹介します。 たとえばUTF-8版のファイル名の末尾には`.utf8`、Punycode エンコーディング版に`.puny`をそれぞれ付けるものとします。

次のようなMakefileを用意します。 ただし、「`TARGETS = ...`」の部分に、実際に変換したいファイル を書き並べます。ファイル名同士は空白で区切ります。 もしUTF-8ではなく、他のエンコーディングでファイルを記述した場合は、 「`LOCALCODE = ...`」の部分も適宜書き換えて下さい。

>     LOCALCODE = UTF-8
>     TARGETS = named.conf.puny

>     .SUFFIXES: .utf8 .puny

>     .utf8.puny:
>      rm -f $@
>      idnconv -in $(LOCALCODE) $< > $@

>     all: $(TARGETS)

UTF-8版のファイルの更新が終わったら、makeコマンドを実行します。

> `% make`

これにより、更新されたUTF-8ファイルすべてについて、Punycode版の ファイルが再作成 (ないし新規作成) されます。