0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WLANトラブル再現環境の作り方 - tc/netemで回線品質を落とす

0
Last updated at Posted at 2026-07-14

WLANトラブル再現環境の作り方(エミュレーション編)- Orange Pi R1 と tc/netem で回線品質を落とす

はじめに

この記事は、WLAN(Wireless LAN)機器のトラブルを手元で再現するためのネットワークエミュレーション環境づくりの第2回です。
前回(全体構成編)で示した構成のうち、心臓部である「劣化注入装置」= Orange Pi R1 の作り方を扱います。

手元のOrange Pi R1本体

見た目は名刺サイズの基板ですが、これがネットワークの途中に挟まる「透過ブリッジ」の実体です。特別な機材を新調しなくても、この程度のボードとLinuxがあれば劣化注入は成立します。

  1. 全体構成編:設計要件と全体構成、機材の役割
  2. エミュレーション編(本記事):Orange Pi R1 と tc/netem で回線品質を落とす
  3. 観測編:ミラーポートと Wireshark で通信を見える化する

なお、実案件で取得した測定結果は載せられないため、本記事は「同じ環境をどう作るか」の手順とコマンドに焦点を当てます。
値はすべて例示ですが、コマンド自体はそのまま使える形で書いています。

この記事でお伝えしたいこと

結論から書くと、次の3点です。

  1. NICが2枚あるLinuxボードは、コマンド数行で「透過ブリッジ」になる
  2. netem の劣化は送信(egress)にしか効かない。ただし2枚NICのブリッジなら「下り=DUT側NIC」「上り=WAN側NIC」と方向別に自然に分離できる
  3. 劣化は「帯域 → 遅延 → ロス」の順に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から送信」されます。

図1: 透過ブリッジと方向別のnetem劣化注入

方向と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 がある場合は addchange にします。

# 下りに 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点セットが手軽です。

  1. ping:DUT側セグメントのPCからゲートウェイ(192.168.0.1)へping。遅延設定分だけRTTが増えているか
  2. スピードテスト:AP配下のPC(前回の測定PC B)でFast.comなどを実行。設定した帯域あたりで頭打ちになるか
  3. tc -s qdiscdroppeddelay の統計が動いているか

第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 で作れない「本物の無線の癖」は、保冷バッグのような物理的手段で補えます。

関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?