Linuxを使うと、サーバーに流れるトラフィックに対して、色々な制御をかけることが出来るってご存じでしょうか? tcというコマンドを使うと簡単に実現できるんですが、いざ使おうと思った時にパッと思い出せないものだったりします。そんな時、最近仕事で使うことがあったので、備忘録としてまとめておこうと思いました。
環境準備
今回は、tcコマンドを実行する環境として、ラズパイ3を使います。ラズパイ3にUSB-NICを2つ挿すと、大体自動で認識してくれるし、モノが小さいのどんなネットワーク環境にもさっと割り込めるのがいいところです。LinuxのディストリビューションはDebian GNU/Linuxを使います。
今回作った環境は以下のような感じです。
Switch1 ———- [USB-NIC1:eth1] ラズパイ [USB-NIC2:eth2] ——— Switch2
こんな感じでSwitch1 から Switch2に対してトラフィックを送信し、ラズパイを通過するそのトラフィックに対して制御をかけます。
ラズパイにブリッジインターフェースの設定
ブリッジインターフェースとは、受信したトラフィックをそのままスルーして別のインターフェースに送信するインターフェースのことです。ようはリピーターみたいなものです。
ブリッジインターフェースを作るには、以下のコマンドでbridge-utilsをインストールして、設定すればOKです。
・bridge-utilsのインストール
sudo apt install bridge-utils
・interfacesの編集
sudo vi /etc/network/interfaces
下記サンプルのように、最後の行に★マークの行を追加すると、eth1とeth2を関連付けし、そこに流れるトラフィックを通過させます。
linux@raspi:/etc/network $ cat interfaces # interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto vbr0 iface vbr0 inet manual bridge_ports eth1 eth2★
tcコマンドでできること
tcコマンドでトラフィックに対して制御できる事として
・遅延
・パケロス
・フィルター
・帯域制御
の4種類です。
tcの情報を調べていると、他にも色々できる事ありそうな感じですが、ひとまずこの4種類を抑えておけば問題ないでしょう。
遅延コマンド
sudo tc qdisc add dev eth2 root netem delay 100ms
上記コマンドを実行すると、流れるトラフィックに対して、100msの遅延を負荷することができます。端末から、Pingを飛ばしながらこの遅延の設定を投入したり、削除したりすると、分かりやすく遅延が効いてるのが分かるので面白いです。
パケロスコマンド
sudo tc qdisc add dev eth2 root netem loss 10%
上記コマンドでは、シンプルに流れるトラフィックの10%をロスさせます。
例えば1秒間に10発のトラフィックを流した場合、送信先に届くのは、結構キレイ1秒間に9発しか届かなくなります。
帯域制御コマンド
sudo tc qdisc add dev eth2 root tbf limit 200Kb buffer 100Kb rate 200Kbps
このコマンドで、1Mbpsのトラフィックを流した場合、200Kbpsしか流れないようになります。
尚、ネットで調べた感じだと、各オプションは以下のような意味らしいですが、最後のrate以外の値はどのくらい影響出るのか、試してはいないです。
limit データキューのサイズ
buffer 100Kb バケツのサイズ
rate 200Kbps トークン補充速度(帯域幅)
※tcコマンドでは’b’はbitではなくByteなので、そこの計算はちゃんと意識しないと制御したいrateと差が出る可能性があるので注意。
Packet Filterコマンド
sudo tc qdisc add dev eth2 root handle 1: prio sudo tc qdisc add dev eth2 parent 1:3 handle 30: netem drop 100% sudo tc filter add dev eth2 protocol ip parent 1: prio 3 u32 \ match ip dst 192.168.100.2/32 \ match ip src 192.168.100.1/32 \ match ip dport 1812 0xffff \ match ip sport 1812 0xffff \ flowid 1:3
tcコマンドで一番面倒なのはPacket Filterコマンドでしょう。
上記サンプルのコマンドを全部投入して、やっとFilterの設定が完了です。
上記サンプルを設定した場合は、4行書いてあるmatchの値にすべて一致したら、パケットをドロップさせます。
drop値は100%しか試してませんが、50%とかも設定できるかと思います。
また、dropだけではなく、ほかの遅延や帯域制御とも組み合わせて使えるので、それは上記サンプルを改造してみてください。
handle 1とか、parent 1:3とか、handle 30とか、そのあたりの数値は特に決まってないようなので、ある程度任意の数字でもいけそうです。数値を変えれば、複数のフィルター設定が可能になります。
tc設定確認コマンド
sudo tc -s qdisc show dev eth2
このコマンドで、今設定している内容が確認できます。
設定前と、設定後で、表示内容が変わるのでそれでちゃんと設定できているのか確認します。
tc設定削除コマンド
sudo tc qdisc del dev eth2 root
上記コマンドで、tcで設定した内容を削除できます。
遅延・パケロス・帯域制御・フィルターともに共通で削除できます。
tcコマンド注意点
tcコマンドは、パケットの出口となるインターフェースに設定しないと効かないという特性があるので、どちら側のインターフェースが出口になるのかを、意識して設定する必要があります。
最後に
tcコマンドでよく使う設定コマンドをまとめましたが、環境によってはインターフェースの名前を変えたりする必要が出てくると思います。その場合はその都度最適なインターフェース名に変えて設定してみてください。それ以外はだいたいそのままコピペで使えると思いますので。