FreeBSDではじめるIPv6 第4回

(FreeBSD PRESS No.8)

梅本肇 / ume@mahoroba.org

 今回は、お約束通り、筆者の環境についてお話したい と思います。
 また、IPv6→IPv4トランスレータの話を少ししてみた いと思います。

1. 筆者のIPv6接続環境

 筆者は、最近、FLET's ADSLな環境になりました。固 定IPv4アドレスの申請をしようと考えていますが、現在 はまだPPPoEで割り当てられるIPv4アドレスをそのまま 使用しています。
 FLET'sですので、PPPoEでの接続となっています。ルー タはFreeBSD 4.4-RELEASEで構築しています(図1)。
図1 自宅の接続環境
自宅の接続環境

2. PPPoEの設定

 リスト1に/etc/ppp/ppp.confを示します。
リスト1 /etc/ppp/ppp.conf
default:
 set log Phase Chat LCP IPCP CCP tun command
 set server /var/run/pppctl%d "パスワード" 0117
provider:
 set authname "ユーザ@プロバイダ"
 set authkey "パスワード"
 set device PPPoE:dc0
 set mru 1454
 set mtu 1454
 add default HISADDR
 enable lqr
 PPPoEで使用するインタフェースは若干変則的な初期 化をおこなっています。
 まず、IPv4アドレスの解決はおこなう必要がないので、 ARPをdisableしています。
 また、インタフェースにはupすると自動的にリンクロー カルアドレスが付きますが、このインタフェースにIPv6 を流すわけではありませんし、強制的に削除しています。
 これらは、/etc/rc.confでうまく記述することができ ません。/etc/に「start_if.インタフェース名」という 名称でシェルスクリプトを用意しておくと、インタフェー ス初期化時に/etc/rc.networkから呼ばれるようになっ ていますので、/etc/start_if.dc0というファイルを用 意して対処しています(リスト2)。
 この辺はあまり神経質になる必要はないかもしれませ んが、使わないものが有効になっているのは気持悪いの で、設定しています。
リスト2 /etc/start_if.dc0
ifconfig dc0 up -arp
ifconfig dc0 inet6 fe80::240:c7ff:fe99:81eb -alias 

3. /etc/rc.confの設定

 リスト3は/etc/rc.confでのpppおよびIPv6接続回りの 設定です。
 IPv6接続にはgifトンネルを使用していますので、 gif0を作成しています。現在はまだ固定IPv4アドレスを 取得していませんので、DTCPを使用しています。
 DTCPクライアントであるdtcpcはgif cloningに対応し ていますので、必ずしもgifインタフェースを作成して おく必要はないのですが、cloningを使用すると、 /etc/rc.firewall6でip6fwを使用したファイアウォール の設定をおこなう時点ではgif0がまだ出現していないこ とになり、インタフェースの指定ができません。そのた め、gif0をあらかじめ生成しておき、dtcpcでは create/destroyしないようにしています。
 筆者の環境は4.4-RELEASEですので ifconfig_gif0="create"と指定してごまかしていますが、 5-CURRENTではcloned interfaceの生成をおこなうため の変数が追加されていますので、 cloned_interfaces="gif0"と指定できるようになってい ます*1)
リスト3 /etc/rc.conf
firewall_enable="YES"
firewall_type="/etc/ipfw.conf"
firewall_quiet="YES"
firewall_logging="YES"
firewall_flags="-p m4"
network_interfaces="lo0 dc0 dc1 gif0"
ifconfig_dc1="inet 202.227.26.36 netmask 255.255.255.240"
ifconfig_gif0="create"
ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="provider"
gateway_enable="YES"
ipv6_enable="YES"
ipv6_gateway_enable="YES"
ipv6_static_routes="snla2 pnla2"
ipv6_route_snla2="2001:200:301:: -prefixlen 48 ::1 -reject"
ipv6_route_pnla2="3ffe:505:2:: -prefixlen 48 ::1 -reject"
ipv6_network_interfaces="dc1"
ipv6_prefix_dc1="2001:200:301:0 3ffe:505:2:0"
rtadvd_enable="YES"
ipv6_faith_prefix="3ffe:505:2:ffff::"
ipv6_ipv4mapping="NO"
ipv6_firewall_enable="YES"
ipv6_firewall_type="/etc/ip6fw.conf"
ipv6_firewall_quiet="YES"
ipv6_firewall_logging="YES"
ipv6_firewall_flags="-p m4"

