Mobile IPv6 for Linux ガイド(with USAGI patch)

[English version]


イントロダクション

このドキュメントは,Linux 上で Mobile IPv6(MIPv6) を設定するためのチュートリアルである.

このドキュメントでは,基本的なカーネルコンフィグレーション,IPv6 ネットワークのオペレーション,設定経験,MIPv6 に関する基礎知識があることを作業の前提としている. IPsec を使いたい場合は,IPsec の基本的な知識と,IPv6 のトンネルゲートウェイの設定経験も必要になるだろう.

まずはじめに,既知の問題を参照してほしい.

古い情報はumip-0.3またはumip-0.1ページに移動した.


必要なソフトウェアについて

HA, MN, CN のすべてで必要なソフトウェア

HA で必要なソフトウェア

  • radvd

HA と MN で必要なソフトウェア

  • IPsec-Tools (RFC3776にしたがって IPsec を使用する場合))

カーネルと mip6d のビルド

  • カーネル
    • カーネルのコンフィグレーションについては mip6d の tar-ball に同梱のINSTALL.kernelを参照し,ビルドを行う.
  • mip6d
    • mip6d に同梱のとINSTALLを参照し,mip6d のビルドを行う. デバッグオプション "--enable-vt" を使用してコンパイルしている事を確認して欲しい.

設定

mip6d のインストール後は,mip6d.conf(5)を参照することにより,設定に有効な情報を入手する事ができる.

HA 固有の設定

  • ルータの設定: HA は,forwarding=1 など,ルータとしての設定がなされているべきである.
  • プロキシ近隣探索: HA は,proxy_ndp=1 として,プロキシ近隣探索が有効とされるべきである (ホーム戻りをサポートするために必要).
  • IPsec: IPsec の設定を参照のこと.
  • mip6d: mip6d.conf(5)を参照のこと. HA の設定ファイルの例をmip6d-ha.confに示す.
  • ルータ探索: HA が送信する RA には,以下の情報が含まれるように設定する.
    • "Home Agent (H) bit"
    • "Router Address (R) bit",HA のアドレス(いずれも prefix information の設定). もし radvd を使うつもりならば,詳細は radvd.conf(5) も参照して欲しい.設定例をradvd.confに示す.
    • (必要に応じて): RA の送信間隔は小さく設定する事を推奨する.このことは,MN の移動先となる外部リンクでも同様である.

MN 固有の設定

CN 固有の設定

  • mip6d の設定についてはmip6d.conf(5)を参照の事.設定例を mip6d-cn.confに示す.

IPsec の設定

  • [HA,MN の場合]mip6d の tar-ball に同梱のREADME.IPsecを参照のこと.設定例を setkey.confに示す.

起動手順

HA の起動手順

  1. mip6d を起動する前に,以下の条件が成立していることを確認する.
    • ルータとして起動できること.
    • プロキシ近隣探索が有効であること.
    • HA のアドレスとして,グローバルユニキャストアドレスがホームリンクのインタフェースに設定されていること.
    • IPsec SA が設定されていること(IPsec を鍵の手動設定で使用する場合)
  2. mip6d を起動する.
  3. mip6d 起動後に,
    • ルータ探索を開始する.

上記を行う起動スクリプトの簡単な例をmipv6-ha.shに示す.

MN の起動手順

  1. mip6d を起動する前に,以下の条件が揃っているか確認する.
    • mip6d が起動する前に,mip6d が使用するネットワークインタフェースが起動していること.
    • IPsec SA が設定されていること(IPsec の鍵を手動設定で使用する場合).
  2. これらの状態が確認できたら,mip6d を起動する.

起動スクリプトの簡単な例をmipv6-mn.shに示す.

CN の起動手順

  1. mip6d を起動する.

起動スクリプトの簡単な例をmipv6-cn.shに示す.

それ以外の例

  • LSBを用いた実験的な mip6d 起動スクリプト (Debian ディストリビューション用)

動作確認

起動確認

  • mip6d は起動または終了メッセージを syslog に出力するので,それで確認することができる.
  • [HA の場合] telnet により,mip6d の内部情報を確認することができる.
      $ telnet localhost 7777 
      Trying ::1... 
      Trying 127.0.0.1... 
      Connected to ip6-localhost. 
      Escape character is '^]'. 
      mip6d> pl
      eth1 3ffe:501:ffff:100:200:ff:fe00:a0a0/64
       valid 2591997 / 2592000 preferred 604800 flags OAR 
      mip6d>

ここで,valid の値が正の値で確認できれば,HA は MN からの BU を受け付けることができる.そうでない場合は,radvd の設定を見直して,正しく表示されるようにする.

Binding cache の確認

  • telnet により,mip6d の内部の Binding cache を確認することができる.
      $ telnet localhost 7777 
      Trying ::1... 
      Trying 127.0.0.1... 
      Connected to ip6-localhost. 
      Escape character is '^]'. 
      mip6d> bc 
      hoa 3ffe:501:ffff:100::1 status registered 
       coa 3ffe:501:ffff:102::1 flags AH-- 
       local 3ffe:501:ffff:100:200:ff:fe00:a0a0 
       lifetime 998 / 1000 seq 58722 unreach 0 mpa - / 0 retry 0 
      mip6d>

Binding cache が正常に作成されている場合は,"status" の所に状態が表示される.

  • registered: HA で,Home registration が成功した場合
  • cached: CN/MN で,Binding cache が正常に作成された場合

