Dummynet
Home >> Note >> Dummynet

目次

  1. Overview
  2. Dummynetの設定方法
    1. カーネルの再構築
    2. bridgeおよびipfwの適用(FreeBSD 4.x以前)
    3. bridgeおよびipfwの適用(FreeBSD 5.x以降)
    4. ipfwの設定
  3. Example
  4. その他
    1. Jitter Emulation
    2. HZに関して
  5. 参考URL
  6. 修正履歴

Overview

dummynetは,FreeBSD (3.0 release以降?)に標準で組み込まれているツールです. 帯域,遅延時間,パケット損失率などの制御を行うことができるため,帯域制限や プロトコルテストなど様々な用途で使用されています.このページでは,このdummynet を使用するための設定方法を簡単に紹介します.

Dummynetの設定方法

今回は,100Base-TX Network Interface Card (NIC) が2枚接続されているPCに,FreeBSD 4.10をインストールし,その環境下でDummynetの設定を行いました.

カーネルの再構築

まず,カーネルの再構築を行います./usr/src/sys/i386/conf/GENERICの設定ファイルを 適当なファイル名(例えば,DUMMYNET)でコピーし,以下の行を追加します.

options    IPFIREWALL
options    IPFIREWALL_VERBOSE
options    IPFIREWALL_FORWARD
options    IPFIREWALL_DEFAULT_TO_ACCEPT
options    DUMMYNET
options    BRIDGE
options    HZ=1000

その後,以下のような手順でカーネルを再構築した後,リブートを行います.

# cd /usr/src/sys/i386/conf/
# config DUMMYNET
# cd ../../compile/DUMMYNET/
# make clean
# make depend
# make
# make install
# reboot

bridgeおよびipfwの適用(FreeBSD 4.x以前)

次に,Dummynetを有効にするためbridgeおよびipfwを有効にします.これらを有効に する為には,sysctlコマンドによって設定します (fxp0,rl0は,ifconfigコマンドで表示される NICのインターフェース名).

# sysctl -w net.link.ether.bridge=1
# sysctl -w net.link.ether.bridge_ipfw=1
# sysctl -w net.link.ether.bridge_cfg="fxp0:1,rl0:1,"

ただし,この方法を用いる場合,PCを再起動するたびに再設定を行わなければならないので, 通常は/etc/sysctl.confに以下のように記述しておくようです.

net.link.ether.bridge_cfg=fxp0:1,rl0:1,
net.link.ether.bridge=1
net.link.ether.bridge_ipfw=1

bridgeおよびipfwの適用(FreeBSD 5.x以降)

FreeBSD 5.x以降,Dummynetに関連する設定方法(bridgeに関する設定)にも少し変更が加えられているようです. FreeBSD 5.x以降を使用する場合は,/etc/sysctl.confに以下の記述を加えます.

net.link.ether.bridge.enable=1
net.link.ether.bridge.cfg=fxp0:1,rl0:1,
net.link.ether.bridge.ipfw=1

さらに,FreeBSD 5.x以降の場合は,/boot/loader.confに以下の記述を加える必要があります(FreeBSD 5.x以降は, カーネルの再構築が必要ない可能性があります.この点は,また後ほど確認しておきたいと思います.)

bridge_load="YES"

ipfwの設定

ここまでの設定で,bridge(あるインターフェースから別のインターフェースへパケットを渡す) としての役割は果たすようになったと思います.そこで,次にipfwの設定を行います.

ipfwでは,まず始めにpipeを作成します.帯域や遅延などの制御は基本的にこのpipe 単位で制御を行っていきます.pipe作成の書式は以下の通りです.

#ipfw add pipe <number> <prevision>

<number>には,1〜65,534のいずれかの整数を指定します.<prevision>は, そのpipeを通過させるパケットの条件を指定します.

次に,作成したpipeに対して実際に制御を加えていきます.pipeへの制御の 為の書式は以下のようになります.

# ipfw pipe <number> config [bw <bandwidth>] [delay <time>]
  [queue <size>>] [plr <lossrate>]

<number>には,制御したいpipeの整数を指定します.<bandwidth>には, そのpipeに割り当てる帯域幅を指定します(単位として,Kbit/s, Mbit/s, KByte/s, MByte/sが使用可能).0を指定した場合には,帯域制限は行いません.<time>には, 遅延時間をmsec単位で指定します.<size>には,キュー長をスロット数,またはKByte 単位で指定します.<lossrate>には,パケット廃棄率を0〜1の少数値で指定します.

Example

今回は,例として2PC間で50 msecの遅延時間を発生させてみます.

# ipfw add pipe 1 ip from any to any
# ipfw pipe 1 config delay 50ms

設定前:
# ping -s 1500 192.168.1.49
PING 192.168.1.49 (192.168.1.49): 1500 data bytes
1508 bytes from 192.168.1.49: icmp_seq=0 ttl=64 time=0.952 ms
1508 bytes from 192.168.1.49: icmp_seq=1 ttl=64 time=0.929 ms
1508 bytes from 192.168.1.49: icmp_seq=2 ttl=64 time=0.928 ms
1508 bytes from 192.168.1.49: icmp_seq=3 ttl=64 time=0.925 ms

設定後:
# ping -s 1500 192.168.1.49
PING 192.168.1.49 (192.168.1.49): 1500 data bytes
1508 bytes from 192.168.1.49: icmp_seq=0 ttl=64 time=99.711 ms
1508 bytes from 192.168.1.49: icmp_seq=1 ttl=64 time=100.171 ms
1508 bytes from 192.168.1.49: icmp_seq=2 ttl=64 time=99.653 ms
1508 bytes from 192.168.1.49: icmp_seq=3 ttl=64 time=100.126 ms

その他

Jitter Emulation

プロトコルテストなどの目的でDummynetを使用する場合,遅延に揺らぎ(ジッター)を入れたい という場合もあると思います.しかし,(調べた限り)ipfwでは,遅延は固定値でしか設定できない ようです.そこで,dummynet のページに記載されている方法を利用して,遅延の揺らぎを実現してみようと思います.

# ipfw add prob 0.33 pipe 1 ip from any to any
# ipfw add prob 0.5  pipe 2 ip from any to any
# ipfw add           pipe 3 ip from any to any

# ipfw pipe 1 config delay 10ms
# ipfw pipe 2 config delay 15ms
# ipfw pipe 3 config delay  5ms

ipfwでは,複数のpipeを作成し,確率でひとつのpipeを使うという制御が できるようです.なので,上記のような設定を行えば,5〜15msと遅延の揺らぎをエミュレート することができます.

HZに関して

参考URLなどにおいて,“Dummynetの精度を高めるためには,HZの値を大きくして下さい” といった事が書かれています.ここで,HZの値は1秒間にカーネルが割り込みを掛ける回数を 表しています.

そして,パケットは一旦バッファリングされた後,一定時間遅延させて送出されるようですが, 恐らくこの一定時間遅延させるという部分を割り込み処理を使って実現しているのだと思います (恐らくは,timeout()関数,またはcallout_*()関数を利用している).そうすると, パケットは最小1/HZ間隔で送出されることになります.そのため,HZの値を大きくすると精度が 高くなります.

尚,現在の一般的なPC(Pentium 4 2.0GHz〜)では,HZが20,000辺りからかなりパフォーマンスが 悪くなり,100,000より大きな値を設定した場合kernel panicが起こる可能性が高いようです.

参考URL

修正履歴

2006/11/30
"bridgeおよびipfwの適用"に関して,FreeBSD 5.x以降の設定方法を追加.
参考URLに,3948番地:FreeBSDでブリッジを作成を追加.