DymmynetをFreeBSD 8.1R上で使う

古い情報に惑わされまくったので忘れないようにメモ。

1.目的
低帯域・高遅延の試験環境を作る。
ネットワークにインラインで挟む(ブリッジ)。


2.使用したもの
FreeBSD 8.1R i386
Intel Server Board SE7501WV2
NICIntel PRO/1000 em0-9


3.必要なこと
・普通にインストール
・/etc/rc.confに以下の記述

firewall_enable="YES"
firewall_type="/etc/ipfw.conf"
cloned_interfaces="bridge0"
ifconfig_bridge0="addm em2 addm em3 up"
ifconfig_em2="up"
ifconfig_em3="up"
dummynet_enable="YES"

・/etc/ipfw.confに以下の記述

add 10 pipe 1 ip from any to any
pipe 1 config delay 0ms
add 65534 allow all from any to any

・/etc/sysctl.confに以下の記述

net.link.bridge.ipfw=1


4.はまった点
・8.1Rであればカーネル再構築は不要。
Webを検索すると、IPFIREWALLとDUMMYNETを含むカーネルを再構築する必要がある、という情報がたくさん出てくるが、8.1Rでは必要ない。
ブリッジ使用のためにも必要ない。
・/boot/loader.confの書き換えは不要
これもloader.confの設定が必要との情報があるが、8.1Rではipfwモジュール、dummynetモジュールはrc.confで指定すればロードされる。
ipfwのpipeルールをaddしたタイミングでは通信は停止する。
試験のとき、ipfwでpipeを指定したタイミングで通信が止まるため何か間違っていると勘違いしてしばらく悩んでしまったが、bw等まで指定して初めて通信可能となる。
pingでは、delayは指定した値の2倍発生するように見える。
ブリッジなので、2つのインターフェイスで指定したdelayが別々に発生するため、往復では2倍のdelayとなる。
・net.link.bridge.ipfw=1が必要。
これをしないとブリッジがパケットを通過させず通信ができなかった。
・ブリッジを経由してDHCPでアドレスをもらうことは不可。
FreeBSDの設定には直接関係ないけど。
DHCPはIPではないから当然なのか。


5.よくわからない点
・上記のように最低限のipfwルールのつもりだが、ipfw showをするとOPENと同じルールが追加されている。デフォルトルール?
・帯域制御が正しく効いているかどうかは未確認。
だいたいは効いている模様。
dummynetのmanではoptions HZ=1000がstrongly recommendedになっているが、kernel configuration fileにDUMMYNETが必要とかあるので内容が古いような。
・帯域はどのレイヤーでの制限?
L2?

6.その他
DHCPする際には、rc.confのifconfig_bridge0を以下のように変更。
ifconfig_bridge0="addm em2 addm em3 SYNCDHCP"
・Static IPアドレスを降る際には、/etc/rc.confに以下の行を追加
ipv4_addrs_bridge0="192.168.1.1/24"
なぜか以下の表記ではうまくいかず。
ifconfig_bridge0="addm em2 addm em3 inet 192.168.1.1/24"
起動後に以下のようにした場合にはうまく振れる。なんで?
# ifconfig bridge0 192.168.1.1/24