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)
[go: Go Back, main page]

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