Ubuntu 回線エミュレータ

# 背景
ネットワーク機器のテストするときによくやる内容を備忘録的に書いておく
# 環境
・ESXi
・Ubuntu22.04
・その他　仮想ネットワーク機器達
# 概要構成
NW機器 - ポートグループ1 - ens224_Ubuntu_ens192 - ポートグループ2 - NW機器

ens160はデフォルトの最初のNICなのでそれ以外の2つを使う感じにした
追加2つのNICを入れると勝手にens192やens224このような番号が付くはず
2つのNICをブリッジ設定にすることで回線エミュレータのようにつかえる

ESXiのポートグループのセキュリティ設定を
無差別モード、MAC アドレス変更、偽装転送をOKにしておくのが重要
※Ubuntu側でも同じようなコマンドをやってあげる　後述

## Ubuntu ブリッジ作成
```
# APT install
sudo apt get install bridge-utils
# Bridge interface
brctl addbr br0
#ip add addr 192.168.x.x dev br0 #if you need
# Flush ip address
ip addr flush ens224
ip addr flush ens192
# Promisc ON
ip link set dev ens224 promisc on
ip link set dev ens192 promisc on
# Interface DOWN/UP
ip link set dev ens224 down
ip link set dev ens192 down
ip link set dev ens224 up
ip link set dev ens192 up
ip link set dev br0 up
# Check command
brctl show 
# Sample
# bridge name    bridge id       STP enabled  interfaces
# br0            xxxx.xxxxxxxx   no           ens224
                                              ens192
```
## Ubuntu TCコマンド
TCコマンドはパケットの出る方向に効力がある。
例えば、ens224-->ens192に対してパケットが流れている場合
"eno192"を指定してtcコマンドを実行する
### 遅延100ms ロス5%の場合
```
sudo tc qdisc add dev ens224 root netem delay 100ms loss 5%
sudo tc qdisc add dev ens192 root netem delay 100ms loss 5%
```
### アップロード方向 (ens224) の帯域制限
アップロードで使用するインターフェースens224に10Mbpsの帯域制限を適用
```
# 上り方向に HTB を設定
sudo tc qdisc add dev ens224 root handle 1: htb default 10
# HTB のルートクラスを作成し、最大帯域を指定
sudo tc class add dev ens224 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
# デフォルトクラスを作成
sudo tc class add dev ens224 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
```
### ダウンロード方向 (ens192) の帯域制限
ダウンロードで使用するインターフェース ens192に10Mbpsの帯域制限を適用

```
# 下り方向に HTB を設定
sudo tc qdisc add dev ens192 root handle 1: htb default 10
# HTB のルートクラスを作成し、最大帯域を指定
sudo tc class add dev ens192 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
# デフォルトクラスを作成
sudo tc class add dev ens192 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
```
### 遅延100ms ロス5%、10Mbps帯域制限 全部まとめて設定する
```
# アップロード方向 (ens224)
sudo tc qdisc add dev ens224 root handle 1: htb default 10
sudo tc class add dev ens224 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
sudo tc class add dev ens224 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
sudo tc qdisc add dev ens224 parent 1:10 handle 10: netem delay 100ms loss 5%
# ダウンロード方向 (ens192)
sudo tc qdisc add dev ens192 root handle 1: htb default 10
sudo tc class add dev ens192 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
sudo tc class add dev ens192 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit
sudo tc qdisc add dev ens192 parent 1:10 handle 10: netem delay 100ms loss 5%
```
### 確認
```
sudo tc qdisc show dev ens224
sudo tc qdisc show dev ens192
```
### 削除
遅延、ロス、帯域制限の値を変えるときには一回これで消す
```
sudo tc qdisc del dev ens224 root
sudo tc qdisc del dev ens192 root
```

# 参考
tcコマンドでネットワークの障害を再現して動作検証する方法
https://zenn.dev/ryoma_dq/articles/20241126-network-tc
Ubuntuのブリッジ化とネットワークエミュレート(簡易版) - Qiita 
https://qiita.com/ikedaS-06/items/6013c3f733140b18f052
tcコマンドでNetworkの帯域と遅延を制御してみてみた - Qiita
https://qiita.com/shirok/items/f57e0ecd86abec33a087
Linux日和～Linuxネットワーク設定：netemでパケット遅延、ロス～ 
https://linux-biyori.sakura.ne.jp/setting/st_netem.php
tcコマンドでネットワーク遅延やパケットロスを疑似的に発生させるメモ 
https://inokara.hateblo.jp/entry/2016/02/14/191853
Linuxでネットワーク遅延を模倣する方法
https://ittrip.xyz/soft/linux/simulate-network-latency-linux
Linux上でネットワークの帯域制限と遅延を設定する
https://blog.bitmeister.jp/?p=3930
tcconfigを使って、ネットワークの帯域制限や遅延を再現する方法 - Qiita
https://qiita.com/ntrlmt/items/67ac87d7f8852c4ed68b
tcコマンドの使い方 - hana_shinのLinux技術ブログ 
https://hana-shin.hatenablog.com/entry/2022/03/13/183444
【Ubuntu】TC Command 通信に遅延を入れる方法
https://papaeng.net/ubuntu_tc_command/