2011年3月4日金曜日

FreeBSD on VirtualBoxで帯域制限ツールを作る。



基本的にはイベント会場で臨時に使う事を考えてます。


具体的には、会場にネットを解放しているけれどもネット中継もやりたい。


ネット中継がカクカクするのは困るので、一般側の回線は帯域をしぼりたい。


という時に使います。


で、既存ネットワークの設定をできるだけいじらずに導入する事を目的にしてます。


なので、PCにUSB等のNICを最大4つさして、ひとつをUplinkポートにして残りの3つが帯域制限が掛かっているポートになるハブを作ります。


PC自体にはIP振っても振らなくてもOKっす。


前準備


私はとりあえずVirtualBoxをMacBookにいれて、USB NICを2つ繋ぎました。


USB-NICが帯域制限つきポートになるので、変なパケットをださないように、Mac側でIPアドレスを「切」に設定してます。


windowsでいえば、ネットワークのプロパティでTCP/IPのチェックボックスをはずすような状態です。


でFreeBSDの仮想イメージはすでにもってるのでそれ使いました(8.2 RC2)


Virtualbox設定


VirtualBoxのネットワークの設定は、全てブリッジで接続です。


一つ目のインターフェイスをUPlinkのポートを設定して、それ以外を帯域制限つきポートにします。


FreeBSDの設定


/etc/rc.confファイル:



cloned_interfaces="bridge0"


#4つのNICをbridge0で繋ぎます。


#仮に3つしかなくても、同じ設定でちゃんと動きます


ifconfig_bridge0="addm em0 addm em1 addm em2 addm em3 up"


ifconfig_em0="up"


ifconfig_em1="up"


ifconfig_em2="up"


ifconfig_em3="up"


dummynet_enable="YES"


firewall_enable="YES"


firewall_type="/etc/ipfw.conf"



/etc/sysctl.confファイル:



net.link.bridge.ipfw=1



/etc/ipfw.confファイル(新規作成):



pipe 1 config bw 100Kbit/s #デフォルトの帯域制限量を書いておきます


pipe 2 config bw 100Kbit/s


pipe 3 config bw 100Kbit/s


add pipe 1 ip from any to any xmit em1 out bridged


add pipe 1 ip from any to any recv em1 out bridged


add pipe 2 ip from any to any xmit em2 out bridged


add pipe 2 ip from any to any recv em2 out bridged


add pipe 3 ip from any to any xmit em3 out bridged


add pipe 3 ip from any to any recv em3 out bridged


allow ip from any to any



以上を書いて再起動すると帯域制限つきHUBになっています。


帯域制限を変更するとき


em1=(VirtualBoxで2番目のNIC)の帯域を変更するときは以下のようにします。


同様にpipeの後の数字を変更すればem2,em3も変更できます。



ipfw pipe 1 config bw 100Kbit/s



障害発生時


VirtualBox上で運用している場合、例えばあるPCをem2からem3につなぎ替えたりすると通信できなくなってしまいます。(2011/3/4現在)


そういう障害が起きたときは以下のようにしてそれぞれのポートを初期化します。



ifconfig em1 down


ifconfig em1 up


ifconfig em2 down


ifconfig em2 up


ifconfig em3 down


ifconfig em3 up



ふつうUpLinkがわでそのようなつなぎ替えをすることはないのでem0はする必要はほぼないでしょう。





P.S.


暇見てもシェルスクリプトも整備して、仮想イメージ公開してもいいかもね・・・需要があれば





2011年3月3日木曜日

VirtualBoxのNICをpromiscにするときの注意@MacOSX



たとえば複数のNICをbridge接続するとき等NICをpromiscモードにするんだけど、


ホスト環境であるMacOS側が自動でpromiscモードになってくれない。


普通は



ifconfig en0 promisc



とでもやればいいのだろうが。あいにくMacOSXでは当該昨日が削除されている。ほんのわずかネットが重くなるが



tcpdump -i en0 icmp



で代用して、ホスト環境をporomiscモードにしてあげればちゃんとゲストの中でブリッジする事ができる。





ちなみに、なんでこんなのをやっているかというと、USBのNICを2枚さして、LANケーブルの間に挟めば透過的に帯域制限ができるっていうのを作りたくてやってみた。


もちろん、BootCampでPC-UNIXをいれれば一発解決なのだが、それだとPC-UNIXが起動しているあいだMacがつかえなくてしょぼーんとなるので、VirtualBoxでがんばってみた。





というのは全くの嘘でした!



普通につかえます。ただ、NICを複数用意していて途中でケーブルの入れ替えなどを行うと、VirtualBox側のブリッジが混乱して変に通信できなくなるっぽい。


ちょっとこれはしらべないとわからなぁ。。。


とりあえずの対応方法


LANケーブルの差し替えなど通信不能になったときは、



ifconfig em0 down


ifconfig em0 up



をLANの入れ替えなどをおこなったインターフェイスにたいして行えば復活する