>시스템 튜토리얼 >리눅스 >TC를 사용하여 Linux에서 네트워크 전류 제한을 우아하게 구현하는 방법

TC를 사용하여 Linux에서 네트워크 전류 제한을 우아하게 구현하는 방법

WBOY
WBOY앞으로
2024-02-11 11:21:451018검색

1. Linux에서의 흐름 제어 원리

패킷을 대기열에 추가하여 데이터 패킷이 전송되는 방식을 제어할 수 있습니다. 데이터 형성이라고 하는 이러한 종류의 제어에는 데이터에 대한 다음 작업이 포함됩니다.

  • 지연 추가
  • 패킷 손실
  • 재정렬
  • 중복, 손상
  • 속도 제어

qdisc-class-filter 구조에서 흐름을 제어하려면 세 단계가 필요합니다.

  • qdisc 대기열 만들기

위에서 언급했듯이 Linux는 패킷 큐잉을 통해 트래픽을 제어하므로 먼저 큐가 있어야 합니다.

  • 수업 분류 만들기

클래스는 사실 교통정책의 분류입니다. 예를 들어 트래픽 속도 제한은 10MBps와 20MBbs의 두 가지 수준으로 나뉩니다.

  • 필터 필터 만들기

클래스 분류가 생성되더라도 해당 클래스에 IP나 Port가 바인딩되어 있지 않으며 현재로서는 제어 효과도 없습니다. 또한 흐름 제어 클래스가 리소스에 적용될 수 있도록 지정된 IP 및 포트를 클래스에 바인딩하는 필터를 만들어야 합니다.

TC는 Linux에서 제공되는 트래픽 제어 도구이며 Cilium/eBPF와 같은 네트워크 구성 요소의 핵심 인프라 중 하나입니다.

2. 지정된 IP 및 포트의 액세스 속도를 이 머신으로 제한합니다

2.1 네트워크 카드 보기

으아악

2.2 구성 qdisc-class-filter

  • qdisc 루트 대기열 만들기
아아아아
  • 모든 대역폭 리소스를 바인딩하는 첫 번째 수준 클래스를 만듭니다

여기서 단위는 6 MBps,也就是 48 Mbps입니다.

으아악
  • 하위 카테고리 수업 만들기

여러 하위 카테고리를 생성하여 리소스 트래픽을 세련된 방식으로 관리할 수 있습니다.

으아악

여기서 ceil은 상한을 설정합니다. 일반적인 상황에서는 속도 제한이 6MBps이지만 네트워크가 유휴 상태일 때는 10MBps에 도달할 수 있습니다.

  • 필터 필터 만들기, IP 제한
아아아아

여기에 1.2.3.4 进行限制带宽为 1:10,也就是 6MBps。当然,你也可以直接给网段 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제