WLANトラブル再現環境の作り方(エミュレーション編)- Orange Pi R1 と tc/netem で回線品質を落とす
はじめに
この記事は、WLAN(Wireless LAN)機器のトラブルを手元で再現するためのネットワークエミュレーション環境づくりの第2回です。
前回(全体構成編)で示した構成のうち、心臓部である「劣化注入装置」= Orange Pi R1 の作り方を扱います。
見た目は名刺サイズの基板ですが、これがネットワークの途中に挟まる「透過ブリッジ」の実体です。特別な機材を新調しなくても、この程度のボードとLinuxがあれば劣化注入は成立します。
- 全体構成編:設計要件と全体構成、機材の役割
- エミュレーション編(本記事):Orange Pi R1 と tc/netem で回線品質を落とす
- 観測編:ミラーポートと Wireshark で通信を見える化する
なお、実案件で取得した測定結果は載せられないため、本記事は「同じ環境をどう作るか」の手順とコマンドに焦点を当てます。
値はすべて例示ですが、コマンド自体はそのまま使える形で書いています。
この記事でお伝えしたいこと
結論から書くと、次の3点です。
- NICが2枚あるLinuxボードは、コマンド数行で「透過ブリッジ」になる
- netem の劣化は送信(egress)にしか効かない。ただし2枚NICのブリッジなら「下り=DUT側NIC」「上り=WAN側NIC」と方向別に自然に分離できる
- 劣化は「帯域 → 遅延 → ロス」の順に1つずつ入れて、そのつど効きを確認するのが定石
前提環境
| 項目 | 内容 |
|---|---|
| ハードウェア | Orange Pi R1(有線NIC×2の小型Linuxボード。Raspberry Pi + USB-LANでも代替可) |
| OS | Armbian(Debian系)。Debian/Ubuntu系なら手順はほぼ同じ |
| 必要パッケージ | iproute2(tc コマンド。通常は標準搭載) |
| NIC | eth0(WAN側)、enxc0742bfffb4a(DUT側・USB-LAN) |
USB-LAN側のインターフェース名(enx…)はMACアドレス由来です。ip link で自分の環境の名前を確認して読み替えてください。
netem がカーネルに入っているかは、次で確認できます。
sudo modprobe sch_netem && echo OK
Step 1:透過ブリッジ(br0)を作る
2枚のNICをL2ブリッジで束ねます。これで Orange Pi は「ただの通り道」になり、DUT側の設定変更なしで経路に挟めるようになります(前回の要件2)。
# ブリッジ作成と NIC の参加
sudo ip link add name br0 type bridge
sudo ip link set eth0 master br0
sudo ip link set enxc0742bfffb4a master br0
# 全インターフェースを up
sudo ip link set eth0 up
sudo ip link set enxc0742bfffb4a up
sudo ip link set br0 up
# 管理用IPを br0 に付ける(SSHでの操作用。物理NICには付けない)
sudo ip addr add 192.168.0.101/24 dev br0
sudo ip route add default via 192.168.0.1
この時点で、DUT側(スイッチ経由)とWAN側(ハブ経由)の通信が Orange Pi を素通りするようになります。
DUTから普段どおりインターネットへ出られること、手元のPCから ssh 192.168.0.101 で入れることを確認しておきます。
再起動しても構成が残るようにするには、/etc/network/interfaces に書いておきます(Armbianの一例)。
auto br0
iface br0 inet static
address 192.168.0.101
netmask 255.255.255.0
gateway 192.168.0.1
bridge_ports eth0 enxc0742bfffb4a
bridge_stp off
Step 2:netem の考え方 — 劣化は「送信側」に効く
tc / netem で最初につまずくのがここです。
netem(qdisc)は、NICから送信されるパケットにしか作用しません。 受信側で絞ることは(ifbという仕掛けを使わない限り)できません。
ふつうの1枚NICのマシンだと、ここで ifb を持ち出すことになって急に難しくなるのですが、今回の構成はブリッジでNICが2枚あります。すると話は単純で、通過するトラフィックは必ず「どちらかのNICから送信」されます。
方向とNICの対応はこうなります。
| 劣化させたい方向 | パケットの流れ | qdisc を付けるNIC |
|---|---|---|
| 下り(ダウンロード) | WAN → DUT | enxc0742bfffb4a(DUT側)の egress |
| 上り(アップロード) | DUT → WAN | eth0(WAN側)の egress |
つまり 下りと上りを別々の値で劣化させられる、ということです。実回線の「下り15Mbps/上り6Mbps」のような非対称も素直に再現できます。
なお、qdisc は物理NICに付けます。br0 に付けても、ブリッジ転送されるフレームには効かないので注意してください(ハマりどころで後述)。
Step 3:劣化注入コマンド集
以降、値はすべて例です。1つずつ入れて、そのつど効きを確認します。
帯域制限
# 下り 6Mbps に制限(DUT側NICの送信を絞る)
sudo tc qdisc add dev enxc0742bfffb4a root netem rate 6mbit
# 上り 4Mbps に制限(WAN側NICの送信を絞る)
sudo tc qdisc add dev eth0 root netem rate 4mbit
遅延(ジッタ付き)
すでに qdisc がある場合は add を change にします。
# 下りに 40ms ± 10ms の遅延(正規分布)
sudo tc qdisc change dev enxc0742bfffb4a root netem rate 6mbit delay 40ms 10ms distribution normal
遅延は「片方向に付けた値がそのままRTTに乗る」点に注意してください。上下両方に40msを入れると、pingのRTTは約80ms増えます。
パケットロス
# 下りに 0.5% のランダムロスを追加
sudo tc qdisc change dev enxc0742bfffb4a root netem rate 6mbit delay 40ms 10ms distribution normal loss 0.5%
ロスには相関も指定できます。loss 1% 25% と書くと「直前のパケットがロスした場合、次も25%の確率でロスする」となり、無線らしいバースト的なロスに近づきます。
プリセット例:モバイル回線風
前回の3系統でいう「シミュレート回線」を、実測したモバイル回線(下り15Mbps/上り6Mbps)に寄せる例です。
# 下り
sudo tc qdisc add dev enxc0742bfffb4a root netem rate 15mbit delay 50ms 15ms distribution normal loss 0.3%
# 上り
sudo tc qdisc add dev eth0 root netem rate 6mbit delay 50ms 15ms distribution normal loss 0.3%
確認と解除
# 現在の設定と統計(送信数・ドロップ数)を確認
tc -s qdisc show dev enxc0742bfffb4a
tc -s qdisc show dev eth0
# 劣化を解除して素通しに戻す
sudo tc qdisc del dev enxc0742bfffb4a root
sudo tc qdisc del dev eth0 root
tc -s の statistics に dropped が増えていれば、ロスや帯域制限が実際に効いている証拠です。
Step 4:効いているかを確認する
コマンドを入れたら、必ず外形的に確認します。今回の構成では次の3点セットが手軽です。
- ping:DUT側セグメントのPCからゲートウェイ(192.168.0.1)へping。遅延設定分だけRTTが増えているか
- スピードテスト:AP配下のPC(前回の測定PC B)でFast.comなどを実行。設定した帯域あたりで頭打ちになるか
-
tc -s qdisc:
droppedやdelayの統計が動いているか
第1回に書いた「シミュレート回線:下り6Mbps/上り4Mbps」は、まさにこの方法で設定・実測した平均値です。
ハマりどころ
実際に組んだときに引っかかった(または引っかかりやすい)ポイントです。
br0 に qdisc を付けても効かない。 ブリッジ転送されるフレームは物理NICから送信されるため、netem は必ず物理NIC(eth0 / enx…)側に付けます。
管理IPを物理NICに付けてしまう。 ブリッジ構成では物理NICはIPを持たず、IPは br0 に付けます。物理側に付けると、つながったり切れたりの不安定な状態になりがちです。
USB-LAN側の実力以上は出ない。 Orange Pi R1 のUSB-LANは100Mbpsクラスです。「劣化なし」状態でも100Mbps以上は通らないため、この装置は高速回線の性能測定には使えません。あくまで低速・劣化環境の再現用です。
遅延を上下二重に入れてRTTが想定の2倍になる。 前述のとおり、RTTで考えるなら片方向分ずつ設計します。
再起動で qdisc が消える。 tc の設定は揮発します。今回の用途では「起動時は素通し、試験のときだけ手動で投入」の運用が事故がなくおすすめです。恒久化したい場合は systemd のサービスや /etc/rc.local に書きます。
コラム:物理で「本物のロス」を作る
netem のロスは、あくまで数値どおりの確率的なロスです。実際の無線劣化には、電波強度の低下にともなうレート低下や再送など、netem では作り込めない癖があります。
そこで現場の小技として、モバイルルーターを保冷バッグに入れる方法があります。アルミ蒸着の保冷バッグが簡易シールドになり、5G/LTEの電波を減衰させて「本物の圏外ギリギリ」を再現できます。
netem の「数値で作るロス」と、保冷バッグの「物理で作るロス」を使い分けると、再現できるトラブルの幅が広がります。電波暗箱を買わずに済む、というのもポイントです。
※ 意図的な電波妨害(ジャミング)は電波法違反ですが、自分の機器を遮蔽物で覆って減衰させることは問題ありません。
今回の範囲と次回
この記事で扱ったこと
- 透過ブリッジ(br0)の作り方と恒久化
- netem の方向別劣化(帯域・遅延・ロス)のコマンドと確認方法
- 物理的にロスを作る小技
次回で扱うこと
- 第3回:ミラーポートの設定と Wireshark での観測。劣化を入れたときに通信がどう見えるか、の観点整理
まとめ
- NIC2枚のLinuxボードは、
ip link数行で透過ブリッジになります。 - netem は egress にのみ作用しますが、ブリッジ構成なら「下り=DUT側NIC/上り=WAN側NIC」で方向別に劣化を設定できます。
- 劣化は帯域→遅延→ロスの順に1つずつ入れ、ping・スピードテスト・
tc -s qdiscの3点で効きを確認します。 - netem で作れない「本物の無線の癖」は、保冷バッグのような物理的手段で補えます。


