LinuxでのLinuxコントロヌルに関する初心者

しばらく前に、リモヌトブランチで簡単なトラフィックバランシングを蚭定するように求められたした。 圌らは貧しい仲間であり、ADSLを介しお働いおおり、倧量の電子メヌルドキュメントスキャンを送信するずリバヌスチャネル党䜓が詰たり、VPNを介したオフィスオンラむンプログラムでの䜜業に問題が生じたす。
LinuxFedoraをゲヌトりェむずしお䜿甚したす。 これに先立ち、FreeBSDでipfwを䜿甚しおこのバランスがどのように蚭定されるかを䜕床か芋たした。たた、iptablesメカニズムをよく知っおいるので、特別な問題は予想しおいたせんでした。 しかし、むンタヌネットを怜玢するず、iptablesが私のアシスタントではないこずに䞍愉快な驚きを芚えたした。 たた、テヌブルずルヌルを通過するパケットの順序に関する知識は、私にずっおはほずんど圹に立ちたせん。 iproute2パッケヌゞからtcを孊ぶ必芁がありたす。

思いがけず、私はiproute2を䜿甚したトラフィックバランシングを倚少なりずも理解するために2日間を費やしたした。 最初は、HTBに関する蚘事 ここではありたせんは、初心者には最適ではありたせんでした。 たた、特定のオプションの説明やアプリケヌションの意味が含たれおいないこずが倚いため、むンタヌネットからのさたざたな䟋も愚かでした。 したがっお、私は1぀の蚘事で受け取った知識を収集しようずしたした。最も重芁なのは、初心者がアクセスできるレベルですべおを蚘述するこずです。

すぐに予玄したす。ネットワヌクむンタヌフェヌスからのトラフィックのみをカットしたす。 着信も調敎できたすが、これには远加のトリックが必芁です。

クラスレスの芏埋


そのため、Linuxでは、トラフィックを制埡するために各ネットワヌクむンタヌフェむスにディシプリンqdiscが割り圓おられたす。 トラフィック管理システム党䜓が構築されるのは、孊問分野からです。 しかし、恐れる必芁はありたせん。実際、芏埋はネットワヌクパケットのキュヌを凊理するための単なるアルゎリズムです。
1぀のむンタヌフェヌスに耇数のディシプリンが関係する堎合があり、いわゆるルヌトディシプリンルヌトqdiscがむンタヌフェヌスに盎接接続されたす。 さらに、各むンタヌフェむスには独自のルヌト芏則がありたす。

prio_fast

デフォルトでは、システムの起動埌、ルヌトqdiscはpfifo_fastタむプのパケットを凊理するアルゎリズムを蚭定したす。

画像

私たちはチェックしたす

tc qdisc

qdisc pfifo_fast 0dev eth0ルヌトバンド3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1

pfifo_fastは通垞の「最初の入力-最初の出力」アルゎリズムですが、トラフィックに優先順䜍が付けられおいたす。 このタむプのディシプリンには、異なるパケット凊理優先順䜍を持぀3぀のFIFOキュヌが含たれたす。 パケットは、各IPパケットのToSType of Serviceフラグに基づいおそれらに配眮されたす。 FIFO0に分類されるパケットは凊理の優先床が最も高く、FIFO2では最小になりたす。 ToS自䜓には別の議論が必芁なので、送信されたIPパケットに割り圓おるToSをオペレヌティングシステム自䜓が知っおいるずいう事実に限定するこずを提案したす。 たずえば、telnetずpingパケットでは、ToSの倀は異なりたす。

0 -ルヌトディシプリンぞのハンドル。
蚘述子は、 major_numberminor_numberの圢匏である必芁がありたすが、分野では、最小数は垞に0である必芁があるため、省略できたす。

priomapパラメヌタヌ1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1は、ToSフィヌルドず各内郚キュヌバンドのビット察応を蚭定するだけです。 たずえば、ToS = 4の堎合、パケットはキュヌ1で凊理され、ToS = 7はキュヌ0で凊理されたす。

倚くの情報源は、pfifo_fast分野のパラメヌタヌを倉曎できないこずを瀺しおいたす。

TBF

次に、䞀般的な発信トラフィックの速床を制限する方法を怜蚎したす。 これを行うには、 TBFタむプのディシプリントヌクンバケットフィルタヌをむンタヌフェむスのルヌトディシプリンずしお割り圓おたす。

tc qdisc add dev eth0 root tbf rate 180kbit latency 20ms buffer 1540

rate 180kbit-むンタヌフェヌスの䌝送速床のしきい倀を蚭定したす。

レむテンシヌ20ミリ秒 -デヌタパケットがトヌクンの埅機に費やした最倧時間を蚭定したす。

バッファ1540-トヌクンバッファのサむズをバむト単䜍で蚭定したす。 䟋では、10Mbit / sの制限に察しお10Kバむトのバッファヌで十分であるず曞いおいたす。 䞻なこずは、サむズを小さくしすぎないこずです。もっず倚くのこずが可胜です。 抂算匏rate_in_Bytes / 100。

画像

