Linuxトラフィック制御入門
帯域管理とQoSの基本
tc(Traffic Control)はLinuxカーネルのトラフィック制御システムを設定するコマンドです。帯域幅制限、優先順位付け、遅延シミュレーションなどのQoS機能を実現します。
こんな人向けの記事です
- Linuxで帯域幅制限を設定したい人
- ネットワーク遅延やパケットロスをシミュレーションしたい人
- QoS(Quality of Service)の基本を理解したい人
Step 1tcの基本概念
tcはiproute2パッケージの一部で、ネットワークトラフィックの「交通整理」を行います。3つの主要コンポーネントで構成されています。
| コンポーネント | 役割 |
|---|---|
| qdisc(キューイングディシプリン) | パケットのキューイング方法を定義。pfifo_fast、tbf、htb、netem等 |
| class(クラス) | 階層的qdiscで帯域幅を分割するための区分け |
| filter(フィルタ) | パケットをどのクラスに振り分けるかのルール |
ポイント: tcはLinux専用ツールです。WindowsやmacOSには直接的な相当品はありませんが、それぞれ独自のトラフィック制御メカニズムが存在します。
Step 2帯域幅制限(tbf)
TBF(Token Bucket Filter)はシンプルな帯域幅制限に使用します。
ターミナル
# eth0の送信帯域を1Mbpsに制限
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
# 10Mbpsに制限
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 256kbit latency 400ms
| パラメータ | 意味 |
|---|---|
| rate | 最大帯域幅(例:1mbit, 10mbit) |
| burst | バーストサイズ(一時的に許容するデータ量) |
| latency | キューに滞留できる最大時間 |
Step 3ネットワークエミュレーション(netem)
netemはネットワーク遅延やパケットロスをシミュレーションできます。テスト環境で非常に便利です。
ターミナル
# 100msの遅延を追加
sudo tc qdisc add dev eth0 root netem delay 100ms
# 遅延にゆらぎを追加(100ms ± 10ms)
sudo tc qdisc add dev eth0 root netem delay 100ms 10ms
# 1%のパケットロスをシミュレーション
sudo tc qdisc add dev eth0 root netem loss 1%
# 遅延 + パケットロスの組み合わせ
sudo tc qdisc add dev eth0 root netem delay 50ms loss 0.5%
# パケットの重複(1%)
sudo tc qdisc add dev eth0 root netem duplicate 1%
# パケットの順序入れ替え
sudo tc qdisc add dev eth0 root netem delay 10ms reorder 25% 50%
注意: netemの設定はリモートサーバーに対して行うと接続が切れる可能性があります。必ずコンソールアクセスが可能な状態で実行してください。
Step 4階層的帯域制御(htb)
HTB(Hierarchical Token Bucket)は、異なるトラフィックタイプに異なる帯域を割り当てるのに使用します。
ターミナル
# ルートqdiscの作成
sudo tc qdisc add dev eth0 root handle 1: htb default 30
# 親クラス(全体帯域:100Mbps)
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# 子クラス1: 高優先度(保証50Mbps、最大100Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 100mbit
# 子クラス2: 通常(保証30Mbps、最大100Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 100mbit
# 子クラス3: 低優先度(保証20Mbps、最大50Mbps)
sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 20mbit ceil 50mbit
# フィルタ: ポート80のトラフィックを高優先度に
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 80 0xffff flowid 1:10
Step 5設定の確認と削除
ターミナル
# 現在のqdisc設定を確認
tc qdisc show dev eth0
# クラスの確認
tc class show dev eth0
# フィルタの確認
tc filter show dev eth0
# 全てのtc設定を削除(デフォルトに戻す)
sudo tc qdisc del dev eth0 root
ポイント: tcの設定は再起動すると消えます。永続化するには起動スクリプトやsystemdサービスに記述してください。
Step 6実践的なユースケース
| ユースケース | コマンド例 |
|---|---|
| 低帯域環境のテスト | sudo tc qdisc add dev eth0 root tbf rate 256kbit burst 16kbit latency 400ms |
| 海外サーバー接続のシミュレーション | sudo tc qdisc add dev eth0 root netem delay 200ms 20ms |
| 不安定なネットワークの再現 | sudo tc qdisc add dev eth0 root netem delay 50ms 30ms loss 2% duplicate 0.5% |
| バックアップトラフィックの帯域制限 | HTBでクラス分けし、バックアップ用クラスにceil制限を設定 |
注意: tcは送信(egress)トラフィックのみ制御します。受信(ingress)トラフィックを制御するには IFB(Intermediate Functional Block)デバイスを使用する必要があります。