Linuxトラフィックシェーピング

catの下で、Linuxでトラフィックをシェーピングする方法と、このために知っておくべきことを説明します。

iproute2パッケージのtcユーティリティを使用してトラフィックシェーピングを行います。

Linuxでトラフィック制御の完全性を実現することが不可能な知識:

インターフェイスからのトラフィックのみをシェーピングできます。 (natに問題があることに関連して、後でそれについて話します)。 「インターネット」と加入者の間にルーターがあると仮定します。 ルーターには2つのネットワークカードがスタックしています。eth0はサブスクライバーを参照し、eth1はワールドを参照します。 「ダウンロード速度」を制限するためのシェーピングルールはeth0で説明され、「戻り」を制限する-eth1で説明されています。

レートと上限の違いを理解する必要があります。 レート-保証された帯域幅、Ceil-このクラスが受信できる最大帯域、レートはceilを超えることはできません

ルートクラスのレートパラメータとceilパラメータは一致する必要があります。 したがって、総帯域幅を決定します。

Rate'ovの下位クラスの合計は、親クラスのRateを超えてはなりません。 もちろん、このポイントを満たすことはできませんが、「帯域幅の保証」の提供に問題がある可能性があります。

クラス識別子は16進数で指定され、2〜2 ^ 16の間である必要があります

中間クラスの場合、ディシプリンとフィルターを作成する必要はありません。

インターフェイス内のクラス識別子は一意である必要があります。



プレゼンテーションの単純なバージョンでは、トラフィックスライシングアルゴリズムは次のようになります。

1.インターフェイスのルートディシプリンを作成し、未分類のトラフィックが送信されるクラスを示します。

2.ルートクラスを作成し、チャネルの幅を決定します。

3.サブスクライバーをシェーピングするための子クラスを作成します。

4.サブスクライバクラスのシェーピングの規律を作成します。

5.フィルタを作成して、加入者トラフィックを分類します。



原則として、すべてがシンプルですが、実際の生活では、目的の結果を達成するために多くの神経を費やす必要があります。

多くの神経を使わずに結果を達成する1つの方法は、htbinitスクリプトを使用することです( sourceforge.net/projects/htbinitから取得できます)。 構成構文は簡単です;クラスの作成も簡単です。

中規模の構成を構築するには、複雑さで十分です。

例。

中規模のローカルエリアネットワークがあります。 価格表に従って加入者の速度を制限する必要があります。アドレス変換(NAT)は別のサーバーで行われます。



htbinitの入手

debian:~# wget downloads.sourceforge.net/project/htbinit/HTB.init/0.8.5/htb.init-v0.8.5?use_mirror=surfnet

debian:~# mv htb.init-v0.8.5 /usr/local/sbin/

debian:~# cd /usr/local/sbin/

debian:/usr/local/sbin# mv htb.init-v0.8.5 htb.init

debian:/usr/local/sbin# chmod +x htb.init






デフォルトでは、htbinitは/ etc / sysconfig / htbフォルダーに構成を保存します。

debian:~# mkdir -p /etc/sysconfig/htb





eth0インターフェース用の馬の規律を作成します(インターフェースは「加入者で」ローカルネットワークを参照します)

debian:~# touch /etc/sysconfig/htb/eth0







いずれのフィルターにも該当しないクラストラフィックが該当することを示します

debian:~# mcedit /etc/sysconfig/htb/eth0

DEFAULT=42






ルートクラスを作成する

debian:~# touch /etc/sysconfig/htb/eth0-2.root

debian:~# mcedit /etc/sysconfig/htb/eth0-2.root

RATE=100Mbit






CEILを指定できない場合、自動的にRATEと等しくなります。



未分類のトラフィックのクラスを作成します

debian:~# touch /etc/sysconfig/htb/eth0-2:42.root

debian:~# mcedit /etc/sysconfig/htb/eth0-2:42.root

RATE=4Kbit








共通のクライアントクラスを作成します。 彼のIDを「D」に等しくし、すべてのサブスクライバーに10 Mビットを割り当てます。

debian:~# touch /etc/sysconfig/htb/eth0-2:D.sumamry_cilents_class

debian:~# mcedit /etc/sysconfig/htb/eth0-2:D.sumamry_cilents_class

RATE=10Mbit








これで、サブスクライバーを実行できます。

ダウンロード速度を512 Kbに制限するには、Vasilyが以下を行う必要があります。

サブスクライバーVasilyのクラスを作成します。 クライアントIDが255で始まるようにします。何らかの「システム」クラスを作成する必要がある場合に非常に便利です。

debian:~# touch /etc/sysconfig/htb/eth0-2:D:100.client_login





インターフェース、クラス識別子、および親クラスは、構成の名前で説明されています。

エントリeth0-2:D:100.client_loginは、

eth0-このクラスはeth0インターフェイスに属します

2ルートクラス

D親クラス(この例では、共通クライアントクラス)

100 Clentクラス識別子

client_loginファイル名ニーモニックコンポーネントは、セマンティックロードを運び、クラス生成では使用されません



ファイル名は次の方法で生成されます。

1.クラスが属するインターフェース。

2.セパレーター「-」(マイナス)

3.ルートクラスID

4.セパレーター ":"(コロン)

5.親クラスID

6.セパレーター ":"(コロン)

7.クライアントクラスID

8.セパレーター「。」(期間)

9.ファイル名のニーモニックコンポーネント

