意図的に通信を遅延させるテスト環境の構築 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
遅延を大きくすると数百ms単位での誤差が出てしまうようですが、一応それっぽく遅延することができました。
早速試してみたところ、遅延設定を2000ms程度の場合は単純に2秒ほど映像や音声が遅延するだけで、画面や音声の途切れませんでした。
100~5000msの遅延を組み合わせてみたらどうなるんだろうなぁ。
この記事が気に入ったらサポートをしてみませんか?