TBFの芏埋は、その䜜業にトヌクンメカニズムを䜿甚したす。 トヌクンは䞀定の速床でシステムによっお生成され、バッファヌバケットに配眮されたす。 むンタヌフェむスからバッファを離れるトヌクンごずに、IPパケットが送信されたす。
パケット転送速床ずトヌクンの生成が䞀臎する堎合、デヌタ転送プロセスは遅滞なく進行したす。
パケット転送レヌトがトヌクンレヌトよりも䜎い堎合、埌者はバッファに蓄積し始め、しきい倀よりも高速で短期のデヌタ送信に䜿甚できたす。
パケット転送速床が高い堎合、トヌクンが倱われ始めたす。 デヌタパケットは新しいトヌクンをしばらく埅っおから、砎棄され始めたす。

説明されおいる2぀の分野は、いわゆるクラスレス分野に属したす。 これらには機胜䞊の制限がいく぀かありたす。それらはむンタヌフェヌスたたぱッゞクラスにのみ接続され、さらにパケットフィルタヌを䜿甚できたせん。 したがっお、メヌルトラフィックずその支揎のバランスを取るずいう私のタスクは䞍可胜です。
ちなみに、クラスレスの芏埋の完党なセットはやや広くなりたすpfifo、bfifo、sqf異なるストリヌムから受信したパケットず同じ速床を提䟛したす、esqfなど

クラスの分野


分野を氎道管のセグメントずしお衚すこずができる堎合、クラスはコネクタ継手です。 シンプルなフィッティングアダプタヌでも、数十タップのトリッキヌなフィッティングスプリッタヌでもかたいたせん。

クラスの芪は、ディシプリンたたは別のクラスのいずれかです。
子クラスはクラスに参加できたす耇数の継手をドッキング。

子クラスを持たないクラスは、 リヌフクラスず呌ばれたす。 ここで、「絊氎システム」を通過したデヌタパケットは、亀通管制システムを出お、ネットワヌクむンタヌフェむスによっお送信されたす。 デフォルトでは、゚ッゞクラスにはfifoタむプのディシプリンがアタッチされおおり、このクラスのパケットが送信される順序を決定するのはそれです。 しかし、党䜓の魅力は、この芏埋を他の人ず亀換できるこずです。
子クラスを远加するず、この芏埋は削陀されたす。

プリオ

メヌルトラフィックのバランスをずるタスクに戻っお、クラス芏埋prioを考えおみたしょう。
これは、すでに説明したpfifo_fastず非垞によく䌌おいたす。 ただし、このディシプリンは特別です。割り圓おられるず、3぀のクラスが自動的に䜜成されたすその数は、bandsパラメヌタヌで倉曎できたす。

むンタヌフェむスのルヌトディシプリンをprioに眮き換えたす。

tc qdisc add dev eth0 root handle 1prio

ハンドル1 -このルヌトqdiscにハンドルを蚭定したす。 クラス分野では、クラスが接続されたずきに衚瀺されたす。

芏埋を確認しおください

tc qdisc

qdisc prio 1dev eth0バンド3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 1

クラスを確認したす。

tc -d -sクラスshow dev eth0

クラスprio 11芪1
734914バむト7875パケットを送信0をドロップ、0を超過するず0をリキュヌ
バックログ0b 0pリキュヌ0
クラスprio 12芪1
送信枈み1555058583バむト8280199パケット124919がドロップされ、26443のリキュヌが0を超過
バックログ0b 0pリキュヌ0
クラスprio 13芪1
送信枈み57934378バむト802213パケットドロップされた70976、284608の再キュヌ制限0
バックログ0b 0pリキュヌ0

IDが1、1、1、2、13の3぀のクラスがあり、prioタむプの芪ディシプリン1に接続されおいたすクラスには芪ず共通のメゞャヌ識別子番号が必芁です。
぀たり、pfifo_fastず同じ方法でデヌタストリヌムを共有する「パむプ」ルヌトqdiscに、Tをむンストヌルしたした。 ToSにより、優先床の高いトラフィックはクラス11に到達し、通垞のトラフィックはクラス12に到達し、「ゎミ」はクラス13に到達したす。

リバヌスチャネルADSLが90KB / sの速床を生成するずしたす。 メヌルの堎合は20 KB / s、その他の堎合は70 KB / cに分けたす。

クラス11からのトラフィックは特に制限されたせん。 ToSの優先床が高いため、パケットは垞に少なくずもチャネル幅党䜓を占有できたすが、このクラスのトラフィック量は他の2぀のクラスず比范しお無芖できたす。 したがっお、別のストリップを予玄したせん。

通垞、暙準トラフィックはクラス1に分類されたす。2。 ティヌクラスの2番目の出力に、芏埋パむプを70KB / sで接続したす。

tc qdisc add dev eth0 parent 12 handle 10tfb rate 70kbps buffer 1500 latency 50ms

ティヌの3番目の出力で、芏埋パむプを20KB / sで接続したす。

tc qdisc add dev eth0 parent 13 handle 20tfb rate 20kbps buffer 1500 latency 50ms

これらの3぀のクラスはすべお限界です。

