海运的博客

linux用tc给软件应用或ip做qos限制下载上传速度

发布时间:May 1, 2023 // 分类: // No Comments

tc只能对网卡出口(egress)方向限速,如果是单机限制下载速度需将入(ingress)定向到虚拟接口出,然后使用虚拟ifb接口对下载限速。
在限制上传速度时可以直接使用iptables mark数据包,但是下载的时候ingress在iptables mark之前,需要在出的时候对流量mark并save,tc在定向流量到虚拟接口的时候添加connmark。

#!/bin/bash
set -x
#上传限速,使用hfsc模式
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: hfsc default 20
tc class add dev eth0 parent 1:0 classid 1:20 hfsc sc rate 1000mbit ul rate 1000mbit
tc class add dev eth0 parent 1:0 classid 1:21 hfsc sc rate 40mbit ul rate 50mbit
#使用htb模式限速
#tc qdisc add dev eth0 root handle 1: htb default 20
#tc class add dev eth0 parent 1:0 classid 1:20 htb rate 1000mbit
#tc class add dev eth0 parent 1:20 classid 1:21 htb rate 40mbit ceil 50mbit
#给限速队列添加随机公平
#tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
#tc qdisc add dev eth0 parent 1:21 handle 21: sfq perturb 10
#iptables mark 21使用class 1:21
tc filter add dev eth0 parent 1:0 prio 1 handle 21 fw flowid 1:21

#下载限速
modprobe ifb numifbs=1
ip link set dev ifb0 up
tc qdisc del dev eth0 ingress
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: u32 match u32 0 0 action connmark \
action mirred egress redirect dev ifb0
tc qdisc del dev ifb0 root
#tc qdisc add dev ifb0 root handle 2: hfsc default 20
#tc class add dev ifb0 parent 2:0 classid 2:20 hfsc sc rate 1000mbit ul rate 1000mbit
#tc class add dev ifb0 parent 2:0 classid 2:21 hfsc sc rate 80mbit ul rate 80mbit

tc qdisc add dev ifb0 root handle 2: htb default 20
tc class add dev ifb0 parent 2:0 classid 2:20 htb rate 1000mbit
tc class add dev ifb0 parent 2:0 classid 2:21 htb rate 80mbit

#直接使用tc限制特定ip,无需iptables mark
#tc filter add dev ifb0 parent 2:0 protocol ip prio 0 u32 match ip dst 192.168.1.2 flowid 2:21
#tc filter add dev ifb0 parent 2:0 protocol ipv6 prio 0 u32 match ip6 dst 2408::/16 flowid 2:21

tc filter add dev ifb0 parent 2:0 prio 0 handle 21 fw flowid 2:21

iptables -t mangle -F
iptables -t mangle -X
ip6tables -t mangle -F
ip6tables -t mangle -X

iptables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -p tcp -m multiport --dport 80,443 -j RETURN
iptables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -d 192.168.1.0/24 -j RETURN
iptables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -j MARK --set-mark 21
iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
ip6tables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -j CONNMARK --restore-mark
ip6tables -t mangle -A OUTPUT -m owner --uid-owner user -o eth0 -m mark ! --mark 0 -j ACCEPT
ip6tables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 21
ip6tables -t mangle -A OUTPUT -j CONNMARK --save-mark

查看:

tc -s qdisc show dev eth0
tc -s qdisc show dev eth0 root
tc -s qdisc show dev eth0 ingress
tc -s class show dev eth0 
tc -s filter show dev eth0 

参考:
https://blog.csdn.net/i_scream_/article/details/82776333

Total commander和Everything整合

发布时间:October 21, 2013 // 分类:Total Commander // No Comments

Total commander中调用Everything搜索文件:
首先定义调用Everything.exe 命令及参数,编辑配置文件usercmd.ini添加以下:

[em_Everything]   
cmd=D:/Program Files/Everything/Everything.exe   
param="-search "%P ""  
#%P为在当前目录下,P后面空格包含子目录

设置相应快捷键调用上面定义的命令,编辑wincmd.ini在[Shortcuts]下添加:

A+F=em_Everything

Everything搜索结果中调用Total commander打开目录,编辑Everything.ini添加:

open_folder_path_command=$exec("D:/Program Files/totalcmd/TOTALCMD64.EXE" "/O" "/S" "/T" "$parent(%1)")   
open_folder_command=$exec("D:/Program Files/totalcmd/TOTALCMD64.EXE" "/O" "/S" "/T" "%1")  
#参数O只打开一个实例,N相反,参数T在新标签中打开,S在焦点窗口打开标签

Total Commander修改压缩文件图标为Winrar

发布时间:February 3, 2013 // 分类:Total Commander // No Comments

Total Commander可通过外挂dll或icl文件美化文件图标,程序定义了文件与图标的对应关系。
TC修改美化文件图标.png
美化修改图标可使用Axialis IconWorkshop,加载到TC修改配置文件添加:

IconLib=%COMMANDER_PATH%\Name.dll

提供修改好的下载:TC美化图标

Iptables和TC数据包流程图

发布时间:December 28, 2012 // 分类:Iptables // 1 Comment

IptablesTC数据包流程如下:
iptables和tc数据包流程图.png

Iptables数据包、连接标记模块MARK/CONNMARK使用

发布时间:November 7, 2012 // 分类:Iptables // No Comments

MARK标记用于将特定的数据包打上标签,供Iptables配合TCQOS流量限制或应用策略路由
看看和MARK相关的有哪些模块:

ls /usr/lib/iptables/|grep -i mark
libxt_CONNMARK.so
libxt_MARK.so
libxt_connmark.so
libxt_mark.so

其中大写的为标记模块,小写的为匹配模块,它们之间是相辅相成的。
MARK标记数据包:

#如将所有TCP数据包标记为1
iptables -t mangle -A PREROUTING -p tcp -j MARK --set-mark 1

mark匹配数据包:

#匹配标记1的数据并保存数据包中的MARK到连接中
iptables -t mangle -A PREROUTING -p tcp -m mark --mark 1 -j CONNMARK --save-mark
#将非空mark数据包保存到连接中
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark

CONNMARK标记连接:

iptables -j CONNMARK --help
--set-mark #标记连接
--save-mark #保存数据包中的MARK到连接中
--restore-mark #将连接中的MARK设置到同一连接的其它数据包中
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --set-mark 1

connmark匹配连接:

iptables -m connmark --help
--mark value #匹配连接的MARK的标记
#匹配连接标记1并将连接中的标记设置到数据包中
iptables -t mangle -A PREROUTING -p tcp -m connmark --mark 1 -j CONNMARK --restore-mark

应用案例:Iptables标记数据策略路由多WAN带宽叠加并负载均衡

其它可参考:
https://blog.csdn.net/bytxl/article/details/7918403
https://blog.csdn.net/dog250/article/details/78301259

分类
最新文章
最近回复
  • opnfense: 谢谢博主!!!解决问题了!!!我之前一直以为内置的odhcp6就是唯一管理ipv6的方式
  • liyk: 这个方法获取的IPv6大概20分钟之后就会失效,默认路由先消失,然后Global IPV6再消失
  • 海运: 不好意思,没有。
  • zongboa: 您好,請問一下有immortalwrt設定guest Wi-Fi的GUI教學嗎?感謝您。
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...