0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Linux下使用TC優(yōu)雅的實現(xiàn)網(wǎng)絡(luò)限流

dyquk4xk2p3d ? 來源:陳少文的博客 ? 2023-05-06 09:24 ? 次閱讀

1. Linux 下的流量控制原理

通過對包的排隊,我們可以控制數(shù)據(jù)包的發(fā)送方式。這種控制,稱之為數(shù)據(jù)整形,shape the data,包括對數(shù)據(jù)的以下操作:

增加延時

丟包

重新排列

重復(fù)、損壞

速率控制

在 qdisc-class-filter 結(jié)構(gòu)下,對流量進行控制需要進行三個步驟:

創(chuàng)建 qdisc 隊列

上面提到 Linux 是通過包的排隊進行流量的控制,那么首先得有一個隊列。

創(chuàng)建 class 分類

class 實際上,就是劃分流量策略分類。比如劃分兩檔流量限速 10MBps、20MBbs。

創(chuàng)建 filter 過濾

雖然創(chuàng)建了 class 分類,但是并沒有將任何的 IP、Port 綁定到 class 上,此時并不會有控制作用。還需要創(chuàng)建 filter 將指定的 IP、Port 綁定到 class 上,才能使流量控制 class 生效于資源。

TC 是 Linux 下提供的流量控制工具,也是 Cilium/eBPF 等網(wǎng)絡(luò)組件的核心基礎(chǔ)設(shè)施之一。

2. 限制指定 IP、Port 對本機的訪問速度

2.1 查看網(wǎng)卡

ifconfig

eth0:flags=4163mtu1500
inet1.1.1.1netmask255.255.254.0broadcast1.1.1.1
inet61:11prefixlen64scopeid0x20
ether111:1txqueuelen1000(Ethernet)
RXpackets2980910bytes2662352343(2.4GiB)
RXerrors0dropped0overruns0frame0
TXpackets1475969bytes122254809(116.5MiB)
TXerrors0dropped0overruns0carrier0collisions0

2.2 配置 qdisc-class-filter

創(chuàng)建 qdisc 根隊列

tcqdiscadddeveth0roothandle1:htbdefault1

創(chuàng)建第一級 class 綁定所有帶寬資源

注意這里的單位是 6 MBps,也就是 48 Mbps。

tcclassadddeveth0parent1:0classid1:1htbrate6MBpsburst15k

創(chuàng)建子分類 class

可以創(chuàng)建多個子分類,對資源的流量進行精細化管理。

tcclassadddeveth0parent1:1classid1:10htbrate6MBpsceil10MBpsburst15k

這里 ceil 設(shè)置的是上限,正常情況下限速為 6MBps,但網(wǎng)絡(luò)空閑時,可以達到 10 MBps。

創(chuàng)建過濾器 filter,限制 IP

tcfilteradddeveth0protocolipparent1:0prio1u32matchipdst1.2.3.3flowid1:10

這里對 1.2.3.4 進行限制帶寬為 1:10,也就是 6MBps。當(dāng)然,你也可以直接給網(wǎng)段 1.2.0.0/16 加 class 策略。

2.3 查看并清理配置

查看 class 配置

tcclassshowdeveth0

classhtb1:10parent1:1leaf10:prio0rate48Mbitceil80Mbitburst15Kbcburst1600b
classhtb1:1rootrate48Mbitceil48Mbitburst15Kbcburst1590b

查看 filter 配置

tcfiltershowdeveth0

filterparent1:protocolippref1u32chain0
filterparent1:protocolippref1u32chain0fh800:htdivisor1
filterparent1:protocolippref1u32chain0fh800::800order2048keyht800bkt0flowid1:10not_in_hw
match01020303/ffffffffat16

清理全部配置

tcqdiscdeldeveth0root

3. 限制本機對指定 IP、Port 的訪問速度

由于排隊規(guī)則主要是基于出口方向,不能對入口方向的流量(Ingress)進行限制。因此,我們需要將流量重定向到 ifb 設(shè)備上,再對 ifb 的出口流量(Egress)進行限制,以最終達到控制的目的。

3.1 啟用虛擬網(wǎng)卡

將在 ifb 設(shè)備

modprobeifbnumifbs=1

啟用 ifb0 虛擬設(shè)備

iplinksetdevifb0up

3.2 配置 qdisc-class-filter

添加 qdisc

tcqdiscadddeveth0handleffff:ingress

重定向網(wǎng)卡流量到 ifb0

tcfilteradddeveth0parentffff:protocolipu32matchu3200actionmirredegressredirectdevifb0

添加 class 和 filter

tcqdiscadddevifb0roothandle1:htbdefault10
tcclassadddevifb0parent1:0classid1:1htbrate6Mbps
tcclassadddevifb0parent1:1classid1:10htbrate6Mbps
tcfilteradddevifb0parent1:0protocolipprio16u32matchipdst1.2.3.4flowid1:10

3.3 查看并清理配置

下面是限速本機對指定 IP 訪問的監(jiān)控圖

90ad9b5c-eb7b-11ed-90ce-dac502259ad0.png

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

查看 class 配置

tcclassshowdevifb0

classhtb1:10parent1:1prio0rate48Mbitceil48Mbitburst1590bcburst1590b
classhtb1:1rootrate48Mbitceil48Mbitburst1590bcburst1590b

查看 filter 配置

tcfiltershowdevifb0

