NGN IPv6への接続の設定(dhcp6, rtadvd)

昨日(6/2)に引き続き、SEIL/x86を使ってNGN IPv6インターネットに接続するための設定項目の詳細を紹介します。今日は、残りのdhcp6, rtadvdコマンドを解説します。

記事一覧

設定(再)再掲

NGN IPv6に接続するためのSEILの設定を再掲します。

 1. ppp add ipv6 keepalive none ipcp disable ipcp-address off ipcp-dns off ipv6cp \
    enable authentication-method chap identifier <ppp account> passphrase \
    <ppp password> tcp-mss auto
 2. interface pppoe0 ppp-configuration ipv6
 3. interface pppoe0 over lan1
 4. route6 add default pppoe0
 5. dhcp6 client enable
 6. dhcp6 client interface pppoe0
 7. dhcp6 client prefix-delegation subnet lan0 sla-id 0x1 enable
 8. dhcp6 server interface lan0 enable
 9. dhcp6 server interface lan0 dns add dhcp6
10. rtadvd enable
11. rtadvd interface lan0 enable
12. rtadvd interface lan0 other-flag on
13. rtadvd interface lan0 advertise auto
14. rtadvd interface lan0 advertise add interface-prefix

IPv6インターネット接続での設定情報の取得と配布

設定の解説の前に、NGN IPv6接続における各種設定情報の取得手段について説明します。

従来、IPv4でPPPoE接続を行う際は、

  1. PPPoEで上流のISPからIPアドレスひとつと、DNSサーバアドレス(典型的には2個)を受け取る
  2. ルータ自身でDNSプロキシを動作させ、LAN側にはDHCPでプライベートアドレスを払い出しつつ、自身のプライベートIPアドレスをDNSサーバのアドレスとして広報する

といった構成が一般的でした。しかし、IPv6 PPPoEではIPv6アドレスのプレフィクスやDNSサーバアドレスはPPP(oE)ではなくDHCPv6で配布されます。また、プライベートアドレスを使う必要のないIPv6では、DNSプロキシを使う必要もありません。その代わり、ISPが提供するDNSサーバをLAN側のPCが直接参照する構成をとることができます。

そのため、今回のIPv6 PPPoE接続では

  1. PPPoEで上流のISPとのIPv6の疎通を確保する
  2. DHCPv6で上流のISPからLAN内で使うIPv6アドレスプレフィクスを取得し、同時にDNSサーバアドレスも取得する
  3. Router Advertisementプロトコルを使ってIPv6アドレスプレフィクスをLAN内のPCに払い出す
  4. DHCPv6でLAN内のPCにISP提供のDNSサーバのアドレスを通知する

としています。

それではSEILの設定を見てゆきましょう。

dhcp6 clientコマンド

まずは、DHCPv6クライアント機能を有効にします。

5. dhcp6 client enable

次に、DHCPv6クライアント機能を動作させたいインタフェースを指定します。今回はPPPoE接続なのでpppoe0インタフェースになります。

6. dhcp6 client interface pppoe0

ここまでで、pppoe0インタフェースの先に存在するDHCPv6サーバから、DNSサーバ情報を取得できるようになりました。次に、DHCPv6サーバからIPv6のプレフィクス情報を取得するよう設定します。

7. dhcp6 client prefix-delegation subnet lan0 sla-id 0x1 enable

IPv4のPPPoEでは単一のIPアドレスか、あるいは/29等の比較的小さなプレフィクスを取得しましたが、IPv6ではかならずプレフィクスを取得することになります。このように、DHCPv6プロトコルを用いてプレフィクスを取得することをDHCPv6 Prefix Delegation (略してDHCPv6-PD)と呼びます。

また、subnet lan0 と sla-id 0x01 の各パラメータを指定することで

という設定になります。「SLA-ID」はあまりなじみのない用語ですが、ここではPrefix Delegationで上流から得た(/64よりも短かい)プレフィクスにこの sla-id で指定した値をくっつけて/64のプレフィクスをつくり、subnet で指定したインタフェースに割り当てるという意味になります。

以上で上流のISPからDNSサーバとプレフィクスの情報を取得できるようになりました。

dhcp6 serverコマンド

次は、上流から取得した情報をLAN内のPC等に配布するDHCPv6サーバ機能を設定する dhcp6 server コマンドです。今回はlan0インタフェースの先にPCが接続される構成なので、lan0インタフェースでDHCPv6サーバ機能を有効にするよう設定します。

8. dhcp6 server interface lan0 enable

そして、DHCPv6でDNSサーバ情報を配布するように設定します。

9. dhcp6 server interface lan0 dns add dhcp6

末尾の dns add dhcp6 の設定は、

という意味になります。dns add ... の後にはDNSサーバのIPv6アドレスを直接書くこともできます。例えば、DNSサーバが 2001:db8::beef:1 というアドレスで動作しているのであれば

dhcp6 server interface lan0 dns add 2001:db8::beef:1

と書きます。

rtadvdコマンド

最後はRouter Advertisementの送信を行うrtadvdコマンドの説明です。まずrtadvd機能を有効にします。

10. rtadvd enable

rtadvd機能は複数のインタフェースで同時に動作させることが可能です。今回はPC等がlan0インタフェースの元に接続されている構成なので、rtadvd機能がlan0インタフェースで動くよう設定します。

11. rtadvd interface lan0 enable

続けて、Router Advertisementを送出する際に"other configuration"フラグをセットするように設定します。

12. rtadvd interface lan0 other-flag on

"other configuration"とはわかりにくい名前ですが、要するに「このLANセグメントではDHCPv6プロトコルを使ってDNS サーバアドレス等の各種情報を取得できますよ」と宣言するものです。詳細についてはRFC4861を参照してください。

多くの環境では配布するプレフィクスについて特にひねった設定も必要ないので、SEILにおまかせの設定にしておきます。

13. rtadvd interface lan0 advertise auto

advertise auto を指定すると、rtadvd機能が動作するインタフェース(ここではlan0)に付与されているプレフィクスがそのまま配布されます。今回は dhcp6 client 機能のところで事前に

という設定をしてありますから、lan0にはDHCPv6クライアント機能で得たプレフィクスに0x01をくっつけて得られたプレフィクスが付与されています。したがって、そのプレフィクスがRouter Advertisementプロトコルで再配布されることになります。

14. rtadvd interface lan0 advertise add interface-prefix

最後のコマンドはRouter Advertisementで配布したいプレフィクスの詳細なパラメータを指定するためのものです。ただし、今回の設定例では意味を持ちません。詳細なパラメータを指定したい場合は、このコマンドにいくつかパラメータを追加した上でひとつ上の行の

rtadvd interface lan0 advertise auto

rtadvd interface lan0 advertise manual

と変更してください。advertise manual を指定すると、SEILにおまかせのプレフィクスではなく advertise add interface-prefix 以降で設定したプレフィクス情報が配布されます。さまざまなパラメータが指定できますので、SEILのコマンドリファレンスのrtadvdコマンドの項を参照して試してみてください。

以上でNGN IPv6に接続するためのコマンドの解説を終わります。SEILでは、今回説明した以外にもIPv6関連のさまざまな設定が可能です。SEILのコマンドリファレンスを参考に試してみてください。