Deprecated : The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
FreeBSDではじめるIPv6 第2回 (FreeBSD PRESS No.6)
FreeBSDではじめるIPv6 第2回
(FreeBSD PRESS No.6)
梅本肇 / ume@mahoroba.org
前回は初回ということで、IPv6の概要について簡単に
説明しました。今回は基本的なFreeBSD回りの設定につ
いて見ていきたいと思います。
1. kernelの設定
GENERIC kernelは最初からIPv6が有効になっています
ので、インストールした時点から標準的にIPv6が使用で
きます。
しかし、kernelをチューニングする人も多いと思いま
すので、IPv6関係の設定項目について説明しておきたい
と思います。
GENERICに最初から入っているIPv6関係の設定は以下
の3項目です。
options INET6
IPv6を使用します。必ず指定しましょう。
pseudo-device gif 4
IPv6およびIPv4のトンネルに使用する仮想デバイ
スです。トンネル接続を行う場合に必要です。*1)
pseudo-device faith 1
IPv6→IPv4トランスレータ用の仮想デバイスです。
faith(4)にに対して送られたパケットを捕えて
faithd(8)に渡します。IPv6→IPv4トランスレータ
を使用する場合に必要になります。
その他、IPsec関連で、
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG
IPv6用ファイアウォール関連で、
options IPV6FIREWALL
options IPV6FIREWALL_VERBOSE
options IPV6FIREWALL_VERBOSE_LIMIT=100
options IPV6FIREWALL_DEFAULT_TO_ACCEPT
が指定できます。また、6to4*2) 用の仮想デバイスと
して、
pseudo-device stf
があります。
IPv6は仕様的にIPsecが標準になっていますので、是
非IPsecを有効にして使って頂きたいと思います。
2. /etcの設定
おそらく典型的なネットワークは図1のようなものに
なるかと思います。hostAはルータノード、hostBはエン
ドノードです。また、hostCにより上流とトンネルによ
る接続をしています。家庭内LANなどではセグメントが
ひとつかもしれませんが、考え方は同じです。
図1: ネットワーク構成
IPv6にはアドレス自動設定機能があります。これによ
り、エンドノードは設定を簡略化できます。しかし、接
続するネットワークにRA*3) が流れていることが前提
です。つまり、少なくとも最初の1台は手動で設定する
ことになります。
RAを流すデーモンはrtadvd(8)です。rtadvd(8)はルー
タノードで動かすものですので、
net.inet6.ip6.forwarding=1でないと動かないようになっ
ています。つまり、アドレス自動設定機能を使用できる
ネットワークを構築するには、必ずルータノードを用意
することが必要です。
取り敢えずは、ネットワークインタフェースがひとつ
しかなくてもrtadvd(8)を動かすことができますので、
外部と接続されていないひとつのセグメントだけのネッ
トワークでも構築できなくはないです。
では、実際の設定を見ていきましょう。FreeBSDでは、
基本的にIPv6の設定もIPv4の設定と同じく、
/etc/rc.confで行うようになっています。デフォルトの
設定は/etc/default/rc.conf にあります。また、実際の
設定は/etc/rc.network6で行われます。*4)
2.1. ルータノード
最初の1台はルータノードとして設定する必要がある
ことを述べました。典型的なルータノードの設定例をリ
スト1に示します。では設定の詳細を見ていきましょう。
ipv6_enable="YES"
IPv6を使用する宣言です。
ipv6_network_interfaces="fxp0 fxp1"
ipv6_prefix_fxp0="3ffe:505:2:1000"
ipv6_prefix_fxp1="3ffe:505:2:1001"
ルータノードではIPv6アドレスは手動で設定する
必要があります。IPv6アドレスを振りたいインター
フェースをipv6_network_interfacesに指定し、各々
のインターフェースについて、
ipv6_prefix_インタフェース名
にプレフィックス部64ビットを指定します。*5)
ipv6_prefix_*を指定した場合、ホスト識別子に
はMACアドレスから生成されるEUIアドレスが使用さ
れます。ホスト識別子も含めて明示的に指定したい
場合は、ipv6_prefix_*の代わりにipv6_ifconfig_*
でIPv6アドレスを指定します。
ipv6_gateway_enable="YES"
ルータとして使用しますので、IPv6パケットをフォ
ワードするように指定します。この指定により、
net.inet6.ip6.forwarding=1が設定されます。
ipv6_router_enable="YES"
IPv6経路制御デーモンを起動したい場合、YESを
指定します。デフォルトで使用するデーモンは
route6d(8)です。他のデーモンを使用したい場合は、
ipv6_routerで指定します。
rtadvd_enable="YES"
rtadvd(8)を起動する場合、YESを指定します。
rtadvd_interfaces="fxp0 fxp1"
rtadvd(8)によりRAを流すインタフェースを指定
します。RAを流すインタフェースが
ipv6_network_interfacesと同じ場合は省略できま
す。
リスト1: ルータノードとしての設定例
ipv6_enable="YES"
ipv6_network_interfaces="fxp0 fxp1"
ipv6_prefix_fxp0="3ffe:505:2:1000"
ipv6_prefix_fxp1="3ffe:505:2:1001"
ipv6_gateway_enable="YES"
ipv6_router_enable="YES"
rtadvd_enable="YES"
rtadvd_interfaces="fxp0 fxp1"
2.2. エンドノード
RAが流れているネットワークにつなぐ場合は、エンド
ノードはアドレス自動設定機能を使用できます。この場
合の設定例をリスト2に示します。
リスト2: エンドノードとしての設定例
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ここで、ipv6_network_interfacesを明示的に指定し
ていますが、省略した場合、ifconfig -lが返すインタ
フェース一覧の最初のエントリをインタフェースとして
仮定します。多くの場合、省略しても動きます。しかし、
例えばkernelにVLANが組み込まれているなどの理由で必
ずしも希望のインタフェースが最初のエントリにあると
は限りませんので、明示的にipv6_network_interfaces
を指定することをお勧めします。
ipv6_network_interfacesに指定されたインタフェー
スに対する設定がipv6_prefix_*とipv6_ifconfig_*のい
ずれでも指定されていなかった場合、rtsol(8)を起動し、
アドレス自動設定を行います。
なお、RAが流れていないなどの理由で手動でIPv6アド
レスを設定したい場合もあるかと思います。この場合、
ipv6_prefix_*またはipv6_ifconfig_*で指定します。
アドレス自動設定では、まず、sysctl(8)を実行し
net.inet6.ip6.accept_rtadvを1に設定します。このMIB
変数を1にすると、RAが流れてきたら受け入れるように
なります。そして、rtsol(8)を実行することで、RS*6)
を送出し、RAを要求します。
ここで留意して頂きたいのは、rtsol(8)を実行しなく
てもRAが流れてくれば受け入れるという点です。これに
より、動的にネットワークのプレフィックスやデフォル
ト経路が変化したとしても自動的に追従でき
るようになっています。
RAを受け入れると、IPv6アドレスの設定と同時にデフォ
ルト経路も設定されます。RAの流れている異
なったセグメントに接続された複数のインタフェースが
あると、どのデフォルト経路を選択して良い
か判らなくなってしまいます。
このため、候補のインタフェースがひとつの場合のみ
アドレス自動設定を行うようにして、一応ガードを掛け
てありますが、あくまで不完全です。RAの流れている異
なったセグメントに接続された複数のイン
タフェースがある場合は、アドレス自動設定が動かない
ように、ipv6_network_interfacesで明示的に使用する
インタフェースを記述し、それらのインタフェースに対
して洩れなくipv6_prefix_*またはipv6_ifconfig_*を指
定するようにしましょう。
手動の場合、合わせてデフォルト経路の設
定も必要でしょう。デフォルト経路は
ipv6_defaultrouterで指定します。リスト3に手動によ
るエンドノードの設定例を示します。IPv6では一般的に
経路制御はリンクローカルアドレスで行いますので、
ipv6_defaultrouterにはリンクローカルアドレスを指定
しています。
リスト3: 手動によるエンドノードの設定例
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ipv6_prefix_fxp0="3ffe:505:2:1001"
ipv6_defaultrouter="fe80::220:edff:fe88:788c%fxp0"
2.3. 上流とのトンネル接続
最近は、生IPv6で接続できるプロバイダも出てきてい
ます。しかし、まだまだ現状においては、上流との接続
はIPv4でというサイトがほとんどでしょう。
IPv6 over IPv4 tunnelingと呼ばれる、IPv6パケット
をIPv4 でカプセル化してIPv4ネットワークを通す技術
があります。IPv6接続を提供しているサイトは一般的に
このトンネルによる接続を受け入れています。そして、
多くのサイトがトンネルを使用して、IPv6接続をしてい
ます。
トンネル接続には、gif(4)という仮想ネットワークイ
ンタフェースを使用します。gif(4) に対する設定は
gifconfig(8)で行います。*7)
/etc/rc.confでの設定例をリスト4に示します。ここ
で、
gif_interfaces="gif0"
gifconfig_gif0="202.227.26.33 202.227.24.9"
の部分がgif(4)トンネルを張っている部分です。
トンネルを張りたいgif(4)インタフェースフェースを
gif_interfacesに指定し、各々のインターフェースにつ
いて、ピアの始点と終点のIPv4アドレスを指定します。*8)
この例では、自ホストは202.227.26.33で
202.227.24.9 に対してトンネルを張っています。
トンネルの両端にグローバルIPv6アドレスを振ること
もできますが、一般的には振りません。gif(4)のIPv6ア
ドレスが必要な局面ではリンクローカルアドレスを用い
ます。
なお、グローバルアドレスを振る場合は、プレフィッ
クス長として128を指定します。IPv4の場合とちょっと
勝手が違いますので注意下さい。
また、始点と終点がそれぞれ同じホスト間ではトンネ
ルはひとつしか張れません。
トンネルの始点または終点となるノードは基本的には
IPv6ルータとなんら変わりません。ですから、他の設定
は基本的にルータノードとしての設定に準じます。
ipv6_router_enable="YES"として、経路制御デーモン
を起動しています。これにより、デフォルトでは
route6dが起動されます。一般的にはRIPngで経路制御を
行いますので、route6dで十分です。しかし、BGP4+や
OSPF6などで経路制御を行いたい場合、例えばZebraなど
に変更したいかもしれません。経路制御デーモンの変更
はipv6_routerで行います。*9)
ここで注意しなければいけないのは、サイト境界では
自サイトに割り当てられたアドレスを集約して出すとい
うことと、自サイトに割り当てられたアドレス以外の経
路を流出させないということです。
route6dでは-Aオプションで集約に含まれる特定の経
路をフィルタし、集約された経路を特定のインタフェー
スに公告するようにできます。
また、-Oオプションで特定インタフェースへの経路通
知を制限することができます。
リスト4の例では、外側のインタフェースであるgif0
について、3ffe:505:2::/48に集約し、3ffe:505:2::/48
以外を公告しないようにしています。
リスト4: 上流とのトンネル接続の設定例
gif_interfaces="gif0"
gifconfig_gif0="202.227.26.33 202.227.24.9"
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ipv6_prefix_fxp0="3ffe:505:2:1000"
ipv6_gateway_enable="YES"
ipv6_router_enable="YES"
ipv6_router_flags="-A 3ffe:505:2::/48,gif0 -O 3ffe:505:2::/48,gif0"
rtadvd_enable="YES"
rtadvd_interfaces="fxp0"
/etc/rc.confにはこれまで述べた以外の設定項目もあ
りますが、それらについてはまた別途紹介していきたい
と思います。
2.4. ノートPCでの設定
これまで見てきましたように、boot時のIPv6の設定は
/etc/rc.network6によって行われます。しかし、ノート
PCの場合、boot時にはネットワークカードはまだ認識さ
れていません。ネットワークカードが認識された時点で、
/etc/pccard_etherによって設定されます。
ここで問題が生じる可能性があります。機種やタイミ
ングによって、/etc/rc.network6実行時に既にネットワー
クカードが認識されている場合があります。この場合は
実害は少ないと思われます。問題は、認識されていない
場合です。
ipv6_network_interfacesは指定されていなかった場
合ifconfig -lの結果から推測されると述べました。ネッ
トワークカードが認識されていない状態ではおそらくほ
とんどの場合lo0が選択されるでしょう。
ここでひとつ問題があります。4.3-RELEASEまでは、
選択されたインタフェースをデフォルト・インタフェー
スとして設定していました。このためlo0が選択されて
しまいます。あるいは、目的のインタフェースが選択さ
ているかもしれません。IPv6が使える環境であれば問題
は生じないのですが、この状態では、RAが流れていない
ネットワークでIPv4のみで使おうとすると、AAAA RR*10)
があるホストに対してのIPv4での接続に非常に時
間が掛かる、あるいは接続できないということが最近判
明しました。そのため、現在の4-STABLEではデフォルト
をipv6_default_interface="NO"つまり、デフォルト・
インタフェースを設定しないというように変更しました。
モバイルで使うノートPCでは、いつもIPv6を使えるとい
うわけではありませんので、困る場合も出てくると思わ
れます。デフォルト・インタフェースを設定してもほと
んどの場合メリットはありません。4.3-RELEASE以前を
お使いの方は、ipv6_default_interface="NO"を明示的
に設定されることをお勧めします。
また、デフォルト・インタフェースの設定以外につい
ては、lo0が指定されていた場合には無視するようになっ
ています。ipv6_default_interface="NO"に加えて、意
図せぬインタフェースが選択されないよう明示的に
ipv6_network_interfacesにlo0を指定し、
/etc/rc.network6 側でインタフェースが初期化されない
ようにしておくと良いでしょう。(リスト2)
将来的にはこの辺はもうちょっと改善したいと思って
います。
リスト2: エンドノードとしての設定例
ipv6_enable="YES"
ipv6_network_interfaces="lo0"
ipv6_default_interface="NO"
なお、/etc/pccard_etherが行うのは単一のネットワー
クカードに対する設定のみということに留意下さい。エ
ンドノードでアドレス自動設定を用いている限りはデフォ
ルト経路の設定も自動的に行われますからこれで大丈
夫ですが、システム全体に対する設定ができないので
ちょっと困るケースもあるかもしれません。最近の
/etc/pccard_etherでは、ネットワークカード認識時用
に、
/etc/start_if.インタフェース名
停止時用に
/etc/stop_if.インタフェース名
というファイル名でスクリプトを置くことがでるように
なっています。現状では、デフォルト経路の設定など
はこれらのスクリプトで行うようにするなど工夫して下
さい。(リスト3, 4, 5)
ちなみに、リスト5ではデフォルト経路を明示的に
削除していますが、インタフェース消失時にkenrelがそ
のインタフェース関係する経路を削除しますので、実際
には、なくても大丈夫なはずです。
リスト3: 手動によるエンドノードの設定例
ipv6_enable="YES"
ipv6_network_interfaces="lo0"
ipv6_default_interface="NO"
ipv6_prefix_wi0="3ffe:505:2:1001"
リスト4: /etc/start_if.wi0の例
route add -inet6 default fe80::220:edff:fe88:788c%wi0
リスト5: /etc/stop_if.wi0の例
route delete -inet6 default
3. 使用するIPv6アドレス
ここで少し実際にネットワークを組む際に使用する
IPv6アドレスについて考えてみたいと思います。
あなたのサイトが外部のIPv6ネットワークに接続して
いるなら、既にグローバルなIPv6アドレスを取得してい
るはずですので、ネットワーク管理者に相談してIPv6ア
ドレスをもらいましょう。
問題は、まだあなたのサイトが外部のIPv6ネットワー
クにつながっていない場合です。
IPv4では外部と接続のないネットワークを構築するた
めに、プライベートアドレスが使用できます。
IPv6にはサイトローカルアドレスというサイト内で使
用するためのアドレスがあります。しかし、残念ながら、
サイトローカルアドレスにはスコープの概念があり、グ
ローバルアドレスの代用にはなりません。
是非ともグローバルなIPv6アドレスを取得して使用し
て頂きたいところですが*11) 、サイトの事情等でどう
しても無理な場合は、6to4アドレスを使うことが提案さ
れています。*12)
ここでは6to4の詳細には触れませんが、6to4はIPv6を
IPv4にカプセル化して流すトンネル技術のひとつです。
6to4では、IPv4アドレスから一意に導出されるIPv6
アドレスを予約しています。先頭16ビットが2002で、次
の32ビットがIPv4アドレスの16進数表現となります。
例えば、IPv4アドレスが202.227.26.34の場合、
2002:cae3:1a22::/48が6to4アドレスとして予約されて
いることになります。(図2)
図2: 6to4アドレス
2002:cae3:1a22:0000:0000:0000:0000:0001
^^^^ ^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^
| | | |
| | | +-- インタフェース識別子
| | +--------------- SLA識別子
| +---------------------- IPv4アドレスの16進数表現
+------------------------------ 6to4プレフィックス
つまり、IPv4アドレス1個に対して、既に/48の空間が
割り当てられていると見ることができます。
正式に割り当てられたグローバルIPv4アドレスを持っ
ている限り、このアドレス空間は他と競合することがあ
りませんので、安心して使用することができます。
ただし、6to4アドレスは使い方が決められたアドレス
です。外部に流出することがないよう注意して使用して
下さい。
6to4はFreeBSDでも利用できます。もちろん、6to4を
使用して外部と接続することもできます。しかし、少な
くとも日本においては比較的簡単にIPv6接続ができる環
境が整っていますので、わざわざ6to4を使用する必要性
はあまりないでしょう。興味のある方はman stfしてみ
て下さい。
おわりに
今回は、FreeBSDでのIPv6の基本的な設定について説
明しました。次回は、6bone-JPへの接続と、DNSの設定
についてお話したいと思います。
*1)
5-CURRENT, 4-STABLEではgif(4)は動的に生成され
るようになり、個数 を指定する必要はなりました。
*2)
RFC3056 - Connection of IPv6 Domains via IPv4 Clouds
*3)
RA - ルータ通知 (Router Advertisement)
*4)
最近の4-STABLE, 5-CURRENTでは、gif(4)は必ずし
もIPv6だけのものではないという理由から、
gif(4)回りの設定は/etc/rc.networkに移されてい
ます。
*5)
IPv6では基本的に全てのサブネットのプレフィッ
クス長は64ビットです。
*6)
RS - ルータ要請 (Router Solicitations)
*7)
4-STABLEでは、ifconfig gifN tunnelで行うよう
になっています。将来的にgifconfig(8)をなくし
てしまうかもしれません。加えて、
gif(4)は動的に生成されるようになりましたので、
ifconfig gifN createでgifNを生成して使用しま
す。4.4-RELEASEにはこれらの機能が含まれるでしょ
う。もちろんこの辺は/etc/rc.network で隠蔽され
ていますので、/etc/rc.confで設定している限り
何も考える必要はありません。
*8)
gif(4)はIPv6 over IPv4だけのものではありませ
んので、IPv6アドレスを指定することもできます。
*9)
Zebraは複数のデーモンから構成されますから、実
際にはもうちょっと複雑です。Zebraを使う場合、
/usr/local/etc/rc.dから起動するようにした方が
良いかもしれません。
*10)
ホストのIPv6アドレスを指定するDNSのレコード
*11)
最近はいくつかのISPが商用サービスを開始してい
ます。また、6bone-JP
(http://6bone-jp.v6.wide.ad.jp/ ) に参加するこ
ともできます。
*12)
draft-itojun-ipv6-local-experiment-02.txt
All Rights Reserved, Copyright (C) 2001 Hajimu UMEMOTO
Last Modified Aug 23, 2001
ume@mahoroba.org