アドレス - みる会図書館


検索対象: UNIX MAGAZINE 2005年2月号
49件見つかりました。

1. UNIX MAGAZINE 2005年2月号

ー 0 図 15 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 904 905 906 907 908 909 910 911 912 913 914 915 860 861 862 863 864 865 連載 / v6 の実装 インターフェイスの優先度窈忍 for 0 ; (i if if 図 16 イ尉甫アドレスの入替え replace : ia_best ia_best_ in6 if (hoa next : continue ; out : i く sizeof (mip6—preferred—ifnames . mip6pi—ifname) ; ( (strncmp(if—name(ia—best—>ia-ifp) , mip6—preferred—ifnames . mip6pi—ifname , = の IFNAMSIZ) & & (strncmp(if-name(ia—>ia-ifp) , mip6-preferred—ifnames . mip6pi—ifname Ci] , IFNAMSIZ) ! = 0 ) ) goto next ; ((strncmp(if—name(ia—best—>ia—ifp) , mip6-preferred-ifnames . mip6pi—ifname [i] , IFNAMS 工 Z) ! = 0 ) & & (strncmp(if-name(ia->ia-ifp) , mip6—preferred—ifnames . mip6pi—ifname [i] , IFNAMSIZ) ia—best—matchlen = (ia—matchlen > = 0 ? ia—matchlen ! = NULL ) —addrscope(&ia—best—>ia—addr. sin6—addr) ) ; SCOpe (ia—scope > = 0 ? ia—scope 1a; goto replace ; in6—matchIen(&ia—best—>ia—addr . sin6—addr if if break; ( (ia—best->ia—ifp—>if—flags & IFF_UP) & & ! (ia—>ia—ifp—>if—flags & IFF—UP) ) goto next ; ( ! (ia—best—>ia—ifp—>if—flags & IFF_UP) & & (ia—>ia—ifp—>if—flags & IFF—UP) ) goto replace ; 893 894 } 891 892 la—matchlen) goto replace; matchlen く la—best—matchlen) goto next ; if (ia- 860 ~ 865 行目はインターフェイスの状態の確認です。 インターフェイスか慟作していない場合、そのインターフ ェイスに割り当てられているアドレスは気付アドレスの候 補になりません。 868 ~ 884 行目 ( 図 15 ) はユーザー指定によるインター フェイスのイ憂先度の確認です。 KAME の Mobile IPv6 実装では、同時に 2 つ以上のインターフェイスがネットワ ークに接続されている場合に、それらのインターフェイス 間で優先度をつけることができます。優先度の高いインタ ーフェイスに割り当てられたアドレスが、気付アドレスの 候補として選ばれます。 こまでの時点で、イ甫アドレスと現在のアドレスに優 劣がなかった場合、 887 ~ 894 行目で、最長一致アルゴリ ズムに従って、ホームアドレスにより近いアドレスが候補 に選ばれます。 897 898 899 900 901 902 if ( (ia-best goto if ( (ia_best goto 897 ~ 902 行目は、 sc—>hif—coa—ifa) sc->hif—coa—ifa) ) next ; ! = sc—>hif—coa—ifa) sc->hif—coa—ifa)) replace ; 旧い気付アドレス (hif-coa-ifa) と = NULL ) { la_matchlen hoa) ; 887 if (hoa ! 888 889 890 if in6—matchIen(&ia—> ia_addr . sin6_addr , (ia—best_matchlen く UNIX MAGAZINE 2005.2 の比較です。 KAME では、なるべく気付アドレスカ畯わ らないように、現在使用中のアドレスカ陏効であるかぎり、 それをできるだけ長く利用しようとします。 904 ~ 915 行目 ( 図 16 ) は、候補アドレスの入替え処理 です。現在比較中のアドレスが、こまでの比較を勝ち残 った候補アドレスよりも適したものであれば、 replace に 63

2. UNIX MAGAZINE 2005年2月号

図 11 417 418 419 420 421 422 423 424 図 12 783 784 785 786 787 788 789 790 791 792 連載 / v6 の実装ー 0 特定のアドレスをもつ mip6-ha 構造体のオ for (mha = TAILQ-FIRST(mha_1ist) ; mha; mha = TAILQ-NEXT (mha , mha—entry) ) { if (IN6_ARE_ADDR_EQUAL (&mha—>mha—addr , return (mha) ; / * not found. * / ret urn ( NULL ) ; ホームアドレスの取出し for (mpfx = LIST-FIRST(&mip6_prefix—1ist) ; mpfx; mpfx = LIST-NEXT (mpfx , mpfx—entry) ) { addr ) ) if (hif—prefix—list—find—withmpfx(&sc—>hif—prefix—list—home, mpfx) = NULL ) continue ; if (IN6_IS_ADDR_UNSPECIFIED (&mpfx—>mpfx-haddr) ) hoa_scope in6—addrscope (hoa) ; hoa = &mpfx—>mpfx—haddr ; C ont inue ; 図 11 の 417 行目の for ループでリストの要素をすべて 確認し、 addr で指定されたアドレスが mha-addr に設疋 されている mip6-ha 構造体を返します。該当する mip6- ha 構造体がなければ NULL を返します。 移動の検出 移動ノードは、起動するとまず最初に現在位置を確認し ます。 KAME の Mobile IPv6 スタックでは、利用でき る気付アドレスによって現在位置を決定します。移動ノー ドに割り当てられたアドレスがホーム・ネットワークと同 じプレフィックスをもっていれば、そのノードは現在ホー ムにいると考えられます。そうでなければ、出先ネットワ ークに接続されています。現在の気付アドレスを決定する 処理は mip6-select-coa() で実装されています。以下、引 用するコードは mip6-mncore. c からの抜粋です。 767 int 768 mip6—se1ect—coa(sc) struct hif_softc *sc; 769 770 { mip6-select-coa() は、ホーム・ネットワークを表す構 造体である hif-softc 構造体へのポインタを引数にもちま す。 KAME の MobiIe IPv6 実装では、 1 つのホーム・ ネットワーク ( 1 つの hif-softc 構造体 ) に 1 つの気付アド レスが関係づけられます。移動ノードは、あるホーム・ネ ットワーク (hif-softc 構造体に相当 ) で複数のホームアド レスをもつ可能性がありますが、その場合はすべてのホー ムアドレスに同じ気付アドレスが対応付けられます。 UNIX MAGAZINE 2005 . 2 mip6-select-coa() は、アドレスのた態か変化したとき に呼び出されます。たとえば、リンク上のルータからルー タ通知を受信し、新しいアドレスが追加された場合や、プ レフィックスの有効時間が切れてアドレスカ哨リ除された場 合などです。また、アドレスのプレフィックスを通知して いたルータカリ達不能になったことで、アドレスがネット ワークから切り離された状態 (DETACHED 状態 ) にな ったときにも呼び出されます。 DETACHED 状態は移動 検出において重要です。これは通常、移動ノードがネット ワークを移動し、旧いアドレスカ坏リ用できなくなったとき に発生するからです。 783 ~ 792 行目 ( 図 12 ) で、 hif インターフェイスに割 り当てられているホームアドレスを 1 っ取り出します。ホ ームアドレスは mip6-prefix 構造体の mpfx-haddr に格 納されているので、ホーム・ネットワークのプレフィック ス情報が保持されている hif-prefix 」 ist-home をたどり ながら、最初にみつけたホームアドレスとそのスコープ情 報を hoa と hoa-scope にオします。 794 ia_best = NULL ; 795 fo て ()a = in6_ifaddr; ia; 796 797 ia—>ia—next) { la_scope ia_matchlen 795 行目の for ループでは、現在利用可能な気付アドレ スを順番に取り出し、そのなかからホームアドレスにもっ とも適したアドレスを確認していきます。 if (ia—>ia—ifp->if—type 800 IFT_HIF) 801 goto next ; 61

3. UNIX MAGAZINE 2005年2月号

図 21 523 524 525 526 527 528 529 530 539 540 541 542 543 544 545 図 22 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 連載 / 旧 v6 の実装ー 0 対応付け更新リストのホームエージェント・アドレスの言 for (mbu = LIST—FIRST(&sc—>hif_bu_1ist) ; mbu; mbu = LIST-NEXT (mbu , mbu-entry) ) { if ( (mbu->mbu-flags & IP6MU—HOME) & & IN6_ 工 S_ADDR—UNSPECIF 工 ED (&mbu—>mbu_paddr) ) { mip6—dhaad—ha—1ist—insert (hif , mha) static int ホームエージェント・リスト (mpfx-ha 」 ist) の更新 return ( 0 ) ; if (mip6-bu-send—bu (mbu) ) { if ( ! MIP6_IS_BU_BOUND_STATE (mbu) ) { mbu—>mbu—paddr = mha—prefered—>mha—addr ; / * home registration. * / mip6—prefix—ha—Iist—insert (&hpfx—>hpfx—mpfx—>mpfx—ha—list , hpfx = LIST—NEXT(hpfx, hpfx-entry) ) { for (hpfx = LIST—FIRST(&hif—>hif_prefix—Iist—home) ; hpfx; struct hif—prefix *hpfx; struct mip6—ha *mha; struct hif_softc *hif ; mha) ; 行します。このとき、対応付け更新リストのホームエージ return ( 0 ) ; UNIX MAGAZINE 2005 . 2 ホームエージェントへのポインタをもつように、プレフィ 報が、動的ホームエージェント・アドレス探索でみつかった イスに保持されているすべてのホーム・プレフィックス情 ます。図 22 の 554 行目の for ループで、 hif インターフェ ホーム・プレフィックス情報を広告していると仮定してい す。 KAME の実装では、各ホームエージェントが共通の いホームエージェント情報を受信したときに呼び出されま 数は、動的ホームエージェント・アドレス探索によって新し されているホームエージェント情報を更新します。この関 スに保持されているホーム・プレフィックス情報から参照 mip6-dhaad-ha 」 ist-insert() は、 hif インターフェイ 先度の高いものを定します。 ってみつかったホームエージェントのなかで、もっとも優 あるエントリを検索し、動的ホームエージェント探索によ トのなかから、ホームエージェントのアドレスが未定義で 定されています。 523 ~ 542 行目では、対応付け更新リス ェント・アドレスには、仮の値として未定義アドレスカ毅 ックス情報のホー を更新します。 ム、エージェント ☆ ・リスト (mpfx-ha 」 ist) 次回も引き続き移動ノードの処理を解説します。 ( しま・けいいち IIJ) 69

4. UNIX MAGAZINE 2005年2月号

ー 0 図 13 826 827 828 829 830 831 832 833 834 835 836 838 839 図 14 842 843 844 845 846 847 848 849 850 851 ホームアドレスとの上交 連載 / v6 の実装 f0 て (mpfx mpfx if if LIST_FIRST (&mip6_prefix-1ist) ; mpfx ; LIST_NEXT(mpfx, mpfx_entry) ) { (hif-prefix—list—find—withmpfx( &sc->hif-prefix—list—home, mpfx) = = NULL) C011tinue ; (IN6_ARE_ADDR—EQUAL (&mpfx—>mpfx_haddr , &ia—>ia—addr . sin6—addr) ) { ia_best goto out ; if (ia—best = = NULL) goto replace ; アドレススコープの上交 in6—addrscope(&ia—>ia—addr. sin6—addr) ; la_scope if (IN6_ARE_SCOPE_CMP(ia_best-scope, ia_scope) く 0 ) { if (IN6 ARE_SCOPE_CMP(ia_best_scope , hoa_scope) く 0 ) goto replace ; goto next ; } else if (IN6-ARE-SCOPE—CMP(ia_scope, ia—best-scope) く 0 ) { if (IN6_ARE_SCOPE_CMP(ia_scope , hoa_scope) く 0 ) goto replace; goto next ; IFT-HIF は hif インターフェイスを示すタイプ番号で す。 hif インターフェイスに気付アドレスが割り当てられ ることはないので無視します ( 800 ~ 801 行目 ) 。 803 804 814 818 822 823 809 810 811 815 819 if if if if (ia—>ia6—f1ags & (IN6_IFF_ANYCAST ー工N6ー工 FF_DETACHED ー IN6_IFF_DUPLICATED) ) goto next ; (IN6_IS_ADDR_LOOPBACK (&ia—> ia—addr . sin6—addr) ) goto next ; (IN6_IS_ADDR—LINKLOCAL(&ia-> ia—addr . sin6—addr) ) goto next ; (ia—>ia6—fIags & IN6—IFF—TEMPORARY) goto next ; ートしていません ( 822 ~ 823 行目 ) 。 図 13 の 826 ~ 836 行目で、現在確認中のアドレスと hif インターフェイスに割り当てられているホームアドレスを 比較します。ホームアドレスと同じアドレスならば、移動 ノードがホーム・ネットワークに接続したことを未しま す。この場合は、 834 行目で即座にループを終了します。 ホームアドレスと同じ気付アドレスではなかった場合、こ のアドレスをとりあえずの候補アドレスとして次の気付ア ドレスの比較へ進みます ( 838 ~ 839 行目 ) 。 842 ~ 851 行目 ( 図 14 ) でアドレススコープを比較しま す。もし、現在確認中のアドレス (ia) のスコープ清報が、 こまでの比較で残った候補アドレス (ia-best) よりもホ ームアドレスのスコープ清報 (hoa-scope) に近ければ、確 認中のアドレスを新しい候補に設定します。そうでなけれ ば、引き続きこれまでの候補アドレスを保持します。 803 ~ 823 行目で利用できないアドレスを排除します。 まず、ェニーキャスト・アドレス、切り離された (DE- TACHED) アドレス、重複したアドレスを気付アドレス として選択することはできません ( 803 ~ 811 行目 ) 。ルー プバック・アドレスやリンクローカル・アドレスも気付ア ドレスとして選べません ( 814 ~ 819 行目 ) 。また、 IPv6 アドレスのプライバシー拡張 ( RFC3041 ) を気付アドレス に利用することは、仕様上は可能ですが、現時点ではサポ 62 854 855 856 857 if ( ! IFA6_IS_DEPRECATED (ia-best) & & IFA6_IS_DEPRECATED ( (a) ) goto next ; if (IFA6_IS_DEPRECATED (ia—best) & & ! IFA6_IS_DEPRECATED (ia) ) goto replace ; 854 ~ 857 行目は推奨有効時間の比較です。推奨肩効時 間が切れていないアドレスがより適切な候補として選択さ れます。 UNIX MAGAZINE 2005 . 2

5. UNIX MAGAZINE 2005年2月号

連載 / 旧 v6 の実装ー 0 処理が移り、新しい候補アドレスが設定されます。これま mip6-icmp6-dhaad-req-output() は hif-softc 構造 での候補アドレスを継続する場合は next に処理カ形り、次 体を引数にもちます。 1 つの hif-softc 構造体は、 1 つのホ の候補アドレスとの比較に進みます。 ーム・ネットワークに対応します。 mip6-icmp6_dhaad_ req-output() には、ホームエージェントの情報カ坏明な if (ia—best = = NULL) { hif-softc 構造体が渡されます。 return ( 0 ) ; 584 if (sc—>hif_dhaad—count ! = 0 ) { if (sc—>hif_dhaad—lastsent + 585 ( 1 くく sc->hif dhaad_count) > time—second) 586 return ( 0 ) ; 587 588 } 584 ~ 588 行目は動的ホームエージェント探索要求メッ セージの送信頻度の調整です。不必要にネットワークの帯 域を消費しないように、動的ホームエージェント探索メッ if (sc—>hif-coa—ifa ! = NULL) セージは指数関数的に送信間隔をひろげていかなければな IFAFREE(&sc—>hif—coa—ifa ia—ifa) ; りません。 MobiIe IPv6 の仕様では、初期送信間隔が 3 sc—>hif_coa_ifa = ia_best ; 秒と定義されています。しかし、現在の KAME の実装で IFAREF(&sc—>hif—coa—ifa—>ia-ifa) ; は初期週言間隔として 1 秒を指定しているため、仕様とは return ( 1 ) ; 938 939 } 若干動作が異なります。 925 ~ 939 行目で新しい気付アドレスを設定します。比 if (sc—>hif—coa—ifa = NULL) { 591 較の結果、これまでの気付アドレスを継続して利用できる return ( 0 ) ; と判断した場合は、 927 行目で 0 を返します。気付アドレ sc—>hif_coa_ifa—> スを変更する場合は、これまでの気付アドレスである hif- ia_addr . sin6_addr ; coa-ifa が示すアドレス構造体を解放し、さきほどのループ 591 ~ 597 行目は動的ホームエージェント探索メッセー で選択されたアドレス構造体を設定します。最後に、気付 ジの始点アドレスとして利用する気付アドレスの確認です。 アドレスの変更を通知するために 1 を返します。 hif-coa-ifa には、現在選択されている気付アドレスが十内 されています。気付アドレスが未設定の場合、動的ホーム ホームエーシェントの検索 工ージェント探索を実行することはできません。 604 ~ 615 行目 ( 図 17 ) では、動的ホームエージェント 移動ノードが出先ネットワークに接続すると、取得し 探索要求の終点アドレスとなるホームエージェント・ェニ た気付アドレスをホームエージェントに登録するために対 ーキャスト・アドレスを作成します。ホームエージェント・ 応付け更新メッセージを送信します。もし、対応付け更 ェニーキャスト・アドレスは、ホーム・プレフィックスか 新メッセージの送信時にホームエージェントのアドレスが ら計算できます。 604 ~ 609 行目で、移動ノードが一尉寺し 不明だった場合、移動ノードは動的ホームエージェント探 ているプレフィックス情報と、 mip6-icmp6-dhaad-req- 索プロトコルを用いてホームエージェントのリストを取得 output() の引数で渡されたホーム・ネットワークの情報 します。移動ノードにおける動的ホームエージェント探索 を比較し、ホーム・プレフィックスを検索します。対応す は mip6-icmp6-dhaad-req-output() と mip6-icmp6- るホーム・プレフィックスがない場合、動的ホームエージ dhaad-rep-input() で実装されています。以下、ファイル ェント探索を実行することはできません。 612 行目でエラ 名を明記しないコードは mip6-icmp6. c からの抜粋です。 ー終了します。 int 563 mip6—icmp6-dhaad-req-output (sc) 564 ホーム・プレフィックスがみつかれば、 614 行目の mip6 struct hif_softc *sc; 565 -icmp6-create-haanyaddr() でホームエージェント・エ 566 917 921 922 } 利用できるアドレスが 1 つもなかった場合、 0 を返して 処理を保留します ( 917 ~ 922 行目 ) 。 if (sc—>hif—coa—ifa ia—best) { 925 return ( 0 ) ; 927 928 930 931 932 933 0 5 ( り 7 9 9 9 -0 ) り ) り 64 UNIX MAGAZINE 2005.2

6. UNIX MAGAZINE 2005年2月号

連載 / 旧 v6 の実装ー 0 るホームエージェントのアドレス情報を、移動ノードが管 理しているホームエージェント・リスト情報に反映します。 0 , の ; 459 460 461 462 467 468 469 470 471 bzero(&haaddr—sa, sizeof (haaddr—sa) ) ; haaddr—sa. sin6—Ien = sizeof (haaddr—sa) ; haaddr—sa. sin6—fami1y = AF—INET6 ; haaddr— s a. s in6 ー addr = *haaddrptr + + ; if (in6—addr2zoneid(m—>m—pkthdr. rcvif , &haaddr_sa. sin6_addr , &haaddr—sa. sin6—scope—id) ) contlnue ; if (in6—embedscope (&haaddr—sa. sin6—addr , &haaddr—sa) ) continue ; ジェント探索で受信したホームエージェントの優先度は、 0 が指定されているとみなします。 なお、 479 行目の条件文は明らかに間違いです。 mha- pref が 0 以外に設定してある場合にのみ、優先度の値を 0 に初期化しなければなりません。また、有効時間の情報 も動的ホームエージェント探索では取得できないため、 488 489 } else { 行目で有効時間を無制限に定します。 haaddrptr は、応答メッセージに含まれているホーム 工ージェント・アドレスを示すポインタです。まず、ⅲ 6 ー addr 形式で格納されているアドレス情報を sockaddr- ⅲ 6 構造体の変数 haaddr-sa にコピーします。アドレス のゾーンを示す sin6-scope-id フィールドは、応メッセ ージを受信したインターフェイスから判断します ( 467 行 目 ) 。残念ながら、ゾーン識別子をつねに正しく計算できる とはかぎりません。しかし、実運用では、ホームエージェ ントのアドレスとしてグローバル・アドレスカリ用される ことがほとんどなので、ゾーン情報が正確に判断できない 場合は考慮しません。 495 496 497 501 502 503 504 505 506 } mha = mip6—ha—create ( &haaddr_sa. sin6_addr , ND_RA_FLAG_HOME_AGENT , if (mha = NULL ) { m—freem(m) ; return (ENOMEM) ; mha) ; mip6—dhaad—ha—1ist—insert ()c , mha) ; mip6—ha—1ist—insert (&mip6—ha—Iist , 489 ~ 506 行目では新しいホームエージェント・アドレ ス情報を挿入します。 mip6-ha-create() でホームエージ ェント情報を作成し、 504 行目の mip6-ha 」 ist-insert() でホームエージェント・リストに追加します。さらに 505 行目の mip6-dhaad-ha 」 ist-insert() で hif-softc 構造 体のホーム・プレフィックス情報を更新します。 mip6- dhaad-ha 」 ist-insert() については後述します。 472 473 474 479 485 486 487 488 mha = mip6-ha-1ist—find—withaddr ( &mip6—ha—Iist , &haaddr—sa. sin6—addr) ; if (mha) { mip6—ha—update—Iifetime (mha, 0 ) ; &mip6—ha—1ist , mha) ; mip6—ha—Iist—reinsert ( mha—>mha—pref if (mha—>mha—pref 507 513 514 515 } if (mha—prefered = = NULL) { mha—prefered = mha; 472 行目で、受信したホームエージェントのアドレスが すでに移動ノードが管理しているアドレス一覧に含まれて いないかどうかを検索します。同じアドレスがリストに含 まれている場合、リストの情報を更新します。 479 ~ 487 行目はホームエージェントの優先度情報の初 期化処理です。移動ノードは、ホームエージェントの情報 としてアドレス、優先度、効時間を保持しています。優 先度と肩勠時間の情報は、移動ノードがホーム・ネットワ ークに接続している場合にのみ取得可能な値で、動的ホー ムエージェント探索では入手できません。動的ホームエー 68 mha-prefered は、受信した応答メッセージで最初に リストされていたホームエージェントの情報を示します。 Mobile IPv6 の仕オ兼では、応答メッセージに含まれてい る最初のアドレスが、もっとも優先度の高いホームエージ ェントであると定義されています。 図 21 の 523 ~ 542 行目で、対応付け更新リストのホー ムエージェント・アドレスを設定します。移動ノードは、自 分が出先ネットワークに接続していると判断した場合、ホ ームエージェントに対応付け更新メッセージを送信します。 しかし、対応付け更新メッセージを送信しようとした段階 でホームエージェントのアドレスが未知の場合、対応付け 更新を送信する代わりに動的ホームエージェント探索を実 UNIX MAGAZINE 2005 . 2

7. UNIX MAGAZINE 2005年2月号

連載 / 旧 v6 の実装ー 0 図 5 メモリ令或び )i 寉保とメンバー変数のネ用ヒ 128 129 130 134 135 136 137 138 139 143 147 148 149 150 151 152 153 154 155 95 96 97 98 99 100 MALLOC (mha , struct mip6-ha * , M_NOWAIT) ; if (mha = = NULL) { return (NULL) ; bzero(mha, sizeof (*mha) ) ; *addr ; mha— >mha_ addr mha—>mha—flags flags; mha—>mha—pref = pref ; sizeof (struct mip6—ha) , M_TEMP , callout—init (&mha—>mha—timer—ch) ; if (IN6_IS_ADDR_LINKLOCAL (&mha->mha—addr) ) { mha—>mha_lifetime lifetime; } else { 0 ; / * infinite . * / mha—>mha_lifetime mip6—ha—update—Iifetime (mha, lifetime) ; return (mha) ; miP6—ha—create(addr, flags , pref , lifetime) struct in6_addr *addr ; u—int8—t flags ; u—int16-t pref ; int32_t lifetime; mip6-ha-create() は 4 つの引数をもちます。 addr は ホームエージェント ( もしくはルータ ) のアドレス、 flags はルータ通知に含まれているフラグ情報です。 pref と life- time は、それぞれホームエージェントの優先度と肩効時間 です。 116 117 110 111 112 if (IN6_IS_ADDR_UNSPECIFIED(addr) Ⅱ IN6_IS_ADDR—LOOPBACK (addr) Ⅱ IN6_IS_ADDR MULTICAST (addr) ) return (NULL) ; 110 ~ 117 行目ではホームエージェントのアドレスの正 当性を確認します。ホームエージェントのアドレスとし て、未定義アドレス、ルーフ。バック・アドレス、マルチキ ャスト・アドレスを使用することはできません。 119 if ( ! IN6-IS—ADDR-LINKLOCAL(addr) トとして動作しているルータは、ルータ通知のフラグに ホームエージェントであることを示す ND-RA-FLAG- HOME-AGENT が設疋されます。ホームエージェント の情報を格納するために mip6-ha 構造体を作成する場合 には、アドレス情報としてグローバル・アドレスを指定で きますが、ホームエージェントではない通常のルータ情報 を作成する場合はリンクローカル・アドレスでなければな りません。 図 5 の 128 ~ 135 行目で mip6 ー ha 構造体をイ尉寺するメ モリ領域を確保し、 136 ~ 152 行目で各メンバー変数を初 期化します。 mip6-ha-update 」 ifetime() は、有効時間 に従って有効時刻を設定する関数です。 mip6-ha 構造体 の作成に成功したら、呼出し側にポインタを返して終了し ます ( 154 行目 ) 。 有効時刻の言殳定 mip6-ha 構造体の有効時刻は mha-expire で示されま す。 mip6-ha-update 」 ifetime() は mip6-ha 構造体の 120 125 & & ( (flags & ND-RA—FLAG—HOME—AGENT) return (NULL) ; 有効時間をもとに有効時刻を設定します。 157 void 158 mip6—ha—update—1ifetime (mha, lifetime) 159 160 161 { struct mip6—ha *mha ; u_int16_t lifetime; 119 ~ 126 行目は、ホームエージェントとして動作して いないルータのアドレスの確認です。ホームエージェン 126 } UNIX MAGAZ 工 NE 2005 . 2 mip6-ha-update 」 ifetime() は 2 つの引数をもちます。 mha は有効時刻を設定する mip6-ha 構造体へのポイン 57

8. UNIX MAGAZINE 2005年2月号

0 ネットワークと セキュリティ 白畑真 ポートノッキング・ツール knock 今回は、新しいアクセス制御手法である、、ポートノッキ 動的なアクセス制御 ング " について説明します。 方法でサービスを提供しているポートにアクセスすると、 ポートノッキングを利用しているサーバーでは、通常の 定を変更できるようにする手法です。 閉じているポート番号にアクセスして、アクセス制御の設 ポートノッキングとは、あらかじめ決めておいた川印茅で ナミックにアクセス制御の設定を変更することができます。 れば、動的に IP アドレスが割り当てられる環境から、ダイ ません。しかし、今回紹介するポートノッキングを利用す ドレスやドメイン名をもとにしたアクセス制御はおこなえ 予測できないため、ファイアウォールやホスト上で、 IP ア このような環境では、アクセス元の IP アドレスか事前に が割り当てられるのがヨ殳的です。 のインターネット接続サービスでは、動的に IP アドレス ト接続をおこなう場面カ寸曽えています。また、多くの ISP から AirH ”や公衆無線 LAN サービスを利用してリモー らない環境ではたいへん肩効です。しかし、最近は外出先 ス内ネットワークなど、アクセス元の IP アドレスか変わ これらのアクセス制御の方法は、社内 LAN やキャンパ リゾルバを利用できるホスト上で用いられています。 名による認証は、おもに TCP Wrappers のような、 DNS ドや、エンドホスト上で利用されています。一方、ドメイン によるアクセス制御は、ファイアウォールなどの中継ノー 制御をおこなう方法が多くとられています。 IP アドレス としては、 IP アドレスやドメイン名にもとづいてアクセス 現在提供しているサービスへのアクセスを制限する手法 70 図 1 通常時のアクセス帋 UN 工 X MAGAZINE 2005.2 ノッキング まり、、ポートノッキングする " ソフトウェアです。 アントは、空いていないポートにアクセスをおこなう、つ 次に、クライアントの動作について説明します。クライ ( 図 1 ) 。 からのアクセスを原則として拒否する設定をしておきます を効にするサーバーには、あらかじめ、、全 IP アドレス " おこなうための手法です。したがって、ポートノッキング ポートノッキングは、アクセス制御の設定変更を動的に します。 こでは、一般的なポートノッキングの動作の概要を紹介 のほとんどはクライアントとサーバーに分かれています。 ポートノッキングにはさまざまな実装がありますが、そ ポートノッキングの概要 ある、、 knock" のインストールと設疋について説明します。 今回は、 Linux 上で動作するポートノッキングの実装で 受ける可能性を減らすことができるでしよう。 しなくなります。また、スクリプトキディなどから攻撃を ポートスキャンに対してポートが開かれているように応答 そのポートは閉じられているようにみえます。このため、 1007 1006 1005 1004 1003 1002 1001 1000

9. UNIX MAGAZINE 2005年2月号

特集 広域 Ethernet 実験網 JGN ll 図 3 レイヤ 3 サービス ユーザ—A VLAN = aaaa 旧アドレス = mmmm VLAN = cccc 旧アドレス = uuuu API ューザー C JGN Ⅱネットワーク AP3 ・△ AP2 ユーザー D ユーザー B VLAN = bbbb 旧アドレス = nnnn VLAN ID = dddd 旧アドレス = zzzz 図 4 JGNIIv6 ネットワーク 石川ハイテクセンター ( 北陸先端科学技術大学院大学 ) 10Gbps 1 Gbps x 2 1 Gbps VLAN C i SCO CataIyst 6509 Cisco 12406 Juniper T320 日立 GS4000 大手町 (KDDI) 東北 KD 団金沢 福岡 ( 九州大学 ) 東 島 岡山 A NICT 北九州 . ー・ リサーチセンター 10Gbps の 2 種類のサービスがあります。 された、 JGN Ⅱを用いた相互接続実験ネットワークで、ア 大手町一北陸一堂島 ( 大阪 ) の 3 カ所を結ぶかたちで構 クセスポイントまたは隣接する大学や研究拠点に日立製作 築された CaIient Networks 製の OXC 装置 ( 写真 3 ) を 所や Cisco Systems 、 Juniper Networks などのルータ 利用した GMPLS 網 ( 北周り / 日本海ルート ) と、大手 が置かれています ( 図 4 ) 。 町一堂島一けいはんなの 3 カ所を結ぶかたちで構築され OXC 接続サーヒス た NTT コミュニケーションズ製の OXC 装置を利用し た GMPLS 網 ( 南周り / 太平洋ルート ) があります。 これは、 OXC 設置アクセスポイント間を光波長レベル 日本海ルートでは、 Cisco の GSR ルータが GMPLS で接続するサービスです。インターフェイスが 1Gbps と 109 UNIX MAGAZ 工 NE 2005.2

10. UNIX MAGAZINE 2005年2月号

図 2 クライアントの情報の取得 if (ioctl(fd, TI-GETPEERNAME, &client->addr) く 0 Ⅱ client->addr. len request—>sink = tli—sink; if (t-rcvudata(fd, client, &flags) く 0 Ⅱ client->addr. len tcpd—warn('tcan't get client address : %s" t—free( (void * ) client , T—UNITDATA) ; request—>client—>unit client ; ます。この場合には IPv4 での接続と確認できるので、 tli- endpoints 関数で設疋されているはずの client や server に内されたアドレスを示す構造体を、 sockaddr 構造体と して sin メンバーに設疋します。さらに、 tli-cleanup で 後処理をおこない、 sock-methods マクロによりアドレス やホスト名の取得にソケット用の関数を使うように設疋し ています。 一方、最初の条件カ鵬になった場合、ソケット用の関数 ではイ尉寺している値から情報を取得することができません。 そのため、この場合には TLI 用の関数を割り当てています。 具体的には、ホスト名を取得する関数として tli 」 mostnarne を、ホストのアドレスを取得する関数として tli-addr を、 終了時に実行する関数として tli-cleanup を指定していま す。 tli-cleanup 関数では、情報収集のために割り当てた 領域を解放するなどの処理をおこなっています。 なお、 INET6 が定義されている場合も、ソースコード は基本的には同じです。違いは、プロトコルとして inet だ けでなく inet6 も同様に検査し、保持されているアドレス 情報の型が sockaddr-storage 型になる点だけです。 tli endpoints 関数 続いて、 tli-host 関数から呼び出さ楸接続の両端に関 する基本的な情報を収集する tli-endpoints 関数をみてみ ましよう。この関数は戻り値をもたず、引数には情報を格 納する領域を指定します。このファイル外から直接呼び出 されないように、 static な関数として亘言されています。 static void tli—endpoints(request) struct request—info *request ; クライアントに関する情報の取得には ioctl システムコ ールを使います。このシステムコールで TI_GETPEER- NAME 機能を呼び出すことで、情報を取得します ( 図 2 ) 。 102 tli-error()) ; のインターフェイスを備えるものはあまりないため、 います。しかし、現在よく利用されているシステムで TLI すが、もちろんこれらは TLI を用いる場合の処理をおこな tli-host 関数から呼び出している関数はほかにもありま request—>server—>unit return; t-free( (void * ) server, T—UNITDATA) ; tcpd—warn ( "TI—GETMYNAME : %m" ) ; &server—>addr) く 0 ) { if (ioctl(fd, TI—GETMYNAME, - けで正しく取得できるはずです。 こちらは相手先と接続されている必要はないので、 ioctl だ サーバー側の情報も同様にして取得できます。ただし、 とができます。 ないので、データではなくアドレス情報だけを取り出すこ バッフアを割り当て、データ用のバッフアは割り当ててい ですが、引数に T-ADDR を指定することでアドレス用の t-alloc は TLI 用のデータ構造を割り当てるための関数 return; tli-error()) ; tcpd—warn("t-alloc: %s" t—alloc(fd, T-UNITDATA, T—ADDR)) (struct t—unitdata * ) - if ( (client れています。 る client データ構造は、すこし前で次のようにして構築さ data 関数を使って情報を取得します。ここで利用してい ルで情報を取得できません。このような場合には、 t-rcvu- 相手先と接続していない状態では、 ioctl システムコー 皆さんがネットワークを利用する際には、 TLI よりも sock hOSt 関数 ではこれ以上深入りしません。 UNIX MAGAZ 工 NE 2005 . 2