Binding update list の確認

  • [MN の場合] telnet により,mip6d の内部の Binding update list を確認することができる.
      $ telnet localhost 7777 
      Trying ::1... 
      Connected to localhost. 
      Escape character is '^]'. 
      mip6d> bul 
      == BUL_ENTRY == 
      Home address 3ffe:501:ffff:100::1 
      Care-of address 3ffe:501:ffff:102::1 
      CN address 3ffe:501:ffff:100:200:ff:fe00:a0a0 
       lifetime = 262140, delay = 249033000 
       flags: IP6_MH_BU_HOME IP6_MH_BU_ACK 
       ack ready 
       lifetime 262124 / 262140 seq 26633 resend 0 delay 249033(after 249017s) 
       mps 214747931 / 214747947 
      mip6d>
  • MN が BU を送信した場合,HA/CN のそれぞれに対してエントリを確認することができる.Home registration の完了については,ha で始まるエントリの "ack" の値が ready となっていることを確認すればよい.

経路最適化の確認

経路最適化を簡単に確認する方法は(TAHIテストを用いるか,パケットをダンプすることにより確認する以外には)難しい.しかし,USAGI git ツリーに含まれている ping6 を使用すると,受信した echo reply が経路最適化されているかどうかは確認することができる.

  • USAGI git iputils-mip6 ツリーから,ping6 を準備する.
  • ping6 に "-H" オプションを使用して,受信した ICMP echo reply に拡張ヘッダが付与されているかどうかを確認する.

例:

  • [HA,CN の場合] 経路最適化された echo reply を MN から受信する場合.
      $ ping6 -H -I HACN_ADDR MN_ADDR 
      ... 
      64 bytes from MN_ADDR[HAO]: icmp_seq=1 ttl=61 time=1.04 ms
  • [MN の場合] 経路最適化された echo reply を HA,CN から受信する場合.
      $ ping6 -H HACN_ADDR 
      ... 
      64 bytes from HACN_ADDR[RT2]: icmp_seq=1 ttl=61 time=1.04 ms

既知の問題

カーネルサポート状況

メインラインのカーネルサポート状況を記す(2.6.23時点).

ノード基本動作IPsec トランスポートIPsec トンネル
HAOK *1OK *1OK *3
MNOK *2OK *4OK *4,*3
CNOK *1- *5,*1-
  • *1: 2.6.19 以降
  • *2: 2.6.22 以降 (送信元アドレスを指定したルールの利用と送信元アドレス選択機能,の協調動作のサポート)
  • *3: 2.6.21 以降 (PFKEY_MIGRATE のサポート)
  • *4: 2.6.22 以降 (IPsec 連携の修正 ; 上位レイヤ情報をバンドルで限定する)
  • *5: トランスポートモード IPsec 上の経路最適化は動作する

既知の問題

  • [MN] MN間通信において両者の BCE が準備できる前に誤って双方向の経路最適化を行う
    この問題は以下の手順で再現する:
  1. 2つの MN が外部リンクにいて,両方ともバインドしている.言い替えれば双方向の経路最適化 (IPv6-RH2-HAO) の通信が成功している.
  2. MN(a) が別の外部リンクに移動する.
  3. MN(a) が,もう一つの MN(b) へのバインドを完了する前に, MN(b) が単方向の経路最適化 (IPv6-IPv6-HAO) の echo request を送信する.
  4. MN(a) がその echo request を受信すると,echo reply を誤って双方向の経路最適化で返信する.
  • [HA,MN,CN] 経路最適化での TCP 問題 (USAGI カーネルパッチあるいは2.6.24で修正される): ノードが TCP 接続を経路最適化しないで開始する時,経路最適化がカーネルに準備できた後であっても,誤って経路最適化しないでその接続を続けてしまう.この問題は IPsec 上の TCP でも起こる.
  • [HA] HA が IPsec トンネルされたパケットに誤ってリダイレクトを送信する(USAGI カーネルパッチあるいは2.6.24で修正される): IPsec トンネルゲートウェイで,IPsec トンネルされたパケットが到着したネットワークデバイスと,デカプセルしたパケットが送信されるデバイスが同じ時,ルータか送信元へ不正にリダイレクトを送信する.
  • [MN] IPsec トンネルの設定の "TunnelMh" と "TunnelPayload" は動作しない: これは,XFRM セレクタを if-index 無しで使うようなカーネルの変更をデーモンが未だサポートしていないためである.
  • [MN] MN が経路最適化パケットをデフォルトルータの MAC アドレスへ送信する (USAGI git(linux-2.6.24-mip6ブランチ以降)で修正される あるいは2.6.26に予約されている): MN が CN と同一のリンクに居る時, MN は NS を送らずに, CN への経路最適化パケットを,CN の MAC アドレスではなくデフォルトルータの MAC アドレスへ送る (そのルータによりパケットは CN へ転送されるかもしれない).
  • [MN] MN が CN をターゲットにしているリダイレクトを学習しない: MN と CN が同じリンクに居て MN が CN 上に BCE を作成した時,そのリンク上のルータから CN をターゲットにしているリダイレクトを受信しても MN はその CN への近隣キャッシュを作成しない.
  • [MN] MN が初回ブート時に HA 宛の BU を内部でブロックする: (詳細の条件は特定できていないが) IPsec が無効の時または "HomeRegBinding" と "MobPfxDisc" 有りで IPsec が有効の時に起こる. これはデーモンを再開することで修正できる.

リンク