4. DTCPクライアントの設定

 DTCPはtunnelrouteというIMASYで独自拡張をおこなっ たタイプで使用しています。これは、トンネルの接続を おこない、サーバ側にユーザ毎に登録されたプレフィッ クスで静的に経路を設定するタイプです*2)
 dtcpcは/usr/local/etc/rc.d/dtcpc.shから起動する ようにしています。リスト4にdtcpc起動部分を示します。
リスト4 dtcpc起動部分
dtcpc -t tunnelroute -u mahoroba -i gif0 -c -D -l dtcp.imasy.or.jp

	サーバ: dtcp.imasy.or.jp
	ユーザ: mahoroba (-u)
	tunnelroute モード (-t)
	GIFインタフェース: gif0 (-i)
	gif cloningは使わない (-c)
	デーモンとして起動 (-D)
	接続が切れた場合に再接続する (-l)
 次に、/usr/local/etc/dtcpc.authにパスワードを設 定します。dtcpc.authの各行は、ホスト名:ユーザ名:パ スワードの組からなります(リスト5)。
リスト5 /usr/local/etc/dtcpc.auth
dtcp.imasy.or.jp:mahoroba:パスワード

5. ipfwの設定

 ipfwでIPv4にファイアウォールを設定していますので、 IPv4でカプセル化されたIPv6パケットを許可する必要が あります。リスト6に/etc/ipfw.confの該当部分を示し ます。
 IPv4アドレスは固定ではありませんので、自ホストの IPv4アドレスにはmeを指定しています。meはちょっとコ ストが高いのですが、ホストのインタフェースに付いてい る全てのIPv4アドレスにマッチしてくれますので便利で す。ただし、ファイアウォールの内側のインタフェースに付いたアドレスにもマッ チしますので、場合によっては使い方に注意する必要が あるでしょう。
 ちなみに、筆者はfirewall_flags="-p m4"を指定して、 m4をによる前処理をおこなっています。
リスト6 /etc/ipfw.confでのgifの許可部分 (抜粋)
define(OIP, `me')
define(IMASYv6, `202.227.24.9')

	・	・	・

# Allow IPv6 over IPv4 tunnel
add allow 41 from OIP to IMASYv6
add allow 41 from IMASYv6 to OIP

6. IPv6のみでメールを受ける

 IPv4アドレスが固定でなくてもメールを受けることが できます。筆者は自宅のメールサーバで直接メールを受 けています*3)。ただし、これを実現するには、ちょっ とばかり+αの条件が必要になります。
 どこかに固定IPv4グローバルアドレスでメールを受け ることができるdual stackなセカンダリ MXを用意でき るのであれば、IPv6のみのネットワークにメールを配送 することができます。MXの設定例をリスト7に示します。
 この設定では、IPv6に対応したサイトからのメールは、 プライマリMXであるmx.mahoroba.orgに直接配送されま す。
 IPv4のみのサイトからのメールは、プライマリMXに送 ることはできませんので、セカンダリMXである casper.imasy.or.jpに配送されます。セカンダリMXになっ ているホストは、受け取ったメールが自ホスト宛でなけ れば、より優先順位の高いMXを持つホストに中継します。 これにより、プライマリMXであるmx.mahoroba.orgに配 送されます。
 ここで、もちろんセカンダリMXであるホストには当該 ドメイン宛のメールの中継を許可している必要がありま す。
リスト7 MXの設定例
mahoroba.orgのゾーンファイル:

mahoroba.org.		IN	MX	10	mx.mahoroba.org.
             		IN	MX	20	casper.imasy.or.jp.

mx.mahoroba.org.   	IN	AAAA	2001:200:301:0:240:c7ff:fe97:6f89


imasy.or.jpのゾーンファイル:

casper.imasy.or.jp.	IN	AAAA	2001:200:300:1:220:edff:fe88:788c
                   	IN	A	202.227.24.9

7. IPv6→IPv4トランスレータ

 IPv6のみのネットワークで十分生活できるようになっ てきていますが、外界はまだほとんどIPv4の世界です。 やはりIPv4 のみのWebも見たいというのが人情でしょう。 あるいはIPv4のみのホストにメールを出したりsshする 必要があるかもしれません。これを実現するのがIPv6→ IPv4トランスレータです。
 IPv6→IPv4トランスレータにはいくつか種類がありま すが、FreeBSDにはFAITH*4)が実装されています。

 FAITHでは,faithdというIPv6→IPv4トランスレータ・ デーモンをIPv6/IPv4のdual stackであるホストで動作 させておくと、IPv6のみのネットワークからIPv4世界に アクセスできるようにできます。
 あるいは、IPv4のみのサーバをIPv6世界に公開する目 的でも使用できます。

 FAITHではIPv4アドレスを特定のIPv6アドレスにマッ ピングさせます。そして、このアドレスプレフィックス をfaithdが動作しているホストに到達できるように経路 を設定します。クライアントからはこのマップされたア ドレスを使ってIPv6で通信します。

 faithdを動作させるホストでは、/etc/rc.confで

