mDNkit 仕様書
全体構成
キットを構成するコンポーネント
mDNkitは次のようなコンポーネントから構成されます。
MDNライブラリ
多言語ドメイン名の変換に関わる基本的な処理を実装したライブラリです。
- エンコーディング変換
- NAMEPREP
- ローカルマッピング
- DNSメッセージの解析と組み立て
という機能を提供します。 下記のコンポーネントはいずれもこのライブラリを使用して作られています。
また、これらの機能を用いてアプリケーションで多言語ドメイン名の変換を行うためのAPIを提供しています。 これは多言語ドメイン名の処理のアーキテクチャの提案であるIDNAに従ったもので、 このアーキテクチャではクライアントアプリケーション自身が、 多言語ドメイン名に対してNAMEPREPを実行し、 IDNエンコーディングに変換してからリゾルバを呼び出すことになっています。
mdnsproxy
DNSサーバのプロキシサーバとして動作し、 クライアントからのDNSメッセージをDNSサーバに中継し、 またDNSサーバから返されるDNSメッセージをクライアントに中継します。
クライアントから送られてきたDNSメッセージを中継する際には、 メッセージ中のドメイン名を、 クライアントの使用するローカルエンコーディングから、 多言語化されたDNSサーバの使用するエンコーディング (IDNエンコーディング) に変換するとともにNAMEPREPなどを行います。
またDNSサーバから返されたDNSメッセージを中継する際には、 メッセージ中のドメイン名を、 IDNエンコーディングからローカルエンコーディングに変換します。
mdnconv
ゾーンマスタファイルやnamed.conf
ファイルのエンコーディング変換用ツールです。
ローカルエンコーディングで記述されたこれらのファイルを、
多言語化されたDNSサーバが使用するIDNエンコーディングに変換し、
同時にNAMEPREPなども行います。
BIND 9パッチ
BIND 9で多言語ドメイン名を扱えるようにするためのパッチです。 このパッチを適用することにより、dig、 nslookup等のツールにエンコーディング変換やNAMEPREPの機能が付加され、 多言語ドメイン名を扱えるようになります。
runmdn
UNIXアプリケーションを再コンパイルすることなしに多言語ドメイン名を扱えるようにするためのコマンドです。 アプリケーションの実行時にMDNライブラリを動的にリンクすることによりアプリケーションにリンクされている名前解決用の関数に多言語ドメイン名のエンコーディング変換やNAMEPREPの機能が付加されます。 これによりmdnsproxyを使用することなく、 多言語ドメイン名が扱えるようになります。
mDN Wrapper
Windowsベースのアプリケーションで多言語ドメイン名を扱えるようにするための、 WINSOCKに対するWrapper DLLです。 通常、 WindowsアプリケーションはWINSOCKによってドメイン名を解決します。 mDN Wrapperは、WINSOCKの呼び出しをフックして、 多言語ドメイン名のエンコーディングの変換やNAMEPREPを行ないます。 同じようなことはdnsproxyでもできますが、 mDN Wrapperを使った場合には、 アプリケーション毎に異なったローカルエンコーディングを受付けることもできます。
8ビットスルーパッチ
dnsproxyを用いて多言語ドメイン名のエンコーディング変換や正規化等を行う場合、 DNSサーバやリゾルバライブラリにはこれらの機能は必要ありません。 ただしDNSプロトコル上のエンコーディングとしてUTF-8等の8ビットコードを使用する場合、 従来のDNSサーバは使用することができず、 8ビットコードをエラーにせずに通すような改造が必要です。
またローカルエンコーディングがSJIS等の8ビットコードを使用する場合、 やはりリゾルバライブラリにも8ビットコードをそのまま通し、 エラーにしないようにするための改造が必要です。
さらにアプリケーションの中には、独自にドメイン名の検査を行い、 8 ビットコードを通さないものがあります。
このため、本キットでは
- BIND 8のネームサーバ、リゾルバを8ビットスルーにするためのパッチ
- WebのキャッシュサーバであるSquidのURL解析部分を8ビットスルーにするためのパッチ
を提供します。 これらの8ビットスルーパッチに関しては特に仕様の記述は行いません。
コンポーネント構成図
各コンポーネントがどこでどのように使われるのかを示したのが次の2枚の図です。
1枚目はmdnsproxyを使用せず、 クライアントアプリケーションが名前変換用のAPIを使用して多言語ドメイン名の処理を行う場合や、 クライアント側のリゾルバで多言語ドメイン名の処理を行う場合の構成図です。
2枚目は多言語ドメイン名の処理をmdnsproxyを利用して行う場合の構成図です。
図中、イタリック体の部分が本キットに含まれるコンポーネントです。
図の上半分はSJISなど、 ローカルエンコーディングが使用される世界で、 下半分はRACEなど多言語化されたDNSが使用するIDNエンコーディングが使用される世界です。 本キットが提供するコンポーネントはこれらの世界をつなぐためのものです。