mdnsproxy
概要
mdnsproxyは、 クライアントからのローカルコードベースの多言語ドメイン名を含むDNS要求を受け取り、 多言語化対応したDNSが受付けられるドメイン名に変換します。 また逆に、DNSサーバからの応答を受け取って、 その中に含まれている多言語ドメイン名をクライアント側で認識できる形式に戻します。
これによって、 クライアントを改造することなく各種の多言語ドメイン名を使うことができるようになります。 また、DNSサーバから見た場合には、 クライアント+mdnsproxyによって多言語ドメイン名に対応したクライアントとして動作しているように見えることになります。
ただし、mdnsproxyが正しく動作するには、 クライアントのリゾルバライブラリがローカルエンコーディングのドメイン名をそのまま透過させ、 エラーにならないようになっている必要があります。 残念ながら現在UNIXのリゾルバライブラリの多くは8ビットスルーではないので、 そのままではmdnsproxyを用いても多言語ドメイン名を扱えるようにはなりません。
この場合には、 BIND-8の8ビットスルーパッチを当てたリゾルバライブラリを使用するといったような方法をとる必要があります。
起動
mdnproxyを起動する際の、コマンド行の形式は次の通りです。
$ mdnsproxy
[オプション...]
オプション
mdnsproxyは、次に挙げたコマンドラインオプションを認識します。
-
-daemon
- mdnsproxyをデーモンとして起動します。
-
-config
config-file - 設定ファイルを指定します。 コマンドラインで指定しなかった場合にはデフォルトの設定ファイルが使用されます。 詳しくは設定ファイルの項で説明します。
-
-logfile
log-file - mdnsproxyが実行ログを出力するファイル名を指定します。 特に指定されなかった場合には、 設定ファイルで指定されたログファイル、 あるいはデフォルトのログファイルに出力します。
設定ファイル
mdnsproxyの設定は、設定ファイルに記します。 設定ファイルは、 mdnsproxyの起動時にコマンドラインで指定することができます。
% mdnsproxy -config
<config-file>
コマンドラインで指定しなかった場合は、
デフォルトの設定ファイルが使用されます。
mdnsproxyを/usr/local
以下にインストールした場合、
デフォルトの設定ファイルは、
/usr/local/etc/mdnsproxy.conf
になります。
このファイルは通常のテキストファイルで、 ファイルの各行 (#で始まるコメント行と、空行を除いて) は、 次のような単純なフォーマットで構成されます。
キーワード 値...
listen
mdnsproxyがクライアントからの要求を受付けるネットワークアドレス、 ポート番号を指定します。
listen
<address>
<address> は以下のいずれかの形式で指示します。
<IP address>:<port number> :<port number> <IP address>
<IP address>が省略された場合は0.0.0.0
(INADDR_ANY
) が使用され、
<port number>が省略された場合は53番ポートが使用されます。
listen
自体が省略された場合は、
<address>として0.0.0.0:53
が使用されます。
mdnsproxy経由でDNSサーバを使用するクライアントは、 ここで指示したアドレス、ポートをDNSサーバとして設定します。 クライアント側ではポート番号を変更できないものが多いので、 ポート番号はデフォルトの53をそのまま使った方がよいでしょう。
forward
mdnsproxyが、DNS要求を転送し、 応答を受け取る本来のDNSサーバのネットワークアドレス、 ポート番号を指定します。
forward
<address> [bind4compat
]
<address>の形式は上の
listen
のものと同じです。
オプションのbind4compat
が指示された場合には、
UDPでリクエストを転送する時に、ソースアドレスとして、
listen
で指示されたアドレスおよびポートを使用します。
これはBIND 4にある機能で、
UDPポートについてのアクセス制限下で運用することを想定したものです。
このオプションが指示されなかった場合には、
1024以上のソースポートが使用されます。
client-encoding
クライアント側でのドメイン名のエンコーディングを指示します。
client-encoding
<Encoding>
クライアントから送られてきた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-01.txt UTF-6 draft-ietf-idn-utf6-00.txt AltDUDE draft-ietf-idn-altdude-00.txt AMC-ACE-M draft-ietf-idn-amc-ace-m-00.txt AMC-ACE-O draft-ietf-idn-amc-ace-o-00.txt AMC-ACE-R draft-ietf-idn-amc-ace-r-00.txt
をサポートしています。
mdn-conf-file
mDNkit付属のlibmdnの設定ファイル名を指定します。
mdn-conf-file
<path>
mdnsproxyはmDNkitに付属しているlibmdnを使用して、
多言語ドメインに関する処理を行っています。
mdn-conf-file
は、
そのlibmdnの設定ファイルのファイル名を指定します。
ファイル名は、
コマンドラインオプション -conf
で指定することもできます。
両方指定した場合にはコマンドラインオプションの指定のほうが優先されます。
どちらも指定されなかった場合には、
/usr/local/etc/mdn.conf
から読み込みます。
なお、libmdnの設定ファイルの記述の仕方については、 mDNkitの設定を参照してください。
log-file
mdnsproxyが実行ログを出力するファイル名を指定します。
log-file
<path>
ログファイル名は、
コマンドラインオプション -logfile
で指定することもできます。
両方指定した場合にはコマンドラインオプションの指定のほうが優先されます。
どちらも指定されなかった場合には、
/usr/local/var/mdnsproxy/mdnsproxy.log
に書き込まれます。
実行ログは常に追記されていきますので、 適当な時を見計らって消すことをお勧めします。 また、 mdnsproxyにハングアップシグナル (SIGHUP) を送るといったんログファイルを閉じて、再度オープンするようになっています。 ログファイルをアーカイブする場合に便利な機能です。
なお、
<path>としてsyslog
を指定すると、
syslog を用いてログを出力します。
log-level
ログのレベルを設定します。
log-level
<level>
レベルとして指定できる値は次の通りです。
none
- 一切ログを記録しません。 ログがないと不具合が生じた場合の原因解明が難しくなりますので、 できればこのレベルは指定しないでください。
fatal
- 致命的なエラーが生じたときにのみログを出力します。
warn
- 警告メッセージもログに記録します。 これがログレベルを指定しなかったときのデフォルトです。
trace
- 実行トレースメッセージもログに出力します。 このレベルを指定するとmdnsproxyの動作がかなり詳細に記録されるので障害が発生した場合の原因究明には便利ですが、 大量のログが出力されるので普段は指定しない方がよいでしょう。
ログの出力にsyslogを用いている場合、 致命的なエラーメッセージはsyslogの優先度ERRで出力されます。 同様に、警告レベルのエラーメッセージは優先度WARNINGで、 トレースメッセージは優先度DEBUGで出力されます。
mdn-log-level
libmdnのログのレベルを設定します。
mdn-log-level
<level>
mdnsproxyはmDNkitに付属しているlibmdnを使用して、
多言語ドメインに関する処理を行っています。
mdn-log-level
は、
このlibmdn内部での処理に関するログのレベルを設定します。
それ以外の処理部分についてのログのレベルはlog-level
で設定します。
ログレベルは次の5段階が定義されています。
fatal
(= 0)error
(= 1)warning
(= 2)info
(= 3)trace
(= 4)dump
(= 5)
syslog-facility
syslogのファシリティを設定します。
syslog-facility
<facility>
syslogでログの出力を行う際に使用するファシリティを指定します。
syslogでログの出力を行わない場合は、無視されます。
(syslogでログの出力うためにはlog-file
かあるいはコマンドラインオプション -logfile
で指定する必要があります。)
省略時は daemon
が使用されます。
user-id
mdnsproxyが動作するユーザを指定します。
user-id
<user>
通常、 mdnsproxyは特権ポートを使用するためルート権限で起動させる必要がありますが、 ルート権限のままで動作させるのはセキュリティ上好ましくありません。 この指定により、 mdnsproxyは特権ポートを作成したあとサービスを開始する前に指定したユーザの権限で動くようになります。
<user>にはユーザ名あるいはユーザID番号を指定することができます。
group-id
mdnsproxyが動作するグループを指定します。
group-id
<group>
これはuser-id
エントリと似ていますが、
ユーザの代わりにグループを指定する点が異なります。
<group>にはグループ名あるいはグループID番号を指定することができます。
root-directory
mdnsproxyが動作する際のルートディレクトリを指定します。
root-directory
<path>
これもセキュリティ対策の一つです。
mdnsproxyが動作する際のルートディレクトリを指定することで、
そのディレクトリの外にはアクセスできないようにします。
この指定により、mdnsproxyはサービスを開始する前に、
chroot()
システムコールを用いて指定したディレクトリをルートディレクトリとして設定します。
<path>にはルートとして設定したいディレクトリ名を指定します。
allow-access
クライアントの IP アドレスに基づくアクセス制限を設定し、 mdnsproxyに接続可能なクライアントを制限します。
allow-acccess
<where> ...
<where>は次のいずれかの形式で指定します。
<IP address> <IP address>/<prefix-length>
前者は特定のIPアドレスを持つホストからの接続を許可し、 後者は<IP address>と<prefix-length>で指定されるアドレスプリフィックスを持つ任意のホストからの接続を許可します。 例えば
allow-access 192.168.0.0/16
と指定すると、 アドレスの上位16ビット (プリフィックス) が192.168であるホストからの接続を許可します。
このエントリは複数指定することが可能で、 複数指定した場合にはそのいずれか一つでもマッチすれば接続が許可されます。
このエントリを指定しなかった場合にはすべてのホストからの接続が許可されます。
log-on-denied
allow-access
で設定したアクセス制限によって接続を拒否した場合に、
それをログに記録するかどうかを指定します。
log-on-denied
<yes-or-no>
指定できる値はyes
またはno
です。
yesを指定した場合には接続拒否記録がログに残されます。
指定されなかった場合は、接続拒否記録をログに残しません。
シグナル
mdnsproxyにSIGHUPシグナルを送ると、 ログファイルをいったん閉じ、 再度オープンするという動作を行います。 これは次のような手順でログをアーカイブできるようにするためです。
-
mv
コマンド等を用いてログファイルを別の名前にする。 - mdnsproxyにSIGHUPを送り、新たなログファイルをオープンさせる。