FreeBSDではじめるIPv6 第5回

(FreeBSD PRESS No.9)

梅本肇 / ume@mahoroba.org

 この原稿は4.5-RC上で書いています。ひょっとしたら 皆さんがこの記事を読まれる頃には4.5-RELEASEがリリー スされているかもしれません。IPv6的には4.4-RELEASE からは特に変化はありません。期待している方がおられ たらごめんなさい。
 これまではIPv6のネットワークにつなぐことを主にし てきました。今回はアプリケーション寄りの部分を見て いくことにしましょう。

1. inetd

 FreeBSDのinetdはもちろんIPv6対応です。基本的な使 い方は従来と変わりません。IPv6を指定するキーワード が追加になっているだけです。
 /etc/inetd.confの第3フィールドでプロトコルを指定 します。IPv4の場合tcpあるいはudpが指定されていると 思いますが、代わりにtcp6あるいはupd6を指定すると、 IPv6で受け付けます。また、tcp46あるいはudp46を指定 すると、IPv6で受け付けると共に、IPv4もIPv4-mapped IPv6 addressとして受け付けます。
 ここで、IPv6とIPv4を共に受け付けるようにするには、 tcpの行とtcp6の行を書き、IPv4とIPv6をそれぞれに listenする方法と、tcp46の行だけを書いて、IPv6での みlistenし、IPv4はIPv4 mapped IPv6 addressで受ける 方法の2種類があります*1)。tcp46と書けるのは、起動 されるデーモンがIPv4-mapped IPv6 addressに対応して いる場合であることに注意して下さい。また、 IPv4-mapped IPv6 addressが有効になっている必要があ ります*2)
リスト1 FTPをIPv4とIPv6で受け付ける例
ftp	stream	tcp	nowait	root	/usr/libexec/ftpd	ftpd -l
ftp	stream	tcp6	nowait	root	/usr/libexec/ftpd	ftpd -l
 多くのデーモンはinetdから起動されます。起動され るデーモンがIPアドレスを意識していない作りであれば、 特にIPv6対応をする必要なく、/etc/inetd.confでIPv6 を受けるように設定してあげるだけで、そのまま使用す ることができます。
 しかし、実際には、IPアドレスでアクセス制御をおこ なったり、アドレスをログに吐き出したりなど、IPアド レスを見ているものが多いです。FreeBSDで提供してい るデーモンは基本的にIPv6 対応していますが、portsな どから入れる場合、必ずしも対応しているとは限りませ んので注意しましょう。

2. tcp wrappers

 FreeBSDのinetdはtcp wrappersのアクセス制御部分の ライブラリであるlibwrapをリンクしており、-wWを指定 することで、tcpdを起動するように明示的に指定しなく ても、IPアドレスによるアクセス制御をおこなうことが できます*3)
 アクセス制御の設定は/etc/hosts.allowに記述します。 IPv6アドレスが記述できるように拡張されています。 IPv6アドレスは「:」を含んでいますので、hosts.allow でのフィールド区切子と区別がつきません。そのため、 IPv6アドレスを指定する場合は「[」と「]」で囲んで指 定します。アドレス範囲を指定する場合、
[IPv6アドレス]/プレフィックス長
となります。
 また、FreeBSD添付のtcp wrappersはスコープ付アド レスに対応しています。スコープ付アドレスの場合に、 スコープ付で指定されると、そのスコープのみにマッチ します。スコープが指定されなかたった場合は、アドレ ス部分だけを比較します。スコープを指定する場合、
[IPv6アドレス%スコープ]/プレフィックス長
となります。リスト2に/etc/hosts.allowの例を示しま す。この例では、wi0のリンクローカルアドレスは許可 し、それ以外のリンクローカルアドレスは拒否します。 また、3ffe:505:2::/48からのアクセスは、IDENTクエリ をおこなった上でで許可しています。
リスト2 /etc/hosts.allowの例
ALL : [fe80::%wi0]/16 : allow
ALL : [fe80::]/16 : deny
ALL : ALL@[3ffe:505:2::]/48 : allow

3. メール

