意図的に通信を遅延させるテスト環境の構築 with Raspberry Pi4

無線LAN環境で Teams や ZOOM などで遠隔会議をしていると、画面がカクついたり、音声が飛んでしまったりという現象が散見されたのを見かけて、通信状態とアプリの状態を見比べてみたくなった。

というわけで、遅延やノイズをコントロールして、"安定した劣悪な通信環境"を手に入れたいという話です。遅延については下記の方法で実現できましたが、ノイズ(定期的にパケットを破棄する)についてはまだ実現できていません。

下記のような構成で構築します。

[ PC ] <-> [ 遅延装置 ] <-> [ルータ] <-> [www]

今回遅延装置に用いたのは Raspberry Pi4 ですが、tcコマンドが使えるlinuxであれば何でもOKです。

Raspberry Pi4 はRJ45インターフェイスが1個しかないので、別途RJ45toUSBのコネクタが必要です。eth0はクライアント側、eth1はルータ側のインターフェイスを想定しています。

Raspberry Pi OSの設定ですが ip_forward は off になっているので、これを有効化します。

echo 1 >/proc/sys/net/ipv4/ip_forward
 
vi  /etc/sysctl.d/ipforward.conf
  net.ipv4.ip_forward=1

NATの設定は nftables で行います。

sudo apt update
sudo apt install nftables  # nftablesをインストール
# サービスを再起動する
systemctl restart nftables

# eth0とeth1間のNATを設定する
vi /etc/nftables.conf
  #!/usr/sbin/nft -f
  
  flush ruleset
  table inet filter {
         chain input {
                 type filter hook input priority 0;
         }
         chain forward {
                 type filter hook forward priority 0;
         }
         chain output {
                 type filter hook output priority 0;
         }
  }
  table ip nat {
    chain prerouting {
      type nat hook prerouting priority 0;
    }
    chain postrouting {
      type nat hook postrouting priority 100;
      oifname "eth0" masquerade
    }
  }
 
# OS起動時にサービスを自動起動する
systemctl enable nftables
# サービスを再起動する
systemctl restart nftables

nftのコマンドやpriorityなどはQuickReferenceなどを参照

NATがうまく設定されているかpingで疎通確認できたらtcコマンドで遅延

# 3000ms遅延させる
tc qdisc add dev eth1 root handle 1:0 netem delay 3000ms
# 遅延設定を解除する
tc qdisc del dev eth1 root
# 100ms遅延させる
tc qdisc add dev eth1 root handle 1:0 netem delay 100ms

画像1

遅延を大きくすると数百ms単位での誤差が出てしまうようですが、一応それっぽく遅延することができました。

早速試してみたところ、遅延設定を2000ms程度の場合は単純に2秒ほど映像や音声が遅延するだけで、画面や音声の途切れませんでした。

100~5000msの遅延を組み合わせてみたらどうなるんだろうなぁ。



この記事が気に入ったらサポートをしてみませんか?