FAITHD(8)

名称
faithd - FAITH IPv6/v4 変換デーモン

書式
faithd [-dp] [-f configfile] service [serverpath [serverargs]]

解説
faithd は IPv6 から IPv4 への TCP リレー機能を提供します。

faithd は IPv4/v6 デュアルスタックルータ上で起動しなければなりません。

TCPv6 トラフィックが見つかると、 faithd はその TCPv6 トラフィックを TCPv4 にリレーします。 リレーする TCPv4 コネクションの終点は、元の IPv6 終点の末尾 4 オクテットから決定されます。 例えば、 faithd 用に 3ffe:0501:4819:ffff:: が予約されていて、 TCPv6 終点アドレスが 3ffe:0501:4819:ffff::0a01:0101 なら、このトラフィックは IPv4 の終点 10.1.1.1 に向けてリレーされます。

faithd による変換サービスを用いるには、 IPv4 アドレスをマップするための IPv6 アドレスプレフィクスを 予約しておく必要があります。 カーネルは、そこで予約した IPv6 アドレスプレフィックスへの すべての TCP コネクションを、 route(8) を用いて疑似インターフェース faith(4) にルーティングするように、適切に構築されていなければなりません。 また、 sysctl(8) を用いて net.inet6.ip6.keepfaith を 1 に設定しておくべきです。

ルータは、予約された IPv6 アドレスプレフィックス行きのすべての TCP トラフィックを捕まえるように 設定しなければなりません。このためには route(8) と sysctl(8) のコマンドを使用します。

faithd は、名前からアドレスへの特別な変換機構を必要とし、 ホスト名から特別な IPv6 アドレスプレフィックスへ解決します。 小規模なインストールでは、 hosts(5) を使用してください。 大規模なインストールでは、 特別なアドレス変換をサポートする DNS サーバが有用でしょう。 totd と呼ばれる実装が http://www.vermicelli.pasta.cs.uit.no/ipv6/software.html で入手可能です。 変換された DNS レコードが一般の DNS 群に伝播されないよう、注意してください。 非常に有害です。

  デーモンモード
faithd がスタンドアロンプログラムとして起動されると、 faithd は自分自身をデーモン化します。 faithd は TCPv6 のポート service を listen します。 ポート service への TCPv6 トラフィックを見付けると、コネクションをリレーします。

faithd が TCP ポート service を listen するので、 inetd(8) や他の標準的な仕組みを用いて、そのルータ上で service ポートを使うローカルな TCP デーモンを動作させることはできません。 faithd に対して serverpath を指定することで、 ルータ上でローカルデーモンを走らせることができます。 終点アドレスがローカルのインターネットアドレスであれば、 faithd は serverpath においてローカルデーモンを起動します。 それ以外の場合、 faithd は IPv4 TCP への変換を行います。 ローカルデーモンの引数は serverargs を用いて指定することができます。

次のオプションが使用可能です:

-d  syslog(3) を用いてデバッグ情報を出力します。

-f configfile
    アクセス制御用の設定ファイルを指定します。後述を参照してください。

-p  IPv4 TCP コネクションを最終の終点向けにリレーする際、 faithd はソースポートとして特権 TCP ポートを使用します。 ftp(1) や rlogin(1) をリレーする際は 本オプションは不要です。そのための特別なプログラムコードが含まれています。

faithd は通常の TCP データも帯域外 TCP データもリレーします。 TCP half close をエミュレートすることも可能です。 faithd は ftp(1) と rlogin(1) で用いられるプロトコルに対して、特別なサポートを行います。 FTP プロトコルを転送する際は、 faithd は、 PORT/LPRT/EPRT コマンドおよび PASV/LPSV/EPSV コマンドにおけるネットワークレベルアドレスも変換します。 RLOGIN プロトコルに対しては、 faithd は、サーバ側の rlogind(8) からクライアント側の rlogin(1) への逆方向コネクションもリレーします。

アクティブでないセッションは 30 分で切断します。 これは、使わなくなったセッションのせいでリソースが消費されるのを 防ぐためです。 サービスによってはこの機能は適切でないかもしれません。 (この機能をコンフィギュレーション可能にすべきでしょうか?)

  inetd モード
faithd が inetd(8) から起動されると、 faithd は標準入力から渡されるコネクションを扱います。 コネクションの終点が、予約した IPv6 アドレスプレフィックスの範囲内の場合、 faithd はコネクションをリレーします。 それ以外の場合、 faithd はサービスに対応する telnetd(8) のようなデーモンを起動し、 inetd(8) から渡されるコマンド引数を使用します。

faithd は、ローカルな TCP ポート番号を元に動作モードを決定し、 必要な時/可能な時には特別なプロトコル処理を有効にします。 例えば、 faithd が FTP ポート上で inetd(8) から起動されると、これは FTP リレーとして動作します。

この動作モードでは、 inetd(8) 中に faithd 用の特別なサポートを必要とします。

  アクセス制御
