使用iptables和tc對端口限速

    首先,咱們來看一下tc,TC(Traffic Control)命令,是linux自帶的告警流控命令。Linux操做系統中的流量控制器TC(Traffic Control)用於Linux內核的流量控制,主要是經過在輸出端口處創建一個隊列來實現流量控制。通常只能限制網卡發送的數據包,不能限制網卡接收的數據包,因此能夠經過改變發送次序來控制傳輸速率。Linux流量控制主要是在輸出接口排列時進行處理和實現的。html

    限速場景,須要對當前設備的發包作限制。(其實原本想在接收包時作限制,可是tc只能對發包限制,收包限制不住)當前ens8端口爲10GE光口,帶寬能夠達到1250MB/s。咱們先限制總的網絡流速爲10000Mbit/s,而後再建立子類,將子類限制流速爲100Mbit/s,最後再使用iptables命令將發包的端口與子類關聯,達到對端口限速的目的。具體操做以下:linux

#查看現有的隊列 tc -s qdisc ls dev eth0 #查看現有的分類 tc -s class ls dev eth0

#清理iptables Mangle規則
iptables -t mangle -F

#清理ens8上原有的隊列類型
tc qdisc del dev ens8 root #建立隊列 tc qdisc add dev ens8 root handle
1:0 htb default 1 #添加一個htb隊列,綁定到eth0上,命名爲1:0 ,默認歸類爲1 #handle:爲隊列命名或指定某隊列 #建立分類 tc class add dev ens8 parent 1:0 classid 1:1 htb rate 10000Mbit #爲ens8下的root隊列1:0添加一個分類並命名爲1:1,類型爲htb,帶寬爲10000M #rate: 是一個類保證獲得的帶寬值.若是有不僅一個類,請保證全部子類總和是小於或等於父類. #建立一個子分類 tc class add dev ens8 parent 1:1 classid 1:10 htb rate 100Mbit ceil 100Mbit #爲1:1類規則添加一個名爲1:10的類,類型爲htb,帶寬爲100M
#ceil: ceil是一個類最大能獲得的帶寬值.
#爲了不一個會話永佔帶寬,添加隨即公平隊列sfq. 
tc qdisc add dev ens8 parent
1:10 handle 10: sfq perturb 10
#perturb:是多少秒後從新配置一次散列算法,默認爲10秒
#sfq,能夠防止一個段內的一個ip佔用整個帶寬

#使用u32建立過濾器
tc filter add dev ens8 protocol ip parent
1:0 prio 1 u32 match ip sport 46320 flowid 1:10
#執行此步時老是報錯(Illegal 「match」) 注意flowid須要與classid相同

#上步執行報錯,採用iptables方式限速
#建立過濾器並制定handle
tc filter add dev ens8 parent 1:0 protocol ip prio 1 handle 10 fw classid 1:10

#使用iptables對端口綁定tc隊列
iptables -A OUTPUT -t mangle -p tcp --sport 46320 -j MARK --set-mark 10
#set-mark與classid相同

    完成上述配置後,當從端口46320發出去的包獲得了限速,經過包大小以及包個數,傳輸包的時間大概統計出帶寬值以下:算法

Trans data for 1000 times, average time for every process: 0.0513210330009 average time 0.0513210330009 bandwidth 11.1887605612 MB/s

帶寬與設置的限速吻合,從其餘端口發出去的包沒有收到限制,帶寬較大,以下:網絡

Trans datafor 1000 times, average time for every process: 0.00130607795715 average time 0.00130607795715 bandwidth 439.651206771 MB/s

原理後續分析,未完待續。。。tcp

 

 

 

參考博客post

https://my.oschina.net/adailinux/blog/1631371spa

https://www.diannaobos.com/post/609.html操作系統

相關文章
相關標籤/搜索