首页
centos
常用命令linux_系统
Centos后台运行程序命令nohup
CentOS7启用阿里源yum安装Nginx
使用清华大学yum源
使用国内yum源
Linux script(录制) 命令
Linux内核参数中的配置项
Linux 系统生成或重置机器 ID
centos7系统安装
Centos7配置开机自启动脚本
CentOS忘记密码
Linux的服务、程序
系统优化+模板制作
CentOS设置环境变量
CentOS7的systemd
Linux常用命令记录
Centos 7查看系统最近一次启动时间和运行时间
Linux命令 之 watch命令
Centos7下date怎么英文格式输出
linux 使用 rz 和 sz 上传下载文件
Linux下的压缩/解压缩
常用命令linux_文本处理
计划任务crontab
CentOS7 SElinux和防火墙Firewall
Centos firewall-cmd配置软路由
CentOS7系统中使用iptables
iptables配置
iptables基础操作
使用iptables设置端口敲门(port knocking)后转发
Centos7 SSH登录日志分析
CentOS下查看tcp的网络连接状态数 netstat + awk
CentOS7上安装 Fail2Ban防SSH爆破
Fail2Ban开启邮件告警
LDAP
文件存储
ZFS
SSH
CentOS 7 SSH配置免密码登录
CentOS7开启SSH访问配置
删除ssh客户端记录的主机密钥标识(指纹)
sshd启动失败解决
添加用户,设置sudo权限
ssh公钥、机器指纹
ssh客户端提示:找不到对应主机密钥类型
shell脚本
示例:jumpserver一键安装脚本
centos中使用ping日志记录网络通断
盘符挂载硬盘导致重启系统失败
CentOS_网络
centos路由配置
Linux 系统添加永久静态路由
centos 添加删除路由
Linux下使用TC实现网络限流
linux系统下的wifi启动不了
hosts文件配置
网络端口
Centos 网卡命名规则
Centos命令行中nmtui调用图形界面设置网卡
查看CentOS网口的使用带宽
linux抓包工具tcpdump
定时备份删除文件
定时删除n日前的文件
备份指定目录下的文件
检查定时备份是否执行
inotify+rsync实时同步
rsync+lsync
CentOS7 使用SMTP发送邮件
Centos7部署开源SSH蜜罐cowrie
Centos7磁盘相关命令
centos 7 新增硬盘 分区并挂载
centos7加硬盘给根分区扩容--lvm模式
Linux中对lvm逻辑卷分区大小的调整(针对xfs与ext4不同文件系统)
CentOS7挂载4T磁盘
Centos7_NFS
CentOS7挂载samba共享文件夹
vsftpd主动模式和被动模式
CentOS清除旧硬盘格式
CentOS磁盘读写性能测试
硬盘IO查看分析工具iostat
Linux迁移home目录到根目录-需LVM分区
使用 smartctl 命令检查硬盘的状态
lsof列出正在使用某个文件夹
/dev/disk 目录
本文档由 内网文摘 发布,转载请注明出处
-
+
首页
Linux下使用TC实现网络限流
### 1. Linux 下的流量控制原理 通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作: - 增加延时 - 丢包 - 重新排列 - 重复、损坏 - 速率控制 在 qdisc-class-filter 结构下,对流量进行控制需要进行三个步骤: - 创建 qdisc 队列 上面提到 Linux 是通过包的排队进行流量的控制,那么首先得有一个队列。 - 创建 class 分类 class 实际上,就是划分流量策略分类。比如划分两档流量限速 10MBps、20MBbs。 - 创建 filter 过滤 虽然创建了 class 分类,但是并没有将任何的 IP、Port 绑定到 class 上,此时并不会有控制作用。还需要创建 filter 将指定的 IP、Port 绑定到 class 上,才能使流量控制 class 生效于资源。 - TC 是 Linux 下提供的流量控制工具,也是 Cilium/eBPF 等网络组件的核心基础设施之一。 ### 2. 限制指定 IP、Port 对本机的访问速度 #### 2.1 查看网卡 ```shell ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 1.1.1.1 netmask 255.255.254.0 broadcast 1.1.1.1 inet6 1::1:1:1:1 prefixlen 64 scopeid 0x20<link> ether 1:1:1:1:1:1 txqueuelen 1000 (Ethernet) RX packets 2980910 bytes 2662352343 (2.4 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1475969 bytes 122254809 (116.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` #### 2.2 配置 qdisc-class-filter 创建 qdisc 根队列 ```shell tc qdisc add dev eth0 root handle 1: htb default 1 ``` 创建第一级 class 绑定所有带宽资源 注意这里的单位是 6 MBps,也就是 48 Mbps。 ```shell tc class add dev eth0 parent 1:0 classid 1:1 htb rate 6MBps burst 15k ``` 创建子分类 class 可以创建多个子分类,对资源的流量进行精细化管理。 ```shell tc class add dev eth0 parent 1:1 classid 1:10 htb rate 6MBps ceil 10MBps burst 15k ``` 这里 ceil 设置的是上限,正常情况下限速为 6MBps,但网络空闲时,可以达到 10 MBps。 创建过滤器 filter,限制 IP ```shell tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 1.2.3.3 flowid 1:10 ``` 这里对 1.2.3.4 进行限制带宽为 1:10,也就是 6MBps。当然,你也可以直接给网段 1.2.0.0/16 加 class 策略。 #### 2.3 查看并清理配置 查看 class 配置 ```shell 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 配置 ```shell 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 ``` 清理全部配置 ```shell tc qdisc del dev eth0 root ``` ### 3. 限制本机对指定 IP、Port 的访问速度 由于排队规则主要是基于出口方向,不能对入口方向的流量(Ingress)进行限制。因此,我们需要将流量重定向到 ifb 设备上,再对 ifb 的出口流量(Egress)进行限制,以最终达到控制的目的。 #### 3.1 启用虚拟网卡 IFB是tc过滤器的替代选择,用于处理入口流量,方法是将其重定向到虚拟接口并将其视为出口流量。每个物理接口需要一个ifb接口,以将入口流量从eth0重定向到ifb0,将eth1重定向到ifb1等等上。 参考:[Openwrt配置QOS流量带宽限制](https://www.cnblogs.com/lsgxeva/p/15877085.html "Openwrt配置QOS流量带宽限制") 插入ifb模块时,告诉它所需的虚拟接口数量。默认值为2。 插入ifb模块 `modprobe ifb numifbs=1` 启用 ifb0 接口(虚拟设备) ip link set dev ifb0 up #### 3.2 配置 qdisc-class-filter 添加 qdisc ```shell tc qdisc add dev eth0 handle ffff: ingress ``` 重定向网卡流量到 ifb0 ```shell tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0 ``` 添加 class 和 filter ```shell 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 访问的监控图 ![](/media/202212/2022-12-29_084745.png) 进入的流量被限制在 6 MBps 以下,而出去的流量不被限制。 查看 class 配置 ```shell 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 配置 ```shell 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 ``` 清理全部配置 ```shell tc qdisc del dev eth0 ingress tc qdisc del dev ifb0 root modprobe -r ifb ``` 参考:[如何在 Linux 下使用 TC 优雅的实现网络限流](https://mp.weixin.qq.com/s/YToPtt1aMuniMVX_dQRAVQ "如何在 Linux 下使用 TC 优雅的实现网络限流") https://arthurchiao.art/blog/lartc-qdisc-zh/ https://serverfault.com/questions/350023/tc-ingress-policing-and-ifb-mirroring
local
2022年12月29日 08:48
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 LocalNetwork
LocalNetwork
是由mrdoc开源
LocalNetwork.cn
修改的在线文档系统,作为个人和小型团队的云笔记、文档和知识库管理工具。
如果此文档给你或你的团队带来了帮助,欢迎支持作者持续投入精力更新和维护!内网文摘 & LocalNetwork
>>>主页
logo
logo
下载Markdown文件
分享
链接
类型
密码
更新密码