Linux全般/cbq


RedHat LinuxでCBQ(QoS)を設定した時のメモ

前置き

カーネル2.4系はrecompileしなくてもデフォルトで使えます。
手順としては

RedHat 2.1系

  • 設定ファイルを書く
  • cbqのスタート

RedHat 3.0系

  • 設定ファイルを書く
  • 設定ファイルを読み込む
  • cbqのスタート

RedHat 4.0系以降

  • cbq.initスクリプトのDL
  • 設定ファイルを書く
  • cbq.initのスタート

CentOS 6

  • iproute-docのインストール
  • cbq.initスクリプトのコピー
  • 設定ファイルを書く
  • cbqのスタート

CentOS 7

  • 未検証ですが、CentOS6の手順をsystemctlに置き換える感じ?

といった感じです。
いろんなサイトで散々説明されてますが、

設定するマシンから見て外向きのトラフィックしか制限できません

ほんとにここは注意して下さい。
では順番に説明してきます。

cbq.initスクリプトのDL

Redhat4系では必須です。
このへんのURLからダウンロードし、/etc/init.d/cbqにコピーします。
パーミッションの設定は忘れないように。

iproute-docのインストール

CentOS6の場合はiproute-docをインストールします。
# yum install iproute-doc

cbqスクリプトのコピー

CentOS6の場合はスクリプトを/etc/init.d/cbqにコピーします。
# cp -p /usr/share/doc/iproute-doc-2.6.32/examples/cbq.init-v0.7.3 /etc/init.d/cbq
# chmod 755 /etc/init.d/cbq

また、以下の2行をstart処理の中に記述します。
/sbin/ethtool -K em2 tso off
/sbin/ethtool -K em2 gso off

こうなってるのを
start|compile)

### Probe QoS modules (start only)
for module in $CBQ_PROBE; do
        $MP $module | | cbq_failure "failed to load module $module"
done
↓こんな感じにする
start|compile)

### Probe QoS modules (start only)
for module in $CBQ_PROBE; do
        $MP $module | | cbq_failure "failed to load module $module"
done

/sbin/ethtool -K em2 tso off
/sbin/ethtool -K em2 gso off

設定ファイルを書く

めちゃくちゃ面倒です。
項目一つずつ説明します。

DEVICE

DEVICE=eth0,100Mbit,10Mbit
↑みたいなフォーマットで書きます。
"eth*"は、どのインタフェースのトラフィックを制限するかを書く。
100Mbitはそのインタフェース帯域の規格。
最近は100Mbitが主流ですな。ギガビットイーサカードを装着している方は1000Mbitと書きましょう。
一番右の10Mbitは↑の設定の10分の1の数字を書いときます。ここはあんま気にしないで良い(らしい)。

RATE

RATE=500Kbit
↑みたいなフォーマットです。
設定したいスピードを書きます。
昔の56kモデム並の速度にしたい場合は"RATE=56kbit"と書く。
1kbitとかにするとえらいことになるので素人にはオススメできない。

WEIGHT

WEIGHT=50Kbit
↑フォーマット
ここもRATEで設定した値の10分の1の数字を書く。

PRIO

PRIO=5
↑略
帯域が詰まった時に数字の小さい物から処理されます。
詳しいことは使ったことなくてよく分からないので他のサイト見て下さい。

RULE

RULE=[[src_address][:port],][dest_address][:port]
超問題のRULEです。ここで重要なのは
「どちらからどちらへパケットが流れているのか」です。
以下の例でファイルのダウンロードを制限する場合を見ましょう。
クライアントマシン --http要求--> サーバ
クライアントマシン <--ファイル(コンテンツ)-- サーバ
通常httpならこの形です。
"アウトバウンドのトラフィックのみしか制限できない"ことを考えると、
CBQはサーバ側に設定しなければなりません。
分かりやすくなることを願って流れを文章にしてみます。

http要求の段階では
  • ソースアドレス~~クライアントIP(クライアントマシンのIPアドレス)
  • ソースポート~~クライアントポート(1024~65535の間でランダム)
  • デスティネーションアドレス~~サーバIP(サーバのIPアドレス)
  • デスティネーションポート~~80(http)
となってるはずです。

