はじめに
ipfw コマンドは OS X 10.11 でなくなってしまったので、以下の文章は役立たない
過去役に立った話
Mac OS X に標準搭載の ipfw コマンドの便利な使い方。
ipfw のパイプ機能で回線の品質を自在にエミュレートできるので、 GSM / 3G などの遅いモバイルネットワークや、海外からのアクセスにも最適化しなくてはいけないときに有用。
パイプを通す
# すべての通信を制御する場合
sudo ipfw add pipe 1 ip from any to any
# TCP 80 だけ制御する場合
sudo ipfw add pipe 1 tcp from any to any 80
# 特定の IP アドレス帯だけ制御する場合 (from と to を逆にすれば着信も制御できる)
sudo ipfw add pipe 1 ip from me to 172.16.0.0/24
パイプに遅延や帯域制限を設定する
# 1Mbps, 80msec, パケットロス率 10% (それなりな LTE 程度)
sudo ipfw pipe 1 config bw 1Mbit/s delay 80ms plr 0.1
# 180kbps, 300msec, パケットロス率 30% (MVNOの遅いやつ程度)
sudo ipfw pipe 1 config bw 180Kbit/s delay 300ms plr 0.3
# 100kbps, 800msec, パケットロス率 50% (パケ詰まり)
sudo ipfw pipe 1 config bw 100Kbit/s delay 800ms plr 0.5
設定状況の確認
$ sudo ipfw list
00100 pipe 1 tcp from any to any dst-port 80
65535 allow ip from any to any
$ sudo ipfw pipe 1 list
00001: 100.000 Kbit/s 800 ms 50 sl.plr 0.500000 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 tcp 192.168.100.24/52102 173.194.79.109/993 11560 2753527 0 0 1680
設定を戻す
sudo ipfw flush
# "Are you sure? [yn]" と聞かれるので y
このように、通信相手とパケットロス率をこと細かに指定できるので、デバッグだけではなく「ナントカモバイルの 300kbps SIM ってどうなんだろう」というときに体感を掴むのにも役立つかもしれない。
なお、今回取り上げた ipfw(8) は DEPRECATED なので pfctl(8) でやるのが本筋かもしれないが、こちらは設定ファイルを作り込まなくてはいけない、OS ビルトインのファイアウォール機能と衝突するなど煩雑なのでおすすめできない。