ホームページ  >  記事  >  システムチュートリアル  >  TC を使用して Linux でネットワーク電流制限をエレガントに実装する方法

TC を使用して Linux でネットワーク電流制限をエレガントに実装する方法

WBOY
WBOY転載
2024-02-11 11:21:45978ブラウズ

1. Linux でのフロー制御原理

パケットをキューに入れることで、データ パケットの送信方法を制御できます。この種の制御はデータ シェーピングと呼ばれ、データに対する次の操作を含むデータの整形を行います:

  • 遅延を増やす
  • パケットロス###### 並べ替え
  • # 重複、破損しています
  • レート制御
  • qdisc-class-filter
構造では、トラフィックを制御するには 3 つの手順が必要です。

qdisc キューを作成します

  • 上で述べたように、Linux はパケット キューイングを通じてトラフィックを制御するため、まずキューが存在する必要があります。

クラス分類の作成

  • class 実際には、トラフィック ポリシーをカテゴリに分割することです。たとえば、トラフィック速度制限は 10MBps と 20MBbs の 2 つのレベルに分かれています。

フィルタの作成 filter

  • クラス分類は作成されますが、IP やポートはクラスにバインドされていないため、現時点では制御効果はありません。また、フロー制御クラスがリソース上で有効になるように、指定した IP とポートをクラスにバインドするフィルターを作成する必要もあります。
TC は、Linux 上で提供されるトラフィック制御ツールであり、Cilium/eBPF などのネットワーク コンポーネントのコア インフラストラクチャの 1 つです。

2. 指定した IP とポートのこのマシンへのアクセス速度を制限します

2.1 ネットワークカードを確認する

リーリー 2.2 構成

qdisc-class-filter

qdisc ルートキューを作成します

  • rree
  • すべての帯域幅リソースをバインドする第 1 レベルのクラスを作成します。
    ここでの単位は
  • 6 MBps、つまり
  • 48 Mbps
であることに注意してください。

リーリー サブカテゴリクラスの作成

    複数のサブカテゴリを作成して、リソース トラフィックの詳細な管理を行うことができます。
  • リーリー ここで ceil は上限を設定します。通常の状況では、速度制限は 6MBps ですが、ネットワークがアイドル状態の場合は 10MBps に達する可能性があります。

フィルターフィルターを作成し、IP

を制限します

rree
    ここでは、
  • 1.2.3.4 の帯域幅は
  • 1:10
(6MBp​​s) に制限されています。もちろん、クラス ポリシーをネットワーク セグメント

1.2.0.0/16 に直接追加することもできます。

2.3 查看并清理配置

  • 查看 class 配置
tc class show dev eth0

class htb 1:10 parent 1:1 leaf 10: prio 0 rate 48Mbit ceil 80Mbit burst 15Kb cburst 1600b 
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 15Kb cburst 1590b
  • 查看 filter 配置
tc filter show dev eth0

filter parent 1: protocol ip pref 1 u32 chain 0 
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 1 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw 
  match 01020303/ffffffff at 16
  • 清理全部配置
tc qdisc del dev eth0 root

3. 限制本机对指定 IP、Port 的访问速度

由于排队规则主要是基于出口方向,不能对入口方向的流量(Ingress)进行限制。因此,我们需要将流量重定向到 ifb 设备上,再对 ifb 的出口流量(Egress)进行限制,以最终达到控制的目的。

3.1 启用虚拟网卡

  • 将在 ifb 设备
modprobe ifb numifbs=1
  • 启用 ifb0 虚拟设备
ip link set dev ifb0 up

3.2 配置 qdisc-class-filter

  • 添加 qdisc
tc qdisc add dev eth0 handle ffff: ingress
  • 重定向网卡流量到 ifb0
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
  • 添加 class 和 filter
tc qdisc add dev ifb0 root handle 1: htb default 10
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 6Mbps
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 6Mbps
tc filter add dev ifb0 parent 1:0 protocol ip prio 16 u32 match ip dst 1.2.3.4  flowid 1:10

3.3 查看并清理配置

  • 下面是限速本机对指定 IP 访问的监控图
如何在 Linux 下使用 TC 优雅的实现网络限流

进入的流量被限制在 6 MBps 以下,而出去的流量不被限制。

  • 查看 class 配置
tc class show dev ifb0

class htb 1:10 parent 1:1 prio 0 rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b 
class htb 1:1 root rate 48Mbit ceil 48Mbit burst 1590b cburst 1590b 
  • 查看 filter 配置
tc filter show dev ifb0

filter parent 1: protocol ip pref 16 u32 chain 0 
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800: ht divisor 1 
filter parent 1: protocol ip pref 16 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:10 not_in_hw 
  match 01020304/ffffffff at 16
  • 清理全部配置
tc qdisc del dev eth0 ingress
tc qdisc del dev ifb0 root
modprobe -r ifb

以上がTC を使用して Linux でネットワーク電流制限をエレガントに実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。