IPv6 でアドレスの手動設定はイヤ

IPv6 では、ルータが送信する RA(Router Advirtisement:ルータ広告)の情報に含まれるプレフィックスから、自動的にアドレスが決定される、という話は有名です。実際、個人向け IPv6 で、ご家庭用ブローバンドルータを使った時に、端末側に振られる IPv6 アドレスは、まさにこの仕組みによるものです。

前回、おうちサーバには、IPv4 のプライベートアドレスに該当する ULA を手動で、グローバルなアドレスに関しては RA を受信した上で自動構成する、としました。

同じ事は、クライアント側にも当てはまります。

グローバルなアドレスは、ルータが広告する RA によって自動構成アドレスが付与されます。サーバと同様に ULA を手動で設定する、という事も可能ですが、はっきり言って、128 bit のアドレスを手入力するのは拷問です。まぁ、一度設定すれば変える事はないかもしれませんが、例えばノート PC のように、自宅外のネットワークにつなぐ事を考えた時、自動でアドレスが割り当てられるようにしていた方がベターです*1。

IPv4 で自動的にアドレスを割り当てるのは DHCP の役目ですが、IPv6 では基本的に RA の役目です。ところが、RA が IPv4 での DHCP の役割を置き換える事ができるかというと、

  • あくまでも、RA が通知しているのは「ネットワークアドレスはこれですよ」と「デフォルトゲートウェイはこれですよ」だけ。
  • 故に DNS サーバやドメイン名は範囲外。
  • 特定のホストに、毎度、同じアドレスを付与するようなまねはできない。

といった具合に、完全に力不足です。DNS に関して言えば、IPv4 の DHCP で付与すれば、それでも OK ですが、IPv6 の話をしている時に、DNS は IPv4 で、というのもちょっとどうかなぁ、と。IPv4 が全く使われない、という時代は遥か先*2なので、実用上はこれでも OK なのですが、そんなところで妥協するぐらいなら、ULA を付けてまで、おうちネットワークを IPv6 化する意味がない!

ということで、DHCPv6 の登場です。

DHCPv6 は単独では生きられない

正直、IPv4 の DHCP のように、DHCP サーバを正しく設定しておけば OK、という方が楽です。が、なぜか、DHCPv6 は、単独では意味を成しません。DHCPv6 はあくまで RA を補佐する役割であって、RA がすでに広告されている事が大前提です。

という事は、ULA で IPv4 での DHCP のような環境を作ろうとしたら、まずは、ULA のプレフィックスを RA で広告する必要があります。

実は、IPv6 のインターネット接続環境がやってくる前に、おうちサーバで RA と DHCPv6 をやらせていました。もっとも、おうちネットワークの外に IPv6 の経路が無いのに広告している、というイリーガルな状態でしたが、DHCPv6 でのアドレス配信はできていました。

IPv6 のインターネット接続環境がやってきた、ということは、RA を送出するのはルータの役目でなので、まずは、ルータに ULA のアドレスを認識させて、RA で広告するプレフィックスに ULA のプレフィックスを追加する、という必要があります。

RA に ULA プレフィックスを追加

具体的な手順は、ルータによって様々だと思います。実際は分かりませんが、LAN 側にルータの IPv6 アドレスを手動で追加すると、そのプレフィックスを自動的に広告してくれるかもしれません。

我が家のルータは Yamaha の NVR500 ですが、Web インタフェースからの設定方法が分からず、結局、テキストベースで config を投入することになりました。

ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 prefix 2 fdfe:dcba:9876:5432::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 address fdfe:dcba:9876:5432::1/64
ipv6 lan1 rtadv send 1 2

1行目、3行目は、lan2、すなわち、WAN 側から与えられたアドレスに関するもので、フレッツ光ネクストでひかり電話を使いつつ、IPoE で IPv6 を使えるように設定すれば入っている設定です*3。

2行目で ULA のプレフィックスを定義し、4行目でルータ自身の LAN 側の IPv6 アドレスに、ULA のアドレスを手動設定(ULA のプレフィックスで、末尾が 1 のアドレス)しています。