シェーピング戦略に応じて、パラグラフ5および6は存在しない場合があります。



debian:~# mcedit /etc/sysconfig/htb/eth0-2:D:100.client_login

RATE=512Kbit

LEAF=sfq

RULE=0.0.0.0/0,client_ip/32







少なくとも、構成には3行が必要です。

RATE-加入者に提供される帯域。

LEAF-クラスが有限であり、そのための規律を作成する必要があるという事実へのポインタ、この場合はsfq(「疑似正直」帯域分布)

ルール-クラスに分類されるものを決定し、IPアドレス、サブネット、IPアドレス、ポートでフィルタリングできます。 RULEエントリの数は複数にすることができます。



同じルーターでトラフィックとスレッドをシェーピングする必要がある場合は、RULEの代わりにMARKを使用する必要があります。 唯一のことは、パッケージにラベルを付けることです。

NATを使用した構成でhtbinitの構成を生成するためのサンプルスクリプト。

#!/bin/bash





#変数を定義する

declare -a rules

inif="eth0"

outif="eth1"

vlan="10"

workdir="/home/netup"

vardir="${workdir}/var"

htb_dir="/etc/sysconfig/htb"






mysql="/usr/bin/mysql -h host -u user -ppassword -D base"

ipt="/usr/local/sbin/iptables"

IPT_UNLIM="UNLIM_"${vlan}

utm_rules="${vardir}/htb_rules_htb"

htb_rules="${vardir}/htb_rules_utm"






#最初の起動時に設定を準備します

[ -e ${htb_rules} ] || touch ${htb_rules}





#設定の完全な再生成

if [ "${1}" = "zopa" ];then

echo ""> ${htb_rules};

fi






#データを取得(16進数のID)

echo "select id,ip,mask,speed from view_shaper order by id;"|$mysql|sed '1d' > ${utm_rules};





#データベースに到達し、現在の設定との違いがある場合

exp="${utm_rules} ${htb_rules}"

[ -s ${utm_rules} ] && if [ -n "`diff ${exp}`" ]

then






#不要になった設定を削除

for i in `diff ${exp}|awk '{if (NF==5)print $2}'|sort -n|uniq`

do

inshaper=${htb_dir}/${inif}-2:${i}.rule_${i};

[ -e ${inshaper} ] && rm ${inshaper};

outshaper=${htb_dir}/${outif}-2:${i}.rule_${i};

[ -e ${outshaper} ] && rm ${outshaper};

done;






#新しい設定を作成

rules=(`diff ${exp}|grep "<"|awk '{if (NF==5)print $2,$3,$4,$5}'`)

for i in `seq 1 4 ${#rules[@]}`;

do

id=${rules[$i-1]};

ip=${rules[$i]};

mask=${rules[$i+1]};

rate=${rules[$i+2]};







#設定名を作成します

inshaper=${htb_dir}"/"${inif}-2:${id}.rule_${id};

outshaper=${htb_dir}/${outif}-2:${id}.rule_${id};






#パッケージのブランドを計算します

inmark="0x"`echo "obase=16; $((0x${id}*2))"|bc`

outmark="0x"`echo "obase=16; $((0x${id}*2+1))"|bc`






#「古い」ラベル付けルールを削除する

${ipt} -t mangle -S ${IPT_UNLIM}|grep -w ${ip}|awk -v ipt=${ipt} '{$1="-D";system(ipt" -t mangle "$0)}';





#内部インターフェイスで設定とルールを作成します

if [ -e ${inshaper} ]; then

#echo "RULE="0.0.0.0/0,"${ip}"/"${mask}">> ${inshaper}

${ipt} -t mangle -A ${IPT_UNLIM} -s ${ip} -j MARK --set-mark ${inmark}

else

echo "RATE=4096bit" > ${inshaper}

echo "CEIL="$((${rate}*1024))"bit" >>${inshaper}

echo "LEAF=sfq" >> ${inshaper}

#echo "RULE=0.0.0.0/0,"${ip}"/"${mask}>> ${inshaper};

echo "MARK="${inmark}>> ${inshaper};

${ipt} -t mangle -A ${IPT_UNLIM} -d ${ip}/${mask} -j MARK --set-mark ${inmark}

fi






#内部インターフェイスで設定とルールを作成します

if [ -e $outshaper ]; then

#echo "RULE="${ip}"/"${mask}",0.0.0.0/0" >> ${outshaper}

${ipt} -t mangle -A ${IPT_UNLIM} -s ${ip}/${mask} -j MARK --set-mark ${outmark}

else

echo "RATE=4096bit" > ${outshaper}

echo "CEIL="$((${rate}*1024))"bit" >> ${outshaper}

echo "LEAF=sfq" >> ${outshaper}

#echo "RULE="${ip}"/"${mask}",0.0.0.0/0" >> ${outshaper}

echo "MARK="${outmark}>> $outshaper;

${ipt} -t mangle -A ${IPT_UNLIM} -s ${ip}/${mask} -j MARK --set-mark ${outmark}

fi

echo $ip

done;

cp ${exp}

[ -e /var/cache/htb.init ] && rm /var/cache/htb.init

/usr/local/sbin/htb.init restart

fi








1000〜1500フィルターまでの構成には、このオプションが適しています。 大きなものについては、すでに高速ハッシュフィルターを使用する必要があります。トラフィックの優先順位付けについては、次の記事で説明します。



All Articles