ipv6_faith_prefix="3ffe:505:2:ffff::"
という感じで、割り当てられているプレフィックスの内 で実際に使用していないアドレス空間を指定します。デ フォルトではプレフィクス長を96で設定します。これは、 IPv4空間全てを変換対象とすることを意味します。これに より、net.inet6.ip6.keepfaith=1が設定され、 3ffe:505:2:ffff::/96への経路がfaith0に向けられます。

 プレフィックス長を96より大きくしたい場合は、

ipv6_faith_prefix="3ffe:505:2:ffff::cae3:1a00/120"
という感じで指定できます。この例では、 202.227.26.0/24を変換対象とします。IPv6のみのネッ トワークからIPv4世界にアクセスする場合には、プレ フィックス長を96から変えることはあまりないと思いま すが、IPv4のみのサーバをIPv6世界に公開する場合には、 公開するサーバのアドレス範囲に絞る目的で使用すると 効果的でしょう。
 なお、5-CURRENTではfaithはcloned interfaceになっ ていますので、
cloned_interfaces="faith0"
を指定して、faith0を生成するようにしておく必要があ ります。

 faithdを動作させるホストではkernelに

pseudo-device faith 1
が組み込まれている必要があります*5)。GENERICには 最初から組み込まれています。

 実際の変換はfaithdがおこないますので、変換をおこ ないたいプロトコル毎にfaithdを起動しておきます。
 faithdの起動方法には、スタンドアロンでデーモンと して起動するモードと、inetdから起動するモードの2種 類があります。
 デーモンモードでは、

faithd ssh
あるいは、
faithd ssh /usr/sbin/sshd sshd -i
という感じで起動します。前者の例では FAITHのみを扱 います。それに対し、後者の例では、自ホストへの接続 の場合にはsshdを起動します。
 inetd起動モードでは、/etc/inetd.conf のプロトコ ル・フィールドにfaith/tcp6と指定します。あるいは、 IPv4射影IPv6アドレスで受けたい場合にはfaith/tcp46 となります*6)。加えて、サーバプログラムとして /usr/sbin/faithdを指定します。また、サーバプログラ ムへの第1引数に実際に起動したいサーバプログラムを 指定します。ここで、自ホストでのサービスをおこなわ ない場合は/sbin/nologinを指定しておくと良いでしょ う(リスト8)。
リスト8 /etc/inetd.conf でのfaithdの指定例
ftp	stream	faith/tcp6	nowait	root	/usr/sbin/faithd	ftpd -l
ssh	stream	faith/tcp46	nowait	root	/usr/sbin/faithd	/usr/sbin/sshd -i
https	stream	faith/tcp6	nowait	root	/usr/sbin/faithd	/sbin/nologin
 inetd起動モードで使用する場合は、 /etc/hosts.allowでfaithdを許可しておく必要がありま す(リスト9)。また、faithdから起動されるプログラム はtcp_wrappersで保護されません。つまり、faithdを併 用したサービスでは/etc/hosts.allowによる細かいアク セス制御はできません。
リスト9 /etc/hosts.allowの例
faithd : ALL@ALL : allow
 基本的にfaithdを動作させるホストでは他のサービス を動かさない方が良いでしょう。しかし、Apacheなどが スタンドアロンでデーモンとして動作しているホストで もfaithdを動かせなくはないです。この場合、faithdは wildcard bindを使用しますので、ポートが競合するデー モンはwildcard bindを使用できません。
 例えば、Apacheではhttpd.confでリスト10のように、 IPv6側はwildcard bindしないようにしておきます。ま た、sshdの場合の例をリスト11に示します。
リスト10 httpd.confの例
Listen ::1 80
Listen 3ffe:505:2:0:240:96ff:fe48:4ea8 80
Listen 0.0.0.0 80
リスト11 /etc/ssh/sshd_configの例
ListenAddress 0.0.0.0
ListenAddress ::1
ListenAddress 3ffe:505:2:0:240:96ff:fe48:4ea8
 なお、アプリケーションプロトコルでIPアドレスをや りとりするものは、FTPについてはサポートされていま すが、それ以外については基本的にfaithdで扱えません。

 FAITHを不用意にどこからでも利用できるようになっ ていると、IPv6世界からの不正利用ができてしまいます。 /etc/faithd.confでアクセス制御ができるようになって おり、これを防止することができます(リスト12)。

