転送遅延発生ルータ(NIST Netの作り方)           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 2003/09/04 2002/09/10 2002/08/01 1999/12/02 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/  言うまでもありませんが、本文章は無保証です。この文章の影響によりどの ような事が起ころうとも当方は一切の責任を持ちません。 0.履歴等  ̄ ̄ ̄ ̄ 2003/09/04 コマンドラインのcnistnetに関する記載について、 齋藤洋氏による記述を追加 2002/09/10 誰もがはまってしまう、クライアント側の設定について、 齋藤洋氏による記述を追加 2002/08/01 OS Red Hat 7.3 NIST NET version 2.0.11 でも、同じ手順でインストール可能である旨の御連絡を頂きました。 1999/12/02 初版 1.目的  ̄ ̄ ̄  ネットサーフィンをやってみれば明らかですが、その応答性の悪さにいらい らさせられます。これはWebサーバの応答性と言うよりはむしろ、ネットワー クの通信遅延が原因の多くを占めています。  最近QoS(Quality of Service)なる考え方が出てきました。これは、通信の 品質を保証して、ユーザに快適な通信サービス環境を提供しようという試みの 一つです。  私はこのQoS品質の測定と制御を行なう研究を行なっているのですが、困っ た事が一つありました。それは、実際のネットワークを「模擬する」実験装置 が存在しないと言う事です。  『実際のインターネットを使って測定すればいいじゃないか』と言う意見も あるかも知れませんが、状況や時間によってネットワークの遅延時間がどんど ん変化していくインターネットでは、遅延時間を正確に推定する事ができませ ん。  すると、QoS品質の測定実験を行なったとしても、それが正しい値であるか どうかを誰も確認する事ができません。  私が欲しかったものは、要するに、「100回パケットを流しても、100 回とも、遅延時間750msを正確に発生させるネットワーク」です。 もちろん、インターネットでそんなことはできません。ですから、そのよう なことを行なえる、実際のネットワークを「模擬する」実験装置が欲しかった 訳です。 2.What's "NIST Net" ?  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  NIST Net(http://snad.ncsl.nist.gov/itg/nistnet/)は、パソコンで、その 「模擬ネットワーク」を実現するツールです。 PCに複数のネットワークカードを挿入して、そのPCを通過するパケットが、 あたかも、遅延や、パケットロスが発生する実際のネットワークを通ってきた かのように振舞わせる事のできるようになります。  具体的に何が嬉しいかと言うと・・・ ・広域ネットワークでの利用を想定した、ネットワークアプリケーションのテ ストを、ネットワークの状況(遅延、帯域、パケットロス等)を変えながら、 ライブで行なう事ができる。しかも、何回でも再現可能。 ・ADSLのような、上りと下りのネットワークの転送速度が異なるネットワークの  模擬も簡単。  等が挙げられます。  ツールの特徴としては、 ・Linuxのカーネルモジュールの拡張を行なう事で実現。 ・X Windowを用いた対話型のGUIインタフェースの使用可能。 ・(いうまでもなく)とても安価なPCで実現  まだ十分に使い込んではいませんが、私の場合 ・私の場合、研究室の片隅に落ちていたPentium100MHz,32Mメモリマシンで実現 ・2つのノード間で750msの遅延を発生させてpingを打ってみたところ、どんぴし  ゃで750msを出した(!)。試してみたところ、大体10msの単位で設定できる  ようす。  とまあ、美味しい機能満載。  こんな便利なものを、フリーで配る米国の国立標準技術院 (National Institute of Standards and Technology: NIST) は大らかだなあ、と思わず にはいられません。  詳しくはこちらをご覧ください。英語が分る人なら、こちらの情報の方が、 遥かに有用で役に立つものと思います。 http://snad.ncsl.nist.gov/itg/nistnet/ rfc2398.txt 3.事前準備  ̄ ̄ ̄ ̄ ̄ (Step.1) Linux Boxを作る  どのディストリビューションでも構わないと思いますが、気をつけて頂きた いのは、現在(1999年12月)、NIST Netのバージョンは1.3で、対応可 能なLinuxのカーネルバージョンは2.0.27-2.0.37のみです。  私の場合、ディストリビューションとしてRedhat5.2J(2.0.36)をインストー ルしました。 (Step.2) Linux Boxをルータ(?)にする。  正確にはルータではないです。いわゆる「ネットワークカードの2枚差し」 です。 この方法については、http://www.linux.or.jpあたりから探れます。 2枚目のカードを認識するには、モジュールの追加による方法と、カーネル の再構築のどちらかを行なう必要がありますが、最終的にカーネルの再構築が 必要になりますので、今のうちにやっておいた方が良いと思います。 私の場合、linux-2.0.36.tar.gzを、/usr/srcに展開して、make xconfigで. configを作り、コンパイル(made dep; make clean; make; make bzdisk(FDに カーネルイメージを入れておく)を行いました。イーサネットカードを2枚差 しました。 [ebata@pcrouter ~]$ /sbin/ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:117 errors:0 dropped:0 overruns:0 frame:0 TX packets:117 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 eth0 Link encap:Ethernet HWaddr 00:10:5A:5C:6B:53 inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:86 errors:0 dropped:0 overruns:0 frame:0 TX packets:45 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 Interrupt:10 Base address:0xd080 eth1 Link encap:Ethernet HWaddr 00:10:5A:5C:6B:31 inet addr:192.168.2.254 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 Interrupt:9 Base address:0xd000 2枚のカードが認識できたら、とりあえず何もしなくてもルータとして動作 するはずです。(クライアントのデフォルトゲートウェイの設定に気を付けて ください)。正常に動くことが確認したら、カーネルイメージをハードディス クの方にコピーします。 このあたりの説明は、Linuxのインストール解説書などを参考にしてくださ い。 想定しているネットワーク構成は、非常に単純です。 +-------+ | PC1 | 192.168.1.6 +-------+ | 192.168.1.0/24 ---------------------------------- | |eth0 192.168.1.254 +-----------+ | | | Linux Box | | | +-----------+ |eth1 192.168.2.254 | ---------------------------------- | 192.168.2.0/24 +-------+ | PC2 | 192.168.2.2 +-------+ [PC1での設定] route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254 [PC2での設定] route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.2.254 Linix Boxではroute設定の必要はないし、IPフォワーディングの設定も必要 ありません(この質問がやたら多い)。 ネットワークの構築が終ったら、pingで双方のPCを呼んでみましょう。 あなたがこのLinux Boxを、ネットワークエミュレータとして使うなら、 routedの設定などは必要ありません。routeの設定も特に必要ないでしょう。 ですが、クライアントPCのrouteの設定を忘れないようにしましょう(私は、 これで、しっかりはまりました)。 3.How to make "NIST Net"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (Step.1) Linuxのカーネルソースを準備してください。カーネルは、2.0.27-2.0.36で あることを確認してください。 cd /usr/src; tar -xvzf linux-2.0.36.tar.gz cd linux make xconfig ← 適当に編集 made dep; make clean; make; make install など。 - ブートしてカーネルが立ち上がることを確認してください。 (古いカーネルイメージは退避しておいた方がいいです。) (Step.2) cd /usr/src; tar -xvzf nistnet.tar.gz cd /usr/src/nistnet ./Patch.Kernel カーネルソースに自動的にパッチが当てられます。 (Step.5) cd /usr/src/linux make config (or menuconfig/xconfig) - ここで、CONFIG_FAST_TIMER、CONFIG_REPACKを、"Yes"と答えてください。 ("カーネルハック"のエリアで出て来ます) make dep; make clear; make make install - ブートしてカーネルが立ち上がることを確認してください。 (古いカーネルイメージは退避しておいた方がいいです。) (Step.6) cd /usr/src/nistnet/monitor xmkmf cd /usr/src/nistnet make make install を実施。 ここまでエラーがでなかったら、NIST Netのインストールは成功です。 4. Check "NIST Net"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ この段階で2つのツールが利用可能なはずです。 ・Hitbox CLIベースバージョン ・Nistnet GUIベースバージョン ここでは、Nistnetの使い方を説明します。 +-------+ | PC1 | 192.168.1.6 +-------+ | 192.168.1.0/24 ---------------------------------- | |eth0 192.168.1.254 +-----------+ | | | Linux Box | | | +-----------+ |eth1 192.168.2.254 | ---------------------------------- | 192.168.2.0/24 +-------+ | PC2 | 192.168.2.2 +-------+ 上記ネットワーク構成で、PC1からPC2にpingを放つ実験をします。 NIST Netを動かす前に、 insmod nistnet を行います。 Linux BOX立ち上げ時に、自動的に実施しておいても良いでしょう。 次に nistnet & と入力しますと、 "NIST Network Emulation Tool v.1.3"なるGUI画面が立ち上がります。 立ち上がらなかったら、 xnistnet & (usr/X11R6/bin/xnistnet) なども試して下さい。 以下の値を、GUIに入力して行きます。 Source :192.168.1.6 Dest :192.168.2.2 Delay(ms) :750 DNSが立ち上がっていたら、勝手にIPアドレスをホスト名に変えてくれます (煩わしいので、私はDNSを止めました) 入力し終ったら、"Update"のボタンを、最後に"On"を押します。 次に、192.168.1.6のノードから、192.168.2.2のノードにpingを打ちます。 PING 192.168.2.2 (192.168.2.2): 56 data bytes 64 bytes from 192.168.2.2: icmp_seq=0 ttl=64 time=750.1 ms 64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=741.1 ms 64 bytes from 192.168.2.2: icmp_seq=2 ttl=64 time=750.1 ms 64 bytes from 192.168.2.2: icmp_seq=3 ttl=64 time=750.1 ms なる入力が出てこれば、テストは成功です。 この他、ネットワークの様々な状態を作り出すためのパラメータがあります ので、 http://snad.ncsl.nist.gov/itg/nistnet/usage.html を御覧ください。 5. コマンドラインNistNet "cnistnet"の使用方法  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ===================================================================== 使用方法: cnistnet <オプション> - (注)root権限で実行してください。 <オプション>: -u 起動 (on) -d 停止 (off) -a <条件1> <条件2> ルール追加 -r <条件1> ルール削除 -s <条件1> 状態参照 -S <条件1> 状態連続参照 <条件1>: src[:port[.protocol]] dest[:port[.prot]] [cos] <条件2>: [--delay delay [delsigma[/delcorr]]] [--drop drop_percentage[/drop_correlation]] [--dup dup_percentage[/dup_correlation]] [--bandwidth bandwidth] [--drd drdmin drdmax [drdcongest]] +----------------------+------------------------+ | src | 送信元IPアドレス | | port | ポート番号 | | protocol(proto) | プロトコル種別 | | dest | 送信先IPアドレス | | cos | ????? | +----------------------+------------------------+ | --delay | 遅延設定 |    | delay | 遅延時間(msec) | | delsigma | | +----------------------+------------------------+ | --drop | ランダム廃棄設定 | | drop_percentage | ロス率(0-100%) | | drop_correlation | | +----------------------+------------------------+ | --dup | ランダムパケット入替(?)| | dup_percentage | ?????? | | dup_correlation | ?????? | +----------------------+------------------------+ | --bandwidth | 帯域設定 | | bandwidth | 帯域幅(byte/second) | +----------------------+------------------------+ | --drd | DRDアルゴリズム | | | キュー長による閾値廃棄 | | drdmin | 最小キュー長 | | drcmax | 最大キュー長 | | drdcongest | | +----------------------+------------------------+ [-n] -R テーブル参照(-n numerical format) -D value カーネルデバッグモードON (value=1(最小), 9(最大)) -U カーネルデバッグモードOFF -G 全状態表示(?) -K kickstart the clock -F キューをフラッシュ -h ヘルプ表示 ===================================================================== [使用例/ルール設定] 1: cnistnet -a 192.168.100.10:5001.udp 192.168.200.10:5000.udp --delay 200 10 2: cnistnet -u 3: cnistnet -R [1行目] 送信ホスト192.168.100.10から送出される送信ポート5001の UDPトラフィックを100msec(10%の揺らぎ)遅延させるルールを 設定。 [2行目] 起動(反映) [3行目] 投入されているルールのリストを表示 ===================================================================== [使用例/ルール削除] 1: cnistnet -r 192.168.100.10:5001.udp 192.168.200.10:5000.udp 2: cnistnet -u 3: cnistnet -R [1行目] 送信ホスト192.168.100.10から送出される送信ポート5001の UDPトラフィックを100msec(10%の揺らぎ)遅延させるルールを 設定。 [2行目] 起動(反映) [3行目] 投入されているルールのリストを表示 ===================================================================== 6.おわりに  ̄ ̄ ̄ ̄ ̄ 上記のような小さい構成のネットワークなら、研究室の片隅に落ちていた Pentium100MHz,32Mメモリマシンで十分ですが、もっと大規模な実験(クライア ントPCが数十〜数百台)などの場合は、『できるだけ速いマシンで、できるだ けメモリを積め』と書かれていました。 http://snad.ncsl.nist.gov/itg/nistnet/faq.html には、この他、HitboxとNistnetの入力単位の違いなど、読んでおかないとい つまでも悩み続けねばならない情報がたくさん記載されていますので、一読さ れることを強くお勧めします。 7.個人的メモ  ̄ ̄ ̄ ̄ ̄ ̄ 7.1 ローダブルモジュールの形式で構築する方法 管理者(root)権限で構築してください。 /root/ディレクトリ展開して作業する場合の例を示します。 # tar xvfz nistnet.2.0.12.tar.gz # cd nistnet # vi monitor/Makefile OURXAWLIB = -lneXtaw という行を OURXAWLIB = -lXaw に変更 # cd /usr/src/linux-2.4/configs/ ←(※1) # cp kernel-2.4.18-i386.config ../.config ←(※1) # cd /root/nistnet # make install # cp Load.Nistnet /usr/local/bin # vi /etc/rc.d/rc.local # vi /etc/sysctl.conf net.ipv4.ip_forward = 0 という行を net.ipv4.ip_forward = 1 と記述して,OSの再起動を行う (※1)…/usr/src/linux-2.4/ディレクトリで、make menuconfigを実行し、設 定変更を行わず内容を保存すれば、自動的に.configファイルが生成されるの で、あえてファイルをコピーする必要はない。