
画像: ジャック・ウォーレン
トラフィック制御コマンド(tc)は、すべてのネットワーク管理者が知っておくべきツールです。tc は、カーネルパケットスケジュールを設定して、UDP/TCP アプリケーションのパケット遅延や損失をシミュレートしたり、特定のサービスの帯域幅使用量を制限したりすることを可能にします。
Linuxサーバーのネットワークトラフィックを制御するためにtcコマンドを活用する方法をご紹介します。これにより、構成が不適切だったり、一貫性が欠けているネットワークにおいて、アプリケーションがどのように動作するかをより適切にテストできます。
参照:DevOpsの実装:ITプロフェッショナル向けガイド(無料PDF)(TechRepublic)
必要なもの
Ubuntu Server 18.04のインスタンスでデモを行います。このコマンドはどのLinuxサーバーでも使用できますが、ツールのインストール手順(プリインストールされていない場合)はサーバーによって異なります。また、sudo権限を持つユーザーも必要です。
tcコマンドのインストール方法
tc コマンドがデフォルトでインストールされていない場合は、Ubuntu では iproute2 にパッケージ化されています。以下の手順でインストールしてください。
sudo apt-get install iproute2 -y
基本的な使い方
まず最初に、カーネルパケットスケジューラに適用するインターフェースの名前を調べます。これを行うには、次のコマンドを実行します。
ip a
このコマンドは、すべてのネットワーク デバイスの情報を一覧表示します (図 A )。
図A
私のマシンのens5インターフェースに一定の遅延を追加することで、この動作を実証します。具体的には、デバイスの送信トラフィック(出力)を50ミリ秒遅延させます。この場合のコマンドは以下のようになります。
sudo tc qdisc add dev ens5 root tbf rate 1024kbit latency 50ms burst 1540
上記のコマンドのオプションは次のとおりです。
- qdiscはtcにスケジューラを変更するように指示する
- addはtcに新しいルールを追加するように指示します
- dev ens5はtcにルールがデバイスens5に適用されることを伝えます
- rootはtcにアウトバウンドトラフィックスケジューラを変更するように指示する
- tbf rate 1024kbit はtc にトラフィックを 1024kbit レートまで遅くするよう指示します。
- レイテンシ50msは、トラフィックを50ms遅らせることをtcに伝えます。
- バースト1540はtcにバケットのサイズを伝えます
コマンドを発行したら、コマンドでパラメータが適用されたことを確認できます。
sudo tc qdisc show dev ens5
各オプションが適切に設定されていることがわかります (図 B )。
図B
新しく追加されたルールを削除するには、次のコマンドを発行します。
sudo tc qdisc del dev ens5 root
覚えておくべき非常に重要な点は、インターフェースには一度に1つのルールしか適用できないということです。そのため、インターフェースに別のルールを作成するには、まず以前のルールを削除する必要があります。
tcコマンドでパケットロスをシミュレートする方法
例えば、アプリケーションを開発していて、ネットワーク上でパケットロスがどのように処理されるかをテストする必要があるとします。これは、アプリケーションが適切に構成されていないネットワークや信頼性の低いネットワークにも耐えられることを確認するために非常に重要です。以下に、パケットロスをシミュレートするtcコマンドの例を2つ示します。
sudo tc qdisc add dev ens5 root netem loss 0.1%
上記のコマンドは、0.1% の確率でランダムにパケットをドロップします。
パケット損失確率を 0.3% にし、以前のパケットのドロップ率を 25% にしたい場合はどうすればよいでしょうか。そのコマンドは次のようになります。
sudo tc qdisc add dev ens5 root netem loss 0.3% 25%
上記のコマンドを実行した後、ネットワーク上の別のマシンに ping テストを実行すると、パケット損失が表示されるはずです (図 C )。
図C
このルールを適用したら、アプリケーションを起動し、ネットワークの調子があまり良くないときにどれだけうまく動作するかを確認します。アプリケーションが失敗する場合は、さらに作業が必要です。
特定のパケット損失ルールが十分でない場合は、次の 2 つの状態を定義する Gilbert-Elliot 方式を採用できます。
- 良好(またはギャップを落とす)
- 悪い(またはバーストを落とす)
この方式は、単純なパケットロスではなく、ネットワーク障害をより正確にモデル化します。ギルバート・エリオット方式を使用する場合、コマンドは次のようになります。
sudo tc qdisc add dev ens5 root netem loss gemodel 1% 10% 70% 0.1%
ここで ping テストを実行すると、以前と同様の数値が表示されますが、パケット損失はテストの目的に応じてより現実的なものになるはずです (図 D )。
図D
以上が、Linuxマシン上のネットワークトラフィックを制御するtcコマンドの使用例です。これにより、ネットワーク対応アプリケーションのテストをより適切に行うことができます。tcの詳細については、man tcコマンドを実行し、マニュアルページをよくお読みください。