悪意あるアクセスを防ぐため、 faithd は単純なアドレスベースのアクセス制御を実装しています。 /etc/faithd.conf (または -f で指定した configfile) で、 faithd は望まないトラフィックの中継を防ぎます。 faithd.conf は、次の書式のディレクティブを含みます:

•   src/slen deny dst/dlen

    問い合わせの始点アドレスが src/slen に合致する場合で、変換後の終点アドレスが dst/dlen に合致する場合、接続を拒否します。

•   src/slen permit dst/dlen

    問い合わせの始点アドレスが src/slen に合致する場合で、変換後の終点アドレスが dst/dlen に合致する場合、接続を許可します。

これらのディレクティブは順番に評価され、 最初に合致するエントリが効果を持ちます。 合致しないと (これがルールセットの最後である場合) トラフィックは拒否されます。

inetd モードでは、 inetd(8) のアクセス制御機能でトラフィックをフィルタ可能です。

使用例
faithd を起動する前に、 faith(4) インタフェースを適切に設定しておく必要があります。

    # sysctl net.inet6.ip6.accept_rtadv=0
    # sysctl net.inet6.ip6.forwarding=1
    # sysctl net.inet6.ip6.keepfaith=1
    # ifconfig faith0 up
    # route add -inet6 3ffe:501:4819:ffff:: -prefixlen 96 ::1
    # route change -inet6 3ffe:501:4819:ffff:: -prefixlen 96 -ifp faith0

  デーモンモードのサンプル
telnet サービスを変換し、そしてローカルな telnet サービスを提供しない場合は、 次のように faithd を起動します:

    # faithd telnet

もし /usr/libexec/telnetd にある telnetd(8) によるローカル telnet サービスを提供したい場合は、 次のコマンドラインを使用します:

    # faithd telnet /usr/libexec/telnetd telnetd

ローカルデーモンに追加の引数を渡したい場合は:

    # faithd ftp /usr/libexec/ftpd ftpd -l

他の使用例です。 rsh/rlogin サービスを変換するには -p が必要かもしれません。

    # faithd ssh
    # faithd login /usr/libexec/rlogin rlogind
    # faithd shell /usr/libexec/rshd rshd

しかしながら、rlogin や rsh のコネクションを変換するときには注意が必要です。 更なる詳細については セキュリティの考察 を参照してください。

  inetd モードのサンプル
inetd.conf(5) に次の行を追加します。 構文はオペレーティングシステムによって様々でしょう。

    telnet  stream  tcp6/faith  nowait  root  /usr/sbin/faithd  telnetd
    ftp     stream  tcp6/faith  nowait  root  /usr/sbin/faithd  ftpd -l
    ssh     stream  tcp6/faith  nowait  root  /usr/sbin/faithd  /usr/sbin/sshd -i

inetd(8) は、listen するソケットをオープンし、 カーネルの TCP リレーサポートを有効化します。 コネクションが到着すると、 faithd が inetd(8) から起動されます。 コネクションの終点が、予約した IPv6 アドレスプレフィックスの範囲内の場合、 faithd はコネクションをリレーします。 それ以外の場合、 faithd はサービスに対応する telnetd(8) のようなデーモンを起動します。

  アクセス制御の例
以下に単純な faithd.conf 設定を示します。

    # 3ffe:501:ffff::/48 からのすべてに変換器の使用を許し、
    # 次の IPv4 の終点へ接続させます:
    # - 10.0.0.0/8 と 127.0.0.0/8 以外のすべて
    # 他の接続は許しません。
    #
    3ffe:501:ffff::/48 deny 10.0.0.0/8
    3ffe:501:ffff::/48 deny 127.0.0.0/8
    3ffe:501:ffff::/48 permit 0.0.0.0/0

戻り値
成功すると faithd は EXIT_SUCCESS (0) で終了し、エラーがある場合は EXIT_FAILURE (1) で終了します。

関連項目
faith(4), route(8), sysctl(8) Jun-ichiro itojun Hagino, Kazu Yamamoto, An IPv6-to-IPv4 transport relay translator, RFC3142, ftp://ftp.isi.edu/in-notes/rfc3142.txt, June 2001.

歴史
faithd コマンドは WIDE Hydrangea IPv6 プロトコルスタックキットで 初めて登場しました。

KAME プロジェクト (http://www.kame.net/) スタックに 基づく IPv6, IPsec サポートは、 FreeBSD 4.0 で初めて統合されました。

セキュリティの考察
faithd (および他の TCP リレーサービス) でリレーされたコネクションに対し、 rhosts(5) をはじめとする IP アドレスベースの認証を用いるのは大変危険です。

faithd.conf もしくは IPv6 パケットフィルタを使用し、 faithd へのアクセス制限を行うことを、管理者へお勧めします。 これは faithd を悪意ある者達から防御することであり、 サービス/バンド幅を盗まれないようにすることを意味します。 IPv6 の終点アドレスについては、 route(8) を用いて、 faith(4) を指す経路エントリを注意深く設定することで、制限可能です。 IPv6 の始点アドレスについては、 パケットフィルタでフィルタする必要があります。 関連項目 に列挙した文書に、本件に関する更なる議論が記述されています。