3.1. sendmail

 sendmailは8.10.X以降で正式にIPv6対応しており、 confENVDEFに-DNETINET6を指定してコンパイルすると、 IPv6対応になります。
 FreeBSD添付のsendmailはIPv6を有効にして作られて います。IPv6 が有効な環境で使用すると、相手がIPv6 でメールを受け取ることができ、相手とIPv6で通信がで きるのであれば、何も考えなくてもIPv6で送信されます。
 しかし、デフォルトではIPv6でメールを受け取るよう には設定されていません。これは、IPv6でメールを受け 取るよう設定すると、IPv4のみのkernelでは動作しなく なることへの配慮です。
 IPv6でメールを受け取るには、.mcファイルに
DAEMON_OPTIONS(`Name=MTA-v4, Family=inet')
DAEMON_OPTIONS(`Name=MTA-v6, Family=inet6')
と指定してsendmail.cfを作り直します。これで、IPv6、 IPv4共にlistenするようになります。
 ここで、IPv4 mapped IPv6 addressが有効な環境では
DAEMON_OPTIONS(`Name=MTA-v6, Family=inet6')
だけを指定しても、IPv4もmapped addressで入ってくる ことになります。
DAEMON_OPTIONS(`Name=MTA-v4, Family=inet')
も指定しておきましょう。
 また、/etc/mail/accessや/etc/mail/mailertableな どのマップファイルにIPv6アドレスを記述することがで きます*4)

3.2. Qpopper

 POP3サーバの定番であるQpopperはまだ正式にはIPv6 対応していませんが、パッチを当てることにより、IPv6 対応にできます*5)。FreeBSDのports/packagesの Qpopper (ports/mail/qpopper) はパッチでIPv6対応に しています。
 Qpopperにはinetdから起動するモードと、スタンドア ロンで起動するモードがあります。inetdから起動する 場合は、/etc/inetd.confにtcp6のエントリを追加する と、IPv6でも接続を受け付けるようになります。
 スタンドアロンモードで使用するには、configureに --enable-standaloneオプションを指定してコンパイル します。Qpopperの引数にbindするIPアドレスを指定で きます。たとえば図1のように[::]:110を指定して起動 すると、IPv6のみ受け付けるようになります。
図1 QpopperでIPv6のみ受け付ける例
/usr/local/libexec/qpopper '[::]:110'

3.3. imap-uw

 imap-uwはIMAP4サーバの有名な実装のひとつです。 imap-uwは本稿執筆時点ではまだIPv6対応していません。 しかし、inetdから起動するタイプで、内部的にIPアド レスを意識しているのはログ出力部分だけです。加えて、 アドレス参照部分はIPv4かどうかをきちんとチェックし ており、IPv4でなければ、IPアドレス部分に host=NON-IPv4と記録されるようになっています。 imap-uwによるログにこだわらなければ、IPv6で接続を 受け付けるようにしても大丈夫です。

3.4. Cyrus IMAPd

 IMAP4の有名なもうひとつの実装にCyrus IMAPdがあり ます。Cyrus IMAPdバージョン2にはIPv6対応パッチがあ ります*6)。ports/packagesではパッチを適用してIPv6 対応になっています。ports/mail/cyrus-imapdは本稿執 筆時点で2.0.16です*7)

 Cyrus IMAPdは認証にSASLライブラリを使用します*8)。 実は、SASLライブラリにもIPv4依存部分があります。 SASLは、IPアドレスも認証に使用できるように設計され ているためです。IPv6対応にするパッチはあり*9)、ports では適用しています。
 しかし、実際に使用しているのはKerberosIV認証だけ です。KerberosIVはそもそもIPv6に対応していません。 つまり、IPv4をmapped addressで受け付けるアプリケー ションでKerberosIV認証を使用したい場合にのみ必要に なります。現実的には、ほとんどこのパッチは適用する 必要はないでしょう。
 ちなみに、最近リリースされたSASLバージョン2*10) では正式にIPv6対応しています。ただし、バージョン1 とAPIの互換性はありません。
 つい先日、SASLバージョン2に対応した2.1.1がリリー スされました*11)。SASLライブラリが正式にIPv6対応し ましたのでIMAPdの方もと期待するところですが、残念 ながらまだマージされていません。IPv6化パッチは用意 してあり*12)、将来的にマージする方向で検討が進めら れています。なお、2.1.1のportは現在準備中です。

