Linuxサーバーでネットワークトラフィックを制御したいってとき、「tc」コマンドで実現ができます。

今回は、トラフィック発生コマンドの「iperf3」を利用して、設定を確認してみました。

準備します

iperf3」はサーバー/クライアントで動作します。

今回は、出力の方の制御を確認したかったので、トラフィックを受ける側(サーバー)のPCを準備します。
※今回はCentOS7を準備しました。クライアントはubuntu20です。

・クライアント側
$ iperf3 -c サーバーのアドレス

・サーバー側
$ iperf3 -s

・ファイアウォールの設定

ポートとして、5201 / tcp,udp を利用しますのでfirewallやufwなどで制限されている場合は開けといてください。

・サーバー側のfirewalld設定
# firewall-cmd –add-port=5201/tcp
# firewall-cmd –add-port=5201/udp

測定中だけ必要なんで、ランタイムに設定して、終わったらfirewalldを再起動する。

・クライアント側のufwの設定
$ sudo ufw allow 5201/tcp
$ sudo ufw allow 5201/udp

測定を終わったら、番号指定で削除します。
$ sudo ufw status numbered
ufw delete 2

帯域制御をやってみましょう!

制御をしない状態を計測してみます。

まずは、素のままの状態を図ってみます。

・サーバー側
$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from xxx.xxx.xxx.xxx, port 41922
[ 5] local xxx.xx.xxx.xxx port 5201 connected to xxx.xxx.xxx.xxx port 41924
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 11.0 MBytes 91.9 Mbits/sec
[ 5] 1.00-2.00 sec 11.4 MBytes 95.7 Mbits/sec
[ 5] 2.00-3.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 3.00-4.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 4.00-5.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 5.00-6.00 sec 11.4 MBytes 95.7 Mbits/sec
[ 5] 6.00-7.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 7.00-8.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 8.00-9.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 9.00-10.00 sec 11.4 MBytes 95.6 Mbits/sec
[ 5] 10.00-10.04 sec 505 KBytes 95.4 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-10.04 sec 0.00 Bytes 0.00 bits/sec sender
[ 5] 0.00-10.04 sec 114 MBytes 95.3 Mbits/sec receiver

・クライアント側
$ iperf3 -c サーバー側アドレス
Connecting to host xxxx.xxx.xxx.xxx, port 5201
[ 4] local xxxx.xxx.xxx.xxx port 41924 connected to xxxx.xxx.xxx.xxx port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 13.9 MBytes 116 Mbits/sec 192 157 KBytes
[ 4] 1.00-2.00 sec 11.4 MBytes 95.9 Mbits/sec 0 206 KBytes
[ 4] 2.00-3.00 sec 11.4 MBytes 95.4 Mbits/sec 0 245 KBytes
[ 4] 3.00-4.00 sec 11.4 MBytes 95.9 Mbits/sec 11 136 KBytes
[ 4] 4.00-5.00 sec 11.4 MBytes 95.4 Mbits/sec 0 189 KBytes
[ 4] 5.00-6.00 sec 11.4 MBytes 95.9 Mbits/sec 0 232 KBytes
[ 4] 6.00-7.00 sec 11.4 MBytes 95.4 Mbits/sec 3 266 KBytes
[ 4] 7.00-8.00 sec 11.4 MBytes 95.4 Mbits/sec 21 146 KBytes
[ 4] 8.00-9.00 sec 11.4 MBytes 95.9 Mbits/sec 0 198 KBytes
[ 4] 9.00-10.00 sec 11.4 MBytes 95.4 Mbits/sec 0 238 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 117 MBytes 97.7 Mbits/sec 227 sender
[ 4] 0.00-10.00 sec 114 MBytes 95.6 Mbits/sec receiver

まぁ、100Mbpsの速度が出ています(^^)

帯域制御をしてみます

tcコマンドのざっとした説明

制限のパターン
tbf:トークンバケットフィルター
パケットシェーピング機能
制限レートを超えたパケットはキューに保留されます。
htb:ヒエラルキートークンバケット
各サービスに最低限必要な帯域を割り当てることができます。
1つのリンクを複数のサービス(www,ftp等)で共有する

今回は tbf を利用します。
※他にもありますので、調べてみてください(^^)

50mbit(50Mbps)に制限します。

$ sudo tc qdisc add dev ens3 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb
※50mbpsって指定すると、50Mbyte/secとなります(^^;

・burstはこんな計算式

burst(byte) = rate(byte) / HZ
burst = (50 * 10^6 / 8) / 250 = 25 * 10^3

HZはこうやって確認します。
$ cat /boot/config-uname -r | grep ‘CONFIG_HZ=’
CONFIG_HZ=250

帯域制御中の測定値

$ iperf3 -c xxx.xxx.xxx.xxx
Connecting to host xxx.xxx.xxx.xxx, port 5201
[ 4] local xxx.xxx.xxx.xxx port 42682 connected to xxx.xxx.xxx.xxx port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 4.99 MBytes 41.7 Mbits/sec 0 93.3 KBytes
[ 4] 1.00-2.00 sec 4.16 MBytes 34.9 Mbits/sec 0 93.3 KBytes
[ 4] 2.00-3.00 sec 4.23 MBytes 35.4 Mbits/sec 0 93.3 KBytes
[ 4] 3.00-4.00 sec 4.35 MBytes 36.5 Mbits/sec 0 97.6 KBytes
[ 4] 4.00-5.00 sec 4.23 MBytes 35.4 Mbits/sec 0 97.6 KBytes
[ 4] 5.00-6.00 sec 4.10 MBytes 34.4 Mbits/sec 0 97.6 KBytes
[ 4] 6.00-7.00 sec 4.29 MBytes 36.0 Mbits/sec 0 97.6 KBytes
[ 4] 7.00-8.00 sec 4.10 MBytes 34.4 Mbits/sec 0 97.6 KBytes
[ 4] 8.00-9.00 sec 4.23 MBytes 35.4 Mbits/sec 0 97.6 KBytes
[ 4] 9.00-10.00 sec 4.23 MBytes 35.6 Mbits/sec 0 97.6 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 42.9 MBytes 36.0 Mbits/sec 0 sender
[ 4] 0.00-10.00 sec 42.3 MBytes 35.5 Mbits/sec receiver

50Mbitsあたりに収まってくれてます。

終了したら帯域制御を解除しときましょう

$ sudo tc qdisc del dev ens3 root