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