3.5. メールクライアント

 Mewバージョン2、WanderustなどのEmacs上で動作する メーラはEmacsがIPv6対応になっていれば、IPv6で使用 できます。
 Emacs 21.Xは最初からIPv6に対応しています。20.Xは パッチがあります。20.Xのports/packagesはパッチを使 用してIPv6対応になっています*13)
 XEmacsは21.2.XからIPv6対応になっています。本稿執 筆時点ではports/editor/xemacsは21.1.14でありIPv6対 応していません。ports/editor/xemacs-develは21.4.5 ですので、IPv6を使用したい場合はこちらを入れると良 いかもしれません。

 また、Mewバージョン1などで使用しているIMはPerlで 書かれており、Perl側でのIPv6対応を必要とします。 getaddrinfo()などのIPv6で使用するAPIをPerlから利用 できるようにするSocket6.pmというモジュール*14)をイ ンストールし、IMにパッチ*15)を当てることでIPv6対応 になります。Socket6.pmはports/packagesになっていま す (ports/net/p5-Socket6)。
 ちなみに、Perlはバージョン6で正式にIPv6対応作業 が進められています。

 GTK+を使用したメーラであるSylpheedはオリジナルで IPv6対応しています。GUIを使用したメーラをお探しな ら良いかもしれません。portsではports/mail/sylpheed にあります。
 GUIということでは、Mozillaという選択肢もあります。
 CUIを使用したメーラではMuttがIPv6をサポートして いるようです。

4. Web

 サーバはApacheやthttpdがIPv6対応しています。IPv6 対応したブラウザには、Mozilla、Lynx、w3mなどがあり ます。また、wgetなどのHTTPクライアントも対応してい ます。しかし、プロキシの定番であるSquidは残念なが らまだ対応していません*16)

4.1. Apache

 Apacheは現在開発中のバージョン2でIPv6対応してい ます。本稿執筆時点では2.0.28がportになっています (ports/www/apache2)。
 現在一般的に利用されているバージョン1にはパッチ があります。元々はKAMEによって作成されましたが、最 近のバージョンのApacheに対するパッチは ftp://ftp.piuha.net/pub/misc/ で配布されています。 もちろんports/packagesになっています 。ただし、次 に述べる理由から、パッチを適用していないものと別に なっています (ports/www/apache13+ipv6)。
 バージョン1は内部のAPIが非常にIPv4に依存しており、 APIの互換性を保ったままIPv6対応するのは非常に難し いと聞いています。ApacheそのものはパッチによりIPv6 対応で動作しますが、サードパーティによるモジュール は必ずしもIPv6で動作するとは限りません。
 また、mod_sslは、mod_ssl対応パッチとIPv6対応パッ チがコンフリクトします。以前、筆者がKAMEのIPv6パッ チをベースに作業し、現在は今野さんが作業されていま す*17)

 IPv6対応したhttpdを起動すれば、デフォルトでIPv6 でlistenします。IPv4 mapped IPv6 addressが有効になっ ていると、この状態でもIPv4での接続も受け付けます。 しかし、IPv4はmapped IPv6 addressで入ってくること になるため、REMOTE_ADDRには::ffff:192.168.0.1のよ うな感じで設定されます。CGIなどでクライアントのIP アドレスを見ているような場合、これでは困るかもしれ ません。httpd.confにリスト3のように指定し、IPv6と IPv4それぞれにlistenするようにしておいた方が良いで しょう。また、この方法だと、IPv4 mapped IPv6 addressを無効にしていてもIPv6とIPv4といずれの接続 も受け付けることができます。

リスト3
Listen :: 80
Listen 0.0.0.0 80
 では、REMOTE_ADDRについてちょっと触れましたので、 クライアントからの接続がIPv6かIPv4かをSSIを使って 判定してみましょう。
 リスト4は引数に与えられたIPアドレスがIPv6かIPv4 かを判定するPerlスクリプトです。IPv4がIPv4 mapped IPv6 addressで入ってきた場合も考慮しています。
 リスト5はfromv6pを呼び出すSSIです。SSIを有効にし たHTMLドキュメントに書いておくと、リスト6のように 展開されます。
リスト4 IPv6かIPv4かの判定 (fromv6p)
#!/usr/bin/perl

