WIDE Technical-Report in 2008 USAGIプロジェクト 可変的なアドレス選択ポリシの設計 wide-tr-usagi-addrpol-01.txt WIDE Project: http://www.wide.ad.jp/ If you have any comments on this document, please contact to ad@wide.ad.jp. Title: USAGIプロジェクト 可変的なアドレス選択ポリシの設計 Author(s): USAGIプロジェクトコアメンバ (usagi-core@linux-ipv6.org) Date: 2008/01/17 X-Id: $Id: wide-tr-usagi-addrpol.txt,v 1.14 2008-01-17 01:56:26 yoshfuji Exp $ * ソケットAPIと自動端点選択 通信アプリケーションの作成に広く使われているソケットAPIでは、 上位層が端点(アドレス,ポート番号)を詳細に指定することなく、 接続を確立したり、メッセージを送信したりすることができる。 IPv6時代では、利用可能が端点の組合せが複数存在することが一般的であり、 そのための基礎的な送信元及び宛先アドレスの決定(*1)の方法がRFC3484 Default Address Selection for Internet Protocol version 6 (IPv6) として 規定されている(*2)。 *1: アドレス選択という。 *2: IPv4でも同様の議論は可能であるが、基本的には同文書の範囲外である。 アドレス選択は、宛先アドレス選択(destination address selection)と 送信元アドレス選択(source address selection)に大別される。 * 従来実装 Linux実装では、送信元アドレス選択はカーネルに実装されている。一方、 宛先アドレス選択はC言語ライブラリであるglibcのgetaddrinfo(3)関数に 実装されており、必要な送信元アドレスに関する情報をカーネルから取得 して行われる。 ** 送信元アドレス選択 Linuxの送信元アドレス選択は、RFC3484に規定されたすべてのルールを実装している。 アドレス選択ポリシテーブルはRFC3484で強く推奨されるような可変的なものとは なっていないが、RFC3484刊行後に定義されたアドレス空間をうまく扱えるように 拡張されている。 プレフィックス ラベル 注釈 ---------------------------------------------------- ::1/128 0 ループバックアドレス ::/0 1 デフォルト 2002::/16 2 6to4アドレス ::/96 3 IPv4互換アドレス ::ffff:0:0/96 4 IPv4写像アドレス fc00::/7 5 ULA(RFC4193)アドレス(*) 2001::/32 6 Teredo(RFC4380)アドレス(*) *: Linux拡張 実装では、効率化を特に重視している。 送信元アドレス選択では、そもそも対象となるアドレスの種別やスコープの判定の ためにアドレス種別判定関数である__ipv6_addr_type()を利用しているが、ラベル 判定でもその結果を再利用している。 ** 宛先アドレス選択 宛先アドレス選択に関しては、glibc-2.5以降が対応しており、 ポリシテーブルの設定は、/etc/gai.conf ファイルによって行なうことができる。 カーネルからラベルに関する情報を得ることができないため、 この設定ファイルには優先度に加え、ラベルに関する設定も記述される。 また、設定ファイルは頻繁に変更されることを想定はしておらず、 デフォルトでは最初の実行時に一度だけ読み込まれるだけである(*3)。 デフォルトでの設定は以下の通りである。 プレフィクス ラベル 注釈 ---------------------------------------------------- ::1/128 0 ループバックアドレス ::/0 1 デフォルト 2002::/16 2 6to4アドレス ::/96 3 IPv4互換アドレス ::ffff:0:0 4 IPv4写像アドレス fec0::/10 5 サイトローカルアドレス(*) fc00::/7 6 ULAアドレス(*) 2001::/32 7 Teredoアドレス(*) プレフィクス 優先度 注釈 --------------------------------------------------- ::1/128 50 ループバックアドレス ::/0 40 デフォルト 2002::/16 30 6to4アドレス ::/96 20 IPv4互換アドレス ::ffff:0:0/96 10 IPv4写像アドレス *: 拡張 *3 設定ファイルに reload yes と記述することによって、実行毎に 設定ファイルを再解析するようにできる。ただし、glibc-2.7より前の バージョンには不具合があり、正しく動作しない。 * Linuxにおける可変的選択ポリシの設計と実装 従来のLinux実装は、RFC3484の最小限度のもので、強く推奨されている 可変ポリシが実現されていなかった。このため、マルチプレフィックスで マルチホームの環境では問題が発生する場合があると指摘されていた(*4)。 *4 Matsumoto, A., "Problem Statement of Default Address Selection in Multi-prefix Environment: Operational Issues of RFC3484 Default Rules", Internet Draft, draft-ietf-v6ops-addr-select-ps-02.txt, October 2007. 固定的な環境であれば、カーネルをコンパイルしなおし、ユーザランド側の 設定ファイルを設定することで原理的には対応可能であるが、すべての 利用者にそれを求めることは現実的でなく、特に、DHCPによるポリシ配布を 行なう場合などは致命的である。 このため、Linuxにおいても可変ポリシを実装することとした。 ** ポリシテーブル定義 アドレス選択ポリシテーブル検索のためのキーとしては、従来のプレフィクスに 加え、出力インタフェースも使えるようにする。 得られるラベルは32ビットの非負整数値(*5)、優先度は整数値とする。 *5 0xffffffffは予約されており、利用できない。 優先度とラベルの機能分離を意識し、優先度はユーザ側で管理し、 また、ラベルはカーネルで管理する。 ** カーネル実装 カーネル内において、ラベル情報はプレフィクスの長い順にソートされた リスト構造で管理される。これは、選択ポリシは現状ではそれほど大きくないと 想定されるためであるが、仮に大きなポリシが必要となった場合には、 より効率のよいデータ構造を導入することもできる。 リストの読み取りは効率よく行なえるようにすることが重要である。 このため、 RCU (Read-Copy-Update) による排他制御を採用した。 また、従来のLinux実装と同様、アドレス種別判定結果をできるだけ 活用することとした。 また、更新回数を管理してユーザ空間に提供することで、ポリシテーブル解析の 効率化を図っている。 IPv4写像アドレスに対するラベル設定は、本質的にIPv4アドレスに対する ラベル管理として扱うべきものであるため、カーネル側では無効である。 ** インタフェース カーネルとユーザ空間とのインタフェースとしては、netlink(7)を用いる。 変更が加えられた場合にのみ結果を再評価すればよいようにした。 ** ユーザ空間実装 カーネル内の設定を操作する基礎的ツールとして、iproute2を改変して用いる。 * 今後の展開 Linuxにおける可変的な送信元アドレス選択の実現に関しては、 カーネル部分は2.6.25でサポートされる見込みである。 また、glibcでの宛先アドレス選択における可変的な送信元アドレス選択との 連携、/etc/gai.conf の書き換え中の問題回避策については、現在検討・ 実装中である。 これらの機能を活用することにより、DHCPv6を用いたアドレス 選択ポリシの配布(*6)などにも対応することができるようになる。 *6 Fujisaki, T., Matsumoto, A., Kato, J., "Distributing Address Selection Policy using DHCPv6," Internet Draft, draft-fujisaki-dhc-addr-select-opt- 05.txt, Nov 2007. * 付録 ** KAME実装 KAME実装においては、プレフィクスに対するラベル及び優先度を カーネルに保持する。ラベルおよび優先度はともに整数である。 この情報はsysctl(2)およびioctl(2)によって設定、取得することができ、 操作のためのツールとして ip6addrctl(8) が提供されている。 getaddrinfo(3)は、カーネルからその都度ポリシを取得して動作する。 カーネルにはRFC3484のデフォルトポリシを保持しておらず、 起動時に起動スクリプトによってユーザスペースから設定される。 ** Solaris Solarisにおいては、プレフィクスに対するラベル及び優先度を 設定することができる。ラベルは文字列(最大15文字)であり、 優先度は非負整数である。操作のためのツールとしてipaddrsel(1M)が 提供されている。 ---- Copyright Notice Copyright (C) USAGI/WIDE Project (2008). All Rights Reserved.