そしお今では、以前ず同様にメヌルトラフィックをクラス12に向けるのではなく、クラス13に向けるだけです。 これは、クラスディシプリンフィルタヌを䜿甚しお行われたす。

tc filter add dev eth0 parent 1protocol ip prio 1 u32 match ip dport 25 0xffff flowid 13

芪1 -フィルタヌはディシプリンにのみアタッチでき、そこから呌び出されたす。 フィルタヌのトリガヌに基づいお、ディシプリンはパケット凊理を継続するクラスを決定したす。

protocol ip-ネットワヌクプロトコルのタむプを決定したす

prio 1-パラメヌタヌはクラスやフィルタヌで䜿甚されるため、長い間私を混乱させおきたした。さらに、これは専門分野の名前です。 ここで、prioはフィルタヌをトリガヌする優先順䜍を蚭定したす。prioが䜎い方のフィルタヌが最初にアクティブになりたす。

u32-いわゆるトラフィック分類子。これは、送信者/受信者のIPアドレス、送信元/受信者のポヌト、プロトコルタむプのいずれかの基準でパケット遞択を実行できたす。 実際、これらの条件は以䞋に瀺されおいたす。

match ip dport 25 0xffff-パケットがポヌト25に送信されたずきにトリガヌするフィルタヌを蚭定したす。0xffffはポヌト番号のビットマスクです。

flowid 13-このフィルタヌがトリガヌされたずきにどのクラスのパケットが送信されるかを瀺したす。

ラフに完了したしたが、タスクは完了したした。

パケットパッシングの統蚈を確認したす。

tc -s -d qdisq show dev eth0
tc -s -d class show dev eth0
tc -s -d filter show dev eth0

次のコマンドを䜿甚するず、すべおのクラス、フィルタヌをすばやく削陀し、むンタヌフェむスのルヌトqdiscを元の状態に戻すこずができたす。

tc qdisc del dev eth0 root

Htb

䞀方、私たちのリタヌンチャネルはすでに非垞に薄いため、電子メヌルを送信するためだけに20KB /秒を予玄するこずはできたせん。 したがっお、クラスディシプリンHTBHierarchical Token Bucketを䜿甚するこずをお勧めしたす。 芪の子クラスから垯域幅を借りるこずができたす。

画像

tc qdics add dev eth0 root handle 1htb default 20

デフォルト20-デフォルトでクラスを蚭定したす。 htb芏埋の他のクラスに分類されないパケットを凊理したす。 指定しない堎合、「デフォルト0」が割り圓おられ、すべおの未分類フィルタリングなしトラフィックがむンタヌフェむス速床で送信されたす。

tc class add dev eth0 parent 1classid 11 htb rate 90kbps ceil 90kbps

識別子1でルヌトqdiscクラスにアタッチしたす。1。 したがっお、むンタヌフェむスの速床を90KB / sに制限したす。

classid 11-クラス識別子。

レヌト90kbps-クラスの䜎垯域幅しきい倀を蚭定したす。

ceil 90kbps-クラスの䞊限垯域幅しきい倀を蚭定したす。

tc class add dev eth0 parent 11 classid 1:10 htb rate 20kbps ceil 70kbps

クラス1:10、クラス11の子を䜜成したす。 次に、送信メヌルトラフィックがフィルタヌによっお送信されたす。

レヌト20kbps-クラスの保蚌された䜎垯域幅のしきい倀を蚭定したす。

ceil 70kbps-クラスの垯域幅の䞊限しきい倀を蚭定したす。 芪クラスに空き垯域幅「䜙分な」トヌクンの存圚がある堎合、クラス1:10は、指定された制限の70KB / sたで、デヌタ転送速床を䞀時的に䞊げるこずができたす。

tc class add dev eth0 parent 11 classid 1:20 htb rate 70kbps ceil 90kbps

デフォルトクラスを䜜成したす。 他のすべおのトラフィックはそれに萜ちたす。 同様に、メヌルトラフィックが既にない堎合は、rateおよびceilパラメヌタヌを蚭定しお垯域幅を拡匵したす。

tc filter add dev eth0 parent 1protocol ip prio 1 u32 match ip dport 25 0xffff flowid 1:10

u25に基づいおフィルタリングし、ポヌト25に発信するパケットをクラス1:10に転送したす。

ずころで、ドキュメンテヌションには、実際にはHTBトラフィックシェヌピングぱッゞクラスでのみ発生するず蚘茉されおおり、この堎合は1:10および1:20です。 他のHTBクラスの垯域幅制限パラメヌタヌの指定は、クラス間で借甚システムが機胜するためにのみ必芁です。

クラスを远加するずきに、 prioパラメヌタヌを指定するこずもできたす。 クラスの優先床を蚭定したす0-最倧優先床。 優先床の高いクラスにデヌタがある限り、優先床の䜎いクラスは凊理されたせん。

゜ヌス
Linux Advanced RoutingTraffic Control HOWTO
トラフィック制埡HOWTO
Linuxずトラフィック管理の物語

Source: https://habr.com/ru/post/J133076/


All Articles