if ($ARGV[0] =~ /^(::ffff:)?\d+\.\d+\.\d+\.\d+$/o) {
        print "IPv4";
} elsif ($ARGV[0] =~ /^[0-9a-f:]+$/o) {
        print "IPv6";
} else {
        print "unknown";
}
リスト5 fromv6pの呼び出し
Your are using <!--#exec cmd="./fromv6p $REMOTE_ADDR" -->,
from <!--#echo var="REMOTE_ADDR" -->
リスト6 出力例
IPv6の場合:
    Your are using IPv6, from 3ffe:505:2:0:202:2dff:fe0a:6bee
IPv4 の場合:
    Your are using IPv4, from 202.227.26.44
IPv4 の場合 (mapped address):
    Your are using IPv4, from ::ffff:202.227.26.44

4.2. Mozilla

 グラフィカルなブラウザとしてはMozillaが利用でき ます。現状のMozillaのIPv6対応はIPv4 mapped IPv6 addressの使用が前提の実装になっています。そのため、 IPv6サポートを有効にしたMozillaは、IPv6を有効にし たkernel上でないと動作しません。また、IPv4 mapped IPv6 addressを有効にしていないと、IPv4のみのサイト にアクセスできません。加えて、現状の実装では、IPv6 でアクセスできなかった場合にIPv4でアクセスするよう に作られていません。つまり、AAAAレコードが付いてい るにもかかわらず、IPv6でサービスをしていないサーバに は、アクセスすることができません。これらの問題を考慮 し、ports/packagesではIPv4のみの版とIPv6対応版を別々 に提供しています。IPv6対応版は ports/www/mozilla+ipv6になります。

5. NFS

 5-CURRENTのNFSはIPv6対応になっています。NFSはRPC を使用しているため、IPv6対応しようとすると、RPCも IPv6対応している必要があります。5-CURRENTでは従来 のRPCからTI-RPCにに置き換えられました*18)
 IPv6で使用する場合も基本的に従来と変わりません。 サーバ側では、公開するディレクトリを/etc/exports に記述しますが、ここに書くホスト名を検索した際に IPv6アドレスが返ってくるようになっていると、IPv6 での接続を許可します。
 クライアント側でmountコマンドの引数に指定するホ スト名も同様です。IPv6アドレスが返ってくるとIPv6 で接続を試みます。
 ただし、現状では、NFSv2のUDPを使用しようとすると、 クライアント側がpanicしてしまうようですので注意し て下さい (表1)。
表1 NFSバージョンとプロトコルの組み合わせ
NFSv2NFSv3
UDP×
TCP
 NFSをamdと組み合わせて使用されている方も多いと思 います。amdは残念ながらIPv6対応していませんので、 amdでマウントしようとすると必ずIPv4を使用します。 am-utils*19)の最新スナップショットを見てもIPv6を サポートしている気配がありませんので、当面サポート されることはないと思われます。
 どうしてもamdを使用したい場合、ファイルシステム・ タイプprogramを使用して、mountコマンドを呼ぶように すると良いでしょう。
 なお、RPC回りの変更は非常に大きいため、安定性重 視の4-STABLEには取り込まれること残念ながらないでしょ う。

5. IPv6対応の現状と問題点

 最近では最初からIPv6対応したアプリケーションも増 えてきています。そのようなアプリケーションでも、対 応状況がまちまちだったりします。たとえば、前述の MozillaのようにIPv4に影響が出てしまうようなものも あります。また、IPv4 mapped addressまわりの挙動が OS毎に少しづつ異なることもあり、IPv4 mapped IPv6 addressを考慮していないアプリケーションも存在しま すし、逆に、IPv4 mapped IPv6 addressが前提となった アプリケーションも存在します。

 定番とも言えるアプリケーションの多くは既にIPv6対 応しており、日常生活に困らない程度にはなってきてい ると思います。しかし、まだまだ最初から対応している アプリケーションは少ないのが実情です。
 最初から対応していないと、新しいバージョンが出た 際に、そのバージョンに対応したIPv6パッチが出るまで しばらく待たなければいけないことになります。
 セキュリティホールが見つかって、その修正をおこなっ たバージョンが出たとします。新しいバージョンに対し て、以前のバージョンへのIPv6パッチがそのまま適用で きなかったりすると、結構深刻な問題になりえます。
 そうでなくても、意欲的に開発がおこなわれ頻繁に新 しいバージョンがリリースされるアプリケーションにつ いては、パッチでの追従は大変です。たとえば、最近、 wgetはIPv6対応パッチが出るまでの遅延を嫌って、IPv6 対応版とオリジナル版にportが分離されました。 ports/ftp/wgetがオリジナル版で、 ports/ftp/wget+ipv6 がIPv6対応版です。