filterparent1:protocolippref16u32chain0
filterparent1:protocolippref16u32chain0fh800:htdivisor1
filterparent1:protocolippref16u32chain0fh800::800order2048keyht800bkt0flowid1:10not_in_hw
match01020304/ffffffffat16

清理全部配置

tcqdiscdeldeveth0ingress
tcqdiscdeldevifb0root
modprobe-rifb

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11199

    瀏覽量

    208688
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    248

    瀏覽量

    24342
  • 流量控制
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    9639

原文標(biāo)題:如何在 Linux 下使用 TC 優(yōu)雅的實現(xiàn)網(wǎng)絡(luò)限流

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux場景數(shù)據(jù)包是如何在協(xié)議層傳輸?shù)?/a>

    所有互聯(lián)網(wǎng)服務(wù),均依賴于TCP/IP協(xié)議棧。懂得數(shù)據(jù)是如何在協(xié)議棧傳輸?shù)?,將會幫助你提升互?lián)網(wǎng)程序的性能和解決TCP相關(guān)問題的能力。 我們講述在Linux場景數(shù)據(jù)包是如何在協(xié)議層傳輸
    的頭像 發(fā)表于 11-11 11:33 ?1054次閱讀
    <b class='flag-5'>Linux</b>場景<b class='flag-5'>下</b>數(shù)據(jù)包是如<b class='flag-5'>何在</b>協(xié)議層傳輸?shù)? />    </a>
</div>                            <div   id=

    何在linux上的“ifconfig -a”枚舉wifi接口網(wǎng)絡(luò),就像wlan0一樣?

    何在 linux 上的“ifconfig -a”枚舉 wifi 接口網(wǎng)絡(luò),就像 wlan0 一樣
    發(fā)表于 07-19 06:54

    何在Linux安裝字體

    問題場景在用itext開發(fā)完P(guān)DF之后,有要求Apache要部署到Linux,也可能部署到windows,由于筆者在Windows開發(fā)的,字體沒問題;但是
    發(fā)表于 07-04 08:14

    何在VxWorks實現(xiàn)NAT/NAPT的方法

    何在VxWorks實現(xiàn)NAT/NAPT的方法
    發(fā)表于 03-29 12:25 ?19次下載

    Linux網(wǎng)絡(luò)HOOK實現(xiàn)

    最近瘋狂的研究Linux的種種功能,也頗有心得,這里講述一Linux的Net的Hook,使用net的Hook可以實現(xiàn)很多很多非常底層的功
    發(fā)表于 05-14 10:27 ?5113次閱讀

    Linux基于Socket的網(wǎng)絡(luò)編程

    linux開發(fā)編程教程資料——Linux基于Socket的網(wǎng)絡(luò)編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    Linux網(wǎng)絡(luò)編程總結(jié)

    linux開發(fā)編程教程資料——Linux網(wǎng)絡(luò)編程總結(jié),感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    LinuxSocket網(wǎng)絡(luò)編程

    linux開發(fā)編程教程資料——LinuxSocket網(wǎng)絡(luò)編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    何在Linux如何刪除大量文件的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是如何在Linux刪除大量文件的過程詳細資料概述免費下載。
    發(fā)表于 11-14 17:10 ?7次下載

    LINUX系統(tǒng)教程之如何在Linux系統(tǒng)進行編程

    本文檔的主要內(nèi)容詳細介紹的是LINUX系統(tǒng)教程之如何在Linux系統(tǒng)進行編程主要內(nèi)容包括了:程序開發(fā)過程 ,Linux編程環(huán)境和開發(fā)工具
    發(fā)表于 12-18 19:09 ?9次下載

    何在Linux環(huán)境搭建51單片機的開發(fā)燒寫環(huán)境

    本文檔的主要內(nèi)容詳細介紹的是如何在Linux環(huán)境搭建51單片機的開發(fā)燒寫環(huán)境。
    發(fā)表于 08-15 17:32 ?2次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>Linux</b>環(huán)境<b class='flag-5'>下</b>搭建51單片機的開發(fā)燒寫環(huán)境

    何在Linux環(huán)境實現(xiàn)Python環(huán)境的搭建

    本文檔的主要內(nèi)容詳細介紹的是如何在Linux環(huán)境實現(xiàn)Python環(huán)境的搭建。
    發(fā)表于 08-24 12:12 ?14次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>Linux</b>環(huán)境<b class='flag-5'>下</b><b class='flag-5'>實現(xiàn)</b>Python環(huán)境的搭建

    何在Linux系統(tǒng)開啟wifi

    大家好,我是ST。今天主要和大家聊一聊如何在Linux系統(tǒng)開啟wifi。
    的頭像 發(fā)表于 10-08 09:21 ?4446次閱讀

    何在Linux使用TC優(yōu)雅實現(xiàn)網(wǎng)絡(luò)限流

    TCLinux 提供的流量控制工具,也是 Cilium/eBPF 等網(wǎng)絡(luò)組件的核心基礎(chǔ)設(shè)施之一。
    發(fā)表于 12-26 10:06 ?717次閱讀

    何在DRA821U上使用Linux實現(xiàn)快速引導(dǎo)

    電子發(fā)燒友網(wǎng)站提供《如何在DRA821U上使用Linux實現(xiàn)快速引導(dǎo).pdf》資料免費下載
    發(fā)表于 09-03 10:11 ?0次下載
    如<b class='flag-5'>何在</b>DRA821U上使用<b class='flag-5'>Linux</b><b class='flag-5'>實現(xiàn)</b>快速引導(dǎo)