リスト12 /etc/faithd.confの例
::/0 deny 224.0.0.0/4
::/0 deny 0.0.0.0/8
::/0 deny 255.0.0.0/8
::/0 deny 127.0.0.0/8
2001:200:301::/48 permit 0.0.0.0/0
3ffe:505:2::/48 permit 0.0.0.0/0
 IPv4アドレスをIPv6アドレスにマッピングさせるため にはtotdというDNSプロキシを使用します.totdは、ク エリ対象のホストがAAAAレコードを持たない場合に、 FAITHで使用するように設定されたプレフィックスを補っ て返します(図2)。
図2 totdへのクエリ結果
ume@mille:202> nslookup -sil -type=aaaa tasogare.imasy.or.jp.
Server:         2001:200:301:0:200:f8ff:fe05:3eae
Address:        2001:200:301:0:200:f8ff:fe05:3eae#53

Non-authoritative answer:
tasogare.imasy.or.jp    has AAAA address 3ffe:505:2:ffff::cae3:1805

Authoritative answers can be found from:
imasy.or.jp     nameserver = tasogare.imasy.or.jp.
imasy.or.jp     nameserver = ns2.cyber-fleet.net.
imasy.or.jp     nameserver = light.imasy.or.jp.
 totdはports/packagesになっています。ただし、シグ ナルのハンドリングに若干問題があり、boot時に自動的 に起動できません。リスト13にパッチを用意しました。
リスト13 totd-1.2に対するパッチ
Index: ev_signal.c
diff -u ev_signal.c.orig ev_signal.c
--- ev_signal.c.orig	Thu Sep  7 05:28:36 2000
+++ ev_signal.c	Sun Nov 18 08:58:10 2001
@@ -94,7 +94,7 @@
 		SIGINT, ev_signal_initiator_generic, ev_handler_cleanup
 	},
 	{
-		SIGHUP, ev_signal_initiator_generic, ev_handler_cleanup
+		SIGHUP, SIG_IGN, NULL
 	},
 	{
 		SIGTERM, ev_signal_initiator_generic, ev_handler_cleanup
 totdの設定は/usr/local/etc/totd.confでおこないま す。forwarderに本当のDNSサーバのアドレスを指定しま す。forwarderは複数行指定できます。prefixにFAITHで 使用するプレフィックスを指定します。prefix行がない と、単なるDNSプロキシとして動作します。また、retry にリトライ秒数を指定できます(リスト14)。
リスト14 /usr/local/etc/totd.confの例
forwarder 2001:200:301:0:240:c7ff:fe97:6f89 port 53
forwarder 202.227.26.36 port 53
prefix 3ffe:505:2:ffff::
retry 30
 totdの起動は/etc/rc.confでおこなうと良いでしょう (リスト15)。
リスト15 /etc/rc.confの例
named_program="/usr/local/sbin/totd"
named_flags=""

おわりに

 今回は筆者の環境を紹介させて頂きました。IPv4アド レスが固定でなくてもIPv6接続するのにほとんど不自由 を感じていません。しかし、IPsec回りをやろうとする とやはりIPv4アドレスを固定したいなと感じる今日 この頃です。きっと、次号あたりまでには固定にしてい ることでしょう。


*1) トンネルを張るわけではないため、ここではgif_interfacesは使用できません。
*2) 最近、DTCPのドキュメントが発掘されました。 http://jazz-1.trumpet.com.au/ipv6-draft/dtcp-draft-prt-13-may-1999.htm そして、これにあるnetworkはtunnelrouteとまさに同じものであることが判りました。 というわけで、 http://www.imasy.or.jp/~ume/ipv6/dtcp/はnetwork でも受け付けるように修正をおこないました。
*3) DTCPサーバはクライアントのIPv4アドレスが変化したり接続が切れた場合、 該当トンネル関係のリソースを開放します。 DDNS環境でメールを受けるよりもはるかに安全だと思われますが、 やはり少しばかりリスクは伴います。
*4) RFC3142 - An IPv6-to-IPv4 transport relay translator
*5) 5-CURRENTではローダブルモジュール化されています。
*6) IPv4射影IPv6アドレスの使用はお奨めしません。


All Rights Reserved, Copyright (C) 2001, 2003 Hajimu UMEMOTO
Last Modified Feb 17, 2003
ume@mahoroba.org