5行目が、RA を送信するための設定で、ULA を追加する前は「ipv6 lan1 rtadv send 1」となるところに、2行目で追加したプレフィックスも送信するように設定しています。

ひとまず、ここまでやれば、RA による自動構成アドレスがクライアントに付与される格好になります。

実は、ここまでで、いったん満足してました。とりあえず、ULA のアドレスが自動的に付与されるようになったし、これで、DNS を除けば、おうちのネットワーク IPv6 だし、と。

ところが、「ダメだ。やっぱり DHCPv6 が必要だ!」という事が発覚します。

きっかけは、おうちサーバで運用している Kerberos の認証で不具合が発生したことでした。

シングルサインオンの快感 - JULYの日記

自分で書いておいて、すっかり忘れていたのですが、MIT の Kfw を使わずに、Windows のネイティブの機能で非 Active Directory の Kerberos に対応させようとすると、Windows がクライアントのホストプリンシパルを要求する関係で、事実上、Dynamic DNS 必須になります。

RA で ULA を配信するようになると、ULA のプレフィックスを持つ IPv6 アドレスが2つ作られます。一つは MAC アドレスから生成される EUI-64 を使ったアドレス。もう一つは、一時アドレス(もしくは、匿名アドレス、プライバシーアドレス)と呼ばれる、都度、変化するアドレスです。

IPv6 の一時アドレス

もともと、IPv6 で「DHCP サーバを用意しなくても、自動的に IP アドレスが設定されます。」というのは、RA のプレフィックス情報と EUI-64 の組み合わせで生成する、というものでした。

EUI-64【イーユーアイ・ロクジュウヨン】 | 日経 xTECH(クロステック)

EUI-64 がどういう物かは上記ページに詳しく書かれていますが、ポイントは、MAC アドレスから生成される点で、MAC アドレスから生成されるということは、IPv6 アドレスの下位 64 bit を見れば、同じ PC から接続されている事が分かる*4ことになります。自宅から繋ごうが、ホテルから繋ごうが、公共のネットワークから繋ごうが、IPv6 アドレスの下位 64 bit が同じならば、同じ PC から繋いでると考えられます。

で、これはプライバシー上問題だ、ということで、一時アドレスと呼ばれるアドレスが作られます。こっちはランダムに割り当てられるので、どこへ行っても下位 64 bit が同じ、という事はありません。

で、この一時アドレスは、Dynamic DNS による DNS サーバへの登録から除外されます。

Windows ツールを使用して IPv6 構成情報を取得する

通常、一時的 IPv6 アドレスは、Web ブラウザなどの通信を開始するときにクライアント アプリケーションによって使用され、DNS に登録されません。

ということは、クライアント側が一時アドレスを送信元のアドレスとして選択してサーバへ接続すると、その IPv6 アドレスは DNS 上、存在しないことになり、前述の Kerberos の問題が発生します。

これ、おうちネットワークで問題が発生するのは私のところぐらいかもしれませんが、普通に企業内ネットワークを IPv6 で作った時に、一時アドレスが送信元では都合が悪い、という事は結構、ありそうです。

一時アドレスを一切使わない、という手段はあるようですが、目指すところは、

  • グローバルなアドレスは一時アドレスを使う。
  • ULA は一時アドレスを使わない。

です。で、手動でアドレスを設定すれば、この条件を満たせるのは分かるのですが、IPv6 で手動設定は、出だしにも書きましたが「拷問」です。

ということで、おうちネットワークで IPv6 アドレスを自動で割り当てたかったら、単に ULA を RA に乗せるだけでは事が足りない事が分かりました。

で、実際にどうするかは、次回へ*5。

*1:といっても、ULA のアドレス割り当てを自動にする明確なメリットは、せいぜい、「アドレス入力の間違いを無くせる」ぐらいですが。

*2:少なくとも、私が生きている間には、そんな時代は来ないかな、と。

*3:http://jp.yamaha.com/products/network/solution/flets/next/flets-next-ipv6_ipoe-nvr500/

*4:厳密には、同じ NIC から接続されていることが分かる。なので、例えば、同じ PC からでも有線と無線では違う。

*5:途中、「ということで、DHCPv6 の登場です。」と書いておいて、RA の話で終わってしまった...