6. おわりに

 さっとではありますが、アプリケーションまわりを見 てきました。今回紹介しただけではなく、それ以外にも 多くのアプリケーションがIPv6対応しています。IPv6対 応したアプリケーションはportsではipv6カテゴリに分 類されていますので、これを頼りにあれこれ試してみて ください。

 さて、自宅のADSL接続に使用しているFreeBSDを 4.5-PRERELEASEに上げて以降、ADSLのリンクが切れた際 に再接続に失敗するという現象に悩まされていました。 どうも、PPPoE接続が切れている時に、本来gif0に流れ るはずのIPv6パケットがtun0に洩れるという現象が起こ り、pppが消化不良を起こしてしまうようです。とりあ えず、ip6fwでtun0に対してIPv6パケットが流れないよ うにフィルタしておくと、回避できます。4.5-RELEASE までに対策ができると良いのですが…


*1) tcp46とtcpを指定することもできますが、意味がないでしょう。
*2) net.inet6.ip6.v6onlyの値が0。FreeBSDではデフォルトです。 /etc/rc.confのipv6_ipv4mapping変数で変更できます。
*3) デフォルトで-wWは指定されています。 また、FreeBSDでは特に必要がないので、これまでtcpdは提供されていませんでしたが、 inetd以外を使用する場合のために欲しいという要望があり、 5-CURRENTでは提供されるようになりそうです。
*4) sendmail 8.12.XではIPv6:3ffe:505:9999::という感じで 「IPv6:」を頭に付けて記述するように変更されています。 バージョンアップの際には注意しましょう。 ちなみに、FreeBSD付属のsendmailは本稿執筆時点で8.11.6です。
*5) http://www.imasy.or.jp/~ume/ipv6/qpopper4.0.3-ipv6-20010504.diff.gz
*6) http://www.imasy.or.jp/~ume/ipv6/cyrus-imapd-2.0.16-ipv6-20020118.diff.gz
*7) ports/mail/cyrusはバージョン1の最終版である1.6.24です。 お間違いのないように。
*8) ports/security/cyrus-sasl。 portsからインストールする場合、 もちろん依存関係にしたがって自動的にインストールされます。
*9) http://www.imasy.or.jp/~ume/ipv6/cyrus-sasl-1.5.27-ipv6-20020106.diff.gz
*10) ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.0.tar.gz
*11) ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-2.1.1.tar.gz
*12) http://www.imasy.or.jp/~ume/ipv6/cyrus-imapd-2.1.1-ipv6-20020118.diff.gz
*13) パッチは、ports/editors/emacs20/files/にあり、 patch-ccの一部およびpatch-cd、patch-cgが該当します。
*14) ftp://ftp.cpan.org/pub/CPAN/modules/by-module/Socket6/Socket6-0.11.tar.gz
*15) http://www.imasy.or.jp/~ume/ipv6/im-140-Socket6-20011107.diff.gz
*16) バージョン1にはパッチがありますが、さすがに古すぎますよね。:-)
*17) パッチ: http://motoyuki.bsdclub.org/data/IPv6/apache-1.3.22-mod_ssl-2.8.5-v6-20011017.diff.gz
port: http://motoyuki.bsdclub.org/data/IPv6/ports-apache-1.3.22-modssl-2.8.5-v6-20011017.tar.gz
*18) 従来のRPCではDARPAポート番号とのマップにはportmapを使用していましたが、 TI-RPCではrpcbindを使用します。
*19) http://www.cs.columbia.edu/‾ezk/am-utils/


All Rights Reserved, Copyright (C) 2001 Hajimu UMEMOTO
Last Modified Mar 27, 2002
ume@mahoroba.org