DNS Proxy Server のコンフィギュレーション
DNS Proxy Server dnsproxyを使うには、 いくつかの情報を設定する必要があります。 ここでは、これらの情報の設定方法と意味とを説明します。
コンフィギュレーションファイル
設定情報はコンフィギュレーションファイルに記載されます。 コンフィギュレーションファイルは、 dnsproxyの起動時にコマンドラインで指示することができます。
コマンドラインで指示しなかった場合には デフォルトのコンフィギュレーションファイルが使用されます。 デフォルトのコンフィギュレーションファイルは、ディレクトリ% dnsproxy -config <config-file>
/usr/local/etcの下の
dnsproxy.confです。ディレクトリは、mDNkit作成時に
configure --sysconfdir=DIRで指示することもできます。 詳しくは、インストールガイドの configure 実行の ところをご覧ください。
コンフィギュレーションデータ
コンフィギュレーションファイルはテキストファイルで、 以下のコンフィギュレーションデータを指定します。
- listen
-
dnsproxyがクライアントからの要求を受付ける ネットワークアドレス、ポート番号を指定します。
listen <address>
<address>は以下のいずれかの形式で指示します。<IP address>:<port number> :<port number> <IP address> IP address 0.0.0.0 # INADDR_ANY port number 53 dnsproxy経由でDNSサーバを使用するクライアントは、 ここで指示したアドレス、ポートをDNSサーバとして設定します。 クライアント側ではポート番号を変更できないものが多いので ポート番号はデフォルトの53をそのまま使った方がよいでしょう。
- allow-access
-
クライアントの IP アドレスに基づくアクセス制限を設定し、dnsproxy に 接続可能なクライアントを制限します。
allow-acccess <where>
<where>は次のいずれかの形式で指定します。<IP address> <IP address>/<prefix-length> allow-access 192.168.0.0/16
と指定すると、アドレスの上位16ビット (プリフィックス) が 192.168 で あるホストからの接続を許可します。このエントリは複数指定することが可能で、複数指定した場合にはそのいずれか 1つでもマッチすれば接続が許可されます。
このエントリを指定しなかった場合にはすべてのホストからの接続が許可されます。
- forward
-
dnsproxyが、DNS要求を転送し、応答を受け取る本来のDNSサーバの ネットワークアドレス、ポート番号を指定します。
forward <address> [ bind4compat ]
<address>の形式は上のlistenのものと同じです。オプションの bind4compatが指示された場合には、 UDPでリクエストを転送する時に、ソースアドレスとして、 listenで指示されたアドレス/ポートを使用します。 これはbind4にある機能で、UDPポートについての アクセス制限下で運用することを想定したものです。 このオプションが指示されなかった場合には、 1024以上のソースポートが使用されます。
- log-file
-
dnsproxyが実行ログを出力するファイル名を指定します。
log-file <path>
ログファイル名は、 以下のコマンドラインオプションで指定することもできます。 両方指定した場合にはコマンドラインオプションの指定のほうが優先されます。dnsproxy -logfile <address>
指定されなかった場合には、/tmp/dnsproxy.log
に書き込まれます。 ただし、/tmp は誰でもファイルを作ることができるので、 シンボリックリンクの悪用などにより思わぬ被害を受ける可能性もあります。 複数人で使うマシンで dnsproxy を動作させる場合、ログファイルの ディレクトリを /tmp にするのは避けたほうがよいでしょう。なお、実行ログは常に追記されていきますので、 適当な時を見計らって消すことをお勧めします。
また、dnsproxy にハングアップシグナル (SIGHUP) を送ると いったんログファイルを閉じて、再度オープンするようになっています。 ログファイルをアーカイブする場合に便利な機能です。
- log-level
-
ログのレベルを設定します。
log-level <level>
レベルとして指定できる値は次の通りです。- none
- 一切ログを記録しません。ログがないと不具合が生じた場合の 原因解明が難しくなりますので、できればこのレベルは指定しないでください。
- fatal
- 致命的なエラーが生じたときにのみログを出力します。
- warn
- 警告メッセージにもログに記録します。これがログレベルを 指定しなかったときのデフォルトです。
- trace
- 実行トレースメッセージもログに出力します。 このレベルを指定すると dnsproxy の動作がかなり詳細に記録されるので 障害が発生した場合の原因究明には便利ですが、大量のログが出力されるので 普段は指定しない方がよいでしょう。
- log-on-denied
-
allow-access で設定した アクセス制限によって接続を拒否した場合に、それをログに記録するかどうかを 指定します。
log-on-denied <yes-or-no>
指定できる値は yes または no です。 yes を指定した場合には接続拒否記録がログに残されます。 - client-translation
-
クライアント側でのドメイン名のエンコーディングを指示します。
client-translation <ZLD> <Encoding>
多言語ドメイン名に対応していないクライアントの場合には、 通常、クライアントのローカルエンコーディングになっています。 そのような場合にはclient-translation . Shift_JIS
という形で、<ZLD>無しで指示します。多言語ドメイン名の手法によっては、 クライアント側で多言語ドメイン名を通常のDNSでも 受付けられる形式にエンコードして、それを通常のドメイン名と 区別するために ZLD (Zero Level Domain) を付加するものがあります。 そのような場合には、付加されるZLDとその時のドメイン名の エンコーディング方法とを対応付けることにより、 他の多言語ドメイン名手法のDNSサーバを利用することが できるようになります。
client-translation .i-dns.net UTF-5
クライアント側のドメイン名のエンコーディングは、 ZLD が異なっていれば、複数指定することができます。なお、mDNkit のデフォルトの設定では ZLD の指定はできないように なっています。ZLD を使用するためには、mDNkit のコンパイルの際、 configure コマンドに --enable-zld を指定する必要があります。 この指定をせずに mDNkit をコンパイルした場合には、ZLD の指定は すべて無視されます。
クライアントから送られてきたDNS要求のドメイン名は、 ここで指示したエンコーディングから、内部的に使用される UTF-8エンコーディングに変換されます。 そして、後述の正規化、サーバ側エンコーディングへの変換が 行なわれてDNSサーバに送出されます。また、DNSサーバからの 応答は、逆に元のエンコデーィングに戻されてクライアントに 返されます。
ここで指定可能なエンコーディング名は、mDNkit付属のlibmdnおよび 使用するiconv ライブラリに依存します。 iconv ライブラリによって、エンコーディング名が異なっている ことがありますので、ライブラリのマニュアルをご覧になって 使用可能なエンコーディング名を確認してください。 付属のlibmdnでは、iconvが提供するエンコーディングの他に、 多言語化DNS用に提案されている
UTF-5 draft-jseng-utf5-01.txt RACE draft-ietf-idn-race-03.txt BRACE draft-ietf-idn-brace-00.txt LACE draft-ietf-idn-lace-01.txt DUDE draft-ietf-idn-dude-00.txt UTF-6 draft-ietf-idn-utf6-00.txt - alternate-encoding
-
DNS サーバから返されたドメイン名がクライアントのローカルエンコーディングに 変換できない文字を含んでいた場合に、ローカルエンコーディングの代わりに使用する エンコーディングを指定します。
alternate-encoding <Encoding>
指定するエンコーディングは必ず「ASCII互換エンコーディング (ACE)」と呼ばれる、 変換結果が従来のドメイン名として使用可能な文字 (英数字およびハイフン) だけ からなるエンコーディングでなければなりません。たとえば ASCII 互換 エンコーディングの一つである RACE を指定する場合には次のように指定します。alternate-encoding RACE
- normalize
-
ドメイン名の正規化手法を指定します。
normalize <scheme> ...
正規化手法は複数指定可能で、左側から順に適用されていきます。クライアントから送られてきたDNS要求のドメイン名は、 内部的に使用されるUTF-8エンコーディングに変換された上で、 ここで指示した正規化が適用されます。 使用可能な正規化手法はmDNkitに含まれるlibmdnに依存しています。 どのような正規化手法があるかは、 libmdnのマニュアルの normalizer モジュール に記載されています。
- server-translation
-
DNSサーバ側のドメイン名エンコーディング方法を指示します。
server-translation <ZLD> <Encoding>
ZLDが不要なエンコーディングであれば、省略値として'.'を指示します。server-translation . UTF-8
ZLDを必要するエンコーディングでは、ZLDとエンコーディング名の 両方を指定します。server-translation .i-dns.net UTF-5
指定可能なエンコーディングは、前出のclient-translationでの ものと同じです。 - user-id
-
dnsproxy が動作するユーザを指定します。
user-id <user>
通常、dnsproxy は特権ポートを使用するためルート権限で起動させる必要が ありますが、ルート権限のままで動作させるのはセキュリティ上好ましくありません。 この指定により、dnsproxy は特権ポートを作成したあとサービスを開始する前に 指定したユーザの権限で動くようになります。
<user> にはユーザ名あるいはユーザ ID 番号を指定することができます。
- group-id
-
dnsproxy が動作するグループを指定します。
group-id <user>
これは user-id エントリと似ていますが、ユーザの代わりにグループを 指定する点が異なります。<group> にはグループ名あるいはグループ ID 番号を指定することが できます。
- root-directory
-
dnsproxy が動作する際のルートディレクトリを指定します。
root-directory <path>
これもセキュリティ対策の一つです。dnsproxy が動作する際のルートディレクトリ を指定することで、そのディレクトリの外にはアクセスできないようにします。 この指定により、dnsproxy はサービスを開始する前に、chroot() システムコールを用いて指定したディレクトリをルートディレクトリとして 設定します。
<path> にはルートとして設定したいディレクトリ名を指定します。