Yamaha のルータで IPv6

次世代インターネットプロトコルなどと言われている IPv6 を使ってみたくなり、突撃実験室の Webサーバも IPv6 でアクセスできるようにしてみた。備忘録代わりに、そのときの設定をメモっておく。

本項は、どちらかといえば実務的かつ具体的な設定例という位置づけなので、原理的な説明は、ほとんどしていない。もっとも IPv6 は IPv4 と比べて遙かに簡単に使えるようになっているので、それはそれでいいのかなとも思う。むしろ、なまじ IPv4 の知識があったりすると、フクザツに考えすぎて詰まってしまうぐらいだから。

IPv6 で遊ぶためには、まず IPv6 のサービスを提供しているどこかの ISP と接続し、何よりも先に IPv6 を喋れるルータを用意しなければいけない。本来なら IPv6 native(あるいは dual stack)で接続したいところだが、これらはまだ一般的ではない。したがって、ISP との接続においては、IPv6 パケットを IPv4 パケットで包んでから IPv4 ネットワークに流す、トンネリング方式を使うことがほとんどだと思う。

トンネルの坑口には FreeBSD の gif なんかを使うこともできるが、当方は IPv6 スタックが実装されているヤマハのルータを使っているので、ここではヤマハの設定例を示す。

トンネルを掘る

トンネリングサービスに契約すると、トンネルの端点となる IPv4 アドレスが通知されてくる。仮想インタフェースとしてのトンネル自体は unnumbered にもなりうるが、当方が契約しているサービスでは、インタフェースとしてのトンネル自体に IPv6 アドレスを設定するよう指示があったので、以下例ではそのようにしている。トンネルの設定にあっては、ほとんどこれらのアドレスの打ち込むだけで、至って簡単だ。

tunnel select { 番号 }
tunnel encapsulation ipip
tunnel endpoint address { 自分の IPv4 アドレス } { ISP側の IPv4 アドレス }
ipv6 tunnel address { トンネルの IPv6 アドレス }
tunnel enable { 番号 }

↓具体例

tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address 210.xx.xx.xx 210.yyy.yy.yy
ipv6 tunnel address 2001:zzz:zzz:zzz::2/64
tunnel enable 1
経路の設定

経路は、とりあえず default gateway を、以上の設定によって貫通したトンネルに向けておけばいいだろう。ネットワーク的には、トンネルインタフェースの ISP側の IPv6 アドレスが gateway になるが、ヤマハの場合は、トンネルそのものを gateway として指定できるので、これでやるのが分かりやすい(unnumbered トンネルではこうやるしかないし)。

ipv6 route default gateway tunnel 1

ここまでの設定が正しければ、この時点で、少なくともルータ自体からの IPv6 通信はできるようになっているはずである。その確認には、ping6 を使う。IPv6 用の診断コマンドは、IPv4 のものとは意図的に分けてあるので、後ろに 6 が付く方でないとだめだ。

ping6 [ どこかの IPv6 アドレス ]

2001:zzz:zzz:zzz::1 (2001:zzz:zzz:zzz::1)から受信: シーケンス番号=0
2001:zzz:zzz:zzz::1 (2001:zzz:zzz:zzz::1)から受信: シーケンス番号=1
2001:zzz:zzz:zzz::1 (2001:zzz:zzz:zzz::1)から受信: シーケンス番号=2

といった具合に応答が帰ってくれば結果良好。

LAN側の IPv6 アドレス

次に、ローカルな物理インタフェースに対して、割り当てを受けた IPv6 アドレスを付ける。もちろん IPv4 アドレスとは別のものなので、それと競合することはない。とりあえず、IPv4 との習慣の違いも踏まながら、IPv6 アドレスの決め方を簡単に説明する。

IPv6 の世界にも、IPv4 の「ネットマスク」に相当する「プレフィックス長」という概念があるが、ネットワークの設計において、これを考慮する必要はほとんどない。なぜなら、普通のインターフェースに付くアドレスのプレフィックス長は、64ビット(/64)で固定されているからである。したがって、/48 アドレスの割り当てを受けていれば、割り当てアドレス部とホストアドレス部に挟まれた 16ビットがサブネット部分となり、論理上 65535 個のサブネットが作れることになる。IPv6 ネットワークにおけるアドレス設計は、極論するとほとんどこれを決める作業だけだ。

|<------- 128 bit IPv6 address ------>|
|                                     |
|   48 bit    16 bit      64 bit      |
|   assign    subnet   host address   |
|                                     |
|<----------->|<-->|<---------------->|
|             |    |                  |
aaaa:aaaa:aaaa:SSSS:hhhh:hhhh:hhhh:hhhh

残り 64ビットのホスト部で、論理上 1844京6744兆737億955万1616台のホストを識別できるが、PC を一台だけ繋げるネットワークでも、何千台も繋げるネットワークでも、これは同じである。論理上 340澗2823溝6692穣938じょ4634垓6337京4607兆4317億6821万1456 ものアドレスがある IPv6 では「大は小を兼ねる」が基本理念なので、ネットワークの規模に応じて、空間の大きさを変えるといった、ケチ臭いことはやらないのだ。ネットワーク設計上、とてもありがたいことである。

当方の割り当てアドレスは 2001:2a0:204::/48 で、ここでは サブネットに 1000(hex)を選んだ。したがって、ネットワークアドレスは 2001:2a0:204:1000::/64 になる。また、習慣的に default gateway となるルータには、セグメントの先頭アドレスを使っているので、ここでは 2001:2a0:204:1000::1 をルータに割り当てることにした。

ipv6 lan1 address 2001:2a0:204:1000::1/64

また、IPv6 においてはインタフェースに対してアドレスを何個でも付けられることになっているため、いったん設定した IPv6 アドレスは、上書きされない点に注意されたい。IPv4 では、それまでの設定とは異なるアドレスを指定すると「変更」として解釈されるが、IPv6 では「追加」になる。いらなくなったアドレスは、no コマンドで明示的に消さないといけない。

no ipv6 lan1 address 2001:2a0:204:1000::x/64
ルータ広告

インタフェースのアドレスを決めたら、次にやるべきなのが「ルータ広告」(router advertisement)の設定だ。IPv6 には、接続されたホストのアドレスを自動的に決定する plug and play 機能があり、ルータ広告とは、その際に必要な情報をルータから末端のホストに対して広告してあげる機能のことである。具体的には、ネットワークプレフィックスを定義し、それを送信するインタフェースを指定する。

ipv6 prefix 1 2001:2a0:204:1000::/64
ipv6 lan1 rtadv send 1

ルータの設定は、基本的にこれだけでいい。何らかのホストを繋げば、ルータ広告でアドレスを勝手に決定して、簡単に IPv6 で通信ができるようになるはずである。

2003/05/18 作成
制作 − 突撃実験室