重要なのはコンテンツが返ってきている時で、この時の通信は
  • ソースアドレス~~サーバIP(サーバのIPアドレス)
  • ソースポート~~80(http)
  • デスティネーションアドレス~~クライアントIP(クライアントマシンのIPアドレス)
  • デスティネーションポート~~クライアントポート(さっきのソースポートと同一)
になります。
ここまでが分からない人がこれを読んでいるとは思えませんが、万一分からなかったら少しだけTCP/IPを勉強してきてください。

つまり要求段階でクライアントは
「俺はこのポートで待ってるからここに返してくれ!」
とhttpサーバの80に対して要求し、httpサーバはそのポートに対してコンテンツを返します。
その時のサーバ側のポート80がソースポートなのです。
よってコンテンツを渡している時の流れは以下の形
クライアント50000ポート(仮) <--コンテンツ-- サーバ80ポート
コンテンツのトラフィックの向きはサーバ→クライアントです(当たり前)
したがってRULE設定は
RULE=[[src_address][:port],][dest_address][:port]
の形に当てはめると以下の様になります。
RULE=サーバIP:80,クライアントIP:1024~65536
Anyの場合は省略できます(ハイポートは特定できないからAnyにしよう)。
RULE=サーバIP:80,クライアントIP
クライアントIPは限定しないのでAnyにします(末尾にカンマが残るのに注意!!!)
もちろん特定クライアントのみ制限する場合はAnyにしちゃだめです。
RULE=サーバIP:80,
サーバのIPって実はAnyに置き換えても変わらないです。
どうせ決まってるわけだし、自分についてないIPからパケットが出て行くのは有り得ないので。

というわけで
"httpサーバが不特定多数のクライアントからのダウンロード帯域を制限したい場合のRULE"
は以下のようになりました。
大分軽くなりましたね。
RULE=:80,
ちなみに以前自分が抱えていた案件で
「携帯向け配信のトラフィックを制限したい」
という物がありました。
この場合は以下の様なルールになります(順番に省略していきます)。
動きはこうなので
自分サーバ:自分ポート(ランダム) --メール--> 携帯屋のメールサーバ:25
こうなります。
RULE=自分サーバIP:(1024~65535),携帯屋サーバIP:25
↓
RULE=自分サーバIP,携帯屋サーバIP:25
↓
RULE=携帯屋サーバIP:25
前半全部略すとカンマが消えることに注意して下さい。

設定例

ポートモードFTPの制限ルール

クライアント:ランダム --FTP要求--> サーバ:21
クライアント:ランダム <--FTPデータ-- サーバ:20
RULE=サーバIP:20,クライアントIP:ランダム
RULE=:20,

パッシブモードFTP制限のルール

基本的には制限できませんが、サーバ側でポートを絞れば設定できます。
クライアント:ランダム --FTP要求--> サーバ:21
クライアント:ランダム <--FTPデータ-- サーバ:ランダム
RULE=サーバーIP:ランダム,クライアントIP:ランダム
RULE=サーバーIP:絞ったポート,クライアントIP:ランダム
RULE=:絞ったポート,
これ、サーバー側のポートをAnyとして処理しちゃうとあらゆる通信が制限されてしまうのでご注意下さい。

いろいろ試して検証しながらやったから多分合ってます。
ということでトラフィックの方向に注意してください。

設定ファイル完成

長くなりましたが設定ファイルは以下の様になります。
DEVICE=eth0,100Mbit,10Mbit
RATE=100kbit
WEIGHT=10kbit
PRIO=5
RULE=:80,
これを
/etc/sysconfig/cbqの下に
cbq-xxxx(4桁数字).xxxxx(何でもいい)
という名前で保存する。
例えばこんな名前で cbq-0080.hoge

設定ファイルを読み込む

RedHatの場合は3.0系だけ実行します。
以下のコマンドを実行します。
# /sbin/cbq compile
実はこの/sbin/cbqってのがcbq.initスクリプトみたいなものです。

cbqのスタート

以下のコマンドを実行するとスタートします。
# /sbin/cbq start

cbq.initのスタート

cbq.initの場合はこちら。
パーミッション設定などを忘れずに。
# /etc/init.d/cbq.init start
以上

  • 最終更新:2016-01-19 12:01:55

このWIKIを編集するにはパスワード入力が必要です

認証パスワード