Linuxルータでフレッツ光ネクスト(NGN)のIPv6を運用する方法:IPoE(ネイティブ接続)+ひかり電話編

Unix系のOSをルータにしている場合に、NTT東日本が提供しているフレッツ光ネクスト(NGN)でIPv6を運用する際のTipsをまとめた。恐らくNTT西日本が提供しているフレッツ光ネクストでも同じような設定が利用できるものと思われる。また、今回はOSにUbuntu12.04を使用しているが、wide-dhcpv6-clientが利用できる環境であれば(おそらくBSD系でも)通用するものと思われる。


まず最初に確認すべき事はひかり電話の契約の有無である。ひかり電話が契約されている場合とされていない場合ではNGN側の動作が変わってくる。この記事ではひかり電話を契約している環境について説明する。ひかり電話無しの場合については後日改めて纏める。

ひかり電話を契約している場合、NGN網からは/48のプレフィックスをDHCPv6-PDで払い出してもらうことが出来る。ただし、これはISPのIPv6オプションを契約しておらず、グローバルに到達できないNTTのIPをもらう場合である。ISPとIPoEの契約をしてグローバルに使えるIPv6アドレスを払い出してもらう場合、ISPによりプレフィックス長が異なる可能性が有る。手元の環境(Nifty)では/56のプレフィックス長が払い出された。詳細は不明だが、ISPによってプレフィックス長が異なる可能性が有るので、事前に契約内容を確認した方が良い(契約時期によって異なるという説もある)。

一般的にDHCPv6-PDとルーティングには直接的な関係がないのだが、NGNの場合DHCPv6-PDの要求をしないとNGN網側のルーティングが行われないらしい。そのため、プレフィックスが判明してインターフェースに固定IPを設定した後も、ルータでDHCPv6のクライアントを走らせる必要がある。

DHCPv6-PDはwide-dhcpv6-clientで行うことが出来る。Ubuntuであればそのままの名前のパッケージが存在するので簡単にインストールできる。主となる設定ファイルは/etc/wide-dhcpv6/dhcp6c.confにある。また、DHCPv6クライアントを走らせるインターフェースの設定が/etc/default/wide-dhcpv6-clientに保存されている。

eth0をNGN網(ONU)と繋がるWAN側のインターフェースとすると、設定は以下のように行えば良い。この設定例では、前述の通りNGN網側でのルーティイングのためにDHCPv-PDをしているだけなので、取得したプレフィックスを他のインターフェースに設定していない。

interface eth0 {
        send ia-pd 0;
};
id-assoc pd {
};

LAN側のインターフェースに取得したプレフィックスから一部を払い出す場合は、id-assocを以下の例のようにする。ここではeth1がLAN側インターフェースである。

id-assoc pd 0 {
        prefix-interface eth1 {
                sla-len 0;
        };
};

sla-lenは追加のプレフィックス長である。NGN側から/48が払い出された場合、この例ではそのままそのプレフィックスをLAN側に使用する。/64などのプレフィックスを用いたい場合は16(=64-48)を設定する。

次にDUIDの生成を行う必要がある。DUIDはDHCPクライアントを識別するためのIDであり、通常はMACアドレスなどを元に自動で生成される。しかし、NGNが受け入れるDUIDは一般的な実装に比べて独特な仕様となっているので、今回は手動で生成を行わなければならない。まず、Jeffrey F. Blank氏が提供しているDUID生成スクリプト(wide_mkduid.pl)をダウンロードする。このスクリプトはMACアドレスをもとにDUID-LLというフォーマットのDUIDを生成してくれる。NGN網はUNI仕様書に書かれているとおり、このDUID-LLフォーマットのみを受け入れる。なお、wide-dhcpv6-clientが標準で生成するDUIDは恐らくDUID-LLTであり、そのまま使用するとDHCPv6サーバからの返答が全く得られない。つぎに、このスクリプトに次のパッチを当てる必要がある。これはDUIDに含まれるhardware typeを強制的に1に設定するためのパッチである。これはUNI仕様書にも書かれていないのだが、NGNのDHCPv6サーバはこの部分が1(Ethernet (10Mb))でないと正しく動作しない。ダウンロードしたスクリプトが生成したhardware typeが6(IEEE 802 Networks)のDUIDをNGNに投げると、応答メッセージではなぜか強制的に1に置き換わってしまう。DUIDの勝手な書き換えはRFC違反であり、wide-dhcpv6-clientは異常を検出して停止する。仕様書にも書かれていないNGN特有の不思議な挙動であるため、注意が必要である。

パッチを当ててスクリプトを実行するとdhcp6c_duidというファイルが生成されるので、Ubuntuであれば/var/lib/dhcpv6/ディレクトリに移動しておく。

以上でDHCPv6-PDの設定は完了である。あとは必要に応じてルーティングテーブルの設定などを行う。デフォルトゲートウェイは対向ルータのリンクローカルアドレスになるだろう。アドレスを確認したい場合はwide-dhcpv6-clientをデバッグモードで起動すれば良い。

sudo dhcp6c -Df -c /etc/wide-dhcpv6/dhcp6c.conf eth0

Ubuntuの場合、/etc/network/interfacesに以下のように書いておくと簡単である。

auto eth0
iface eth0 inet6 static
        address 2001:DB8::1 # WAN側のIP
        netmask 64
        gateway fe80::1  #対向ルータのアドレス

auto eth1
iface eth1 inet6 static
        address 2001:DB8:1::1 # LAN側のIP
        netmask 64