Linux下工具tc详细讲解及限制IP和端口实例
首先纠正某一篇博客,TC并不是只管发包不管收包,之前我也很纳闷 知道最后看到了14年前一位大佬的帖子。是ingress!
这里有个非常重要的点就是ingress,如果父类不是他的话是完不成限制源IP的,这个关键词表明你正在添加一个入口队列规则。与传统的egress(数据包离开网络接口时)规则不同,ingress规则是在数据包进入网络接口之前应用的。这意味着它可以过滤或修改入站流量,即便这些流量不是发送到本地主机的。这对于实现防火墙规则、流量监控或者服务质量(QoS)策略非常有用,尤其是在你希望在网络层对数据包进行操作时。但是,网上的教学很少有关于ingress的讲解以及使用,楼主当时也很疑惑为什么限制不住源IP而只能限制住目标IP。
TC (Traffic Control) 是Linux内核中提供的一个用于控制和管理网络流量的强大工具,它允许用户实现QoS(Quality of Service)策略,包括带宽限制、优先级控制、延迟保证等。TC基于内核的队列 discipline (qdisc) 和流量类别(class) 体系结构,允许对进入或离开网络接口的数据流进行复杂的整形和过滤。
输入格式和基本使用流程:
一般来说,TC命令的基本格式如下:
Bash
1tc [ OPTIONS ] OBJECT ACTION [ FILTER ]
OPTIONS: 可选参数,比如-s显示统计数据,-d删除对象等。OBJECT: 操作对象,可以是qdisc(队列规则)、class(流量类别)或filter(过滤器)。ACTION: 针对对象的操作,如add(添加)、change(更改)、replace(替换)、delete(删除)等。FILTER: 对象的具体参数,如接口名称(dev eth0)、父级分类ID(parent ...)、qdisc类型(htb、pfifo_fast等)、速率限制(rate ...)等。
限制 IP 示例:
1. 设置根qdisc (队列规则)
首先,我们需要在接口上设置一个队列规则作为流量控制的起点。假设我们要在ens192接口上使用HTB(Hierarchical Token Bucket)算法:
Bash
tc qdisc add dev ens192 root handle 1: htb default 20
这条命令将在ens192接口上添加一个根级别的HTB队列,分配给它的handle是1:,default 20意味着所有未经分类的流量将被送到handle为20的类,这里的default相当于switch里面的default,就是说网口默认收到的数据毁到handle为20的子类去处理,大家看到这可能会疑惑为什么会有默认,这是因为下方的过滤器,过滤器是为了更加细腻的去处理网口数据。
生活举例:
例如我现在收到了三颗糖,一个甜的,一个咸的,一个辣的,如果我下面没人要我默认都给了甲,但是如果下面设好了过滤器,也就是规则,比如说乙想要辣的,我就会把辣的给乙,不再给甲了。
2. 创建子类进行带宽限制
接下来,创建一个子类并分配一定速率的带宽:
Bash
tc class add dev ens192 parent 1:0 classid 1:20 htb rate 500kbps ceil 1mbps
这条命令创建了一个新的类,其父级是上面创建的根类(handle为1:),新类的handle为1:20,这里同时也对应了上方基类的default的20,使用HTB算法,基础速率(rate)为500kbps,最高上限(ceil)为1mbps。
3. 创建过滤器以识别特定流量
最后,创建一个过滤器,以便将特定流量路由到上面创建的带宽受限的子类:
Bash
tc qdisc add dev "$intf" handle ffff: ingresstc filter add dev "$intf" protocol ip parent 1:0 prio 0 u32 match ip dst 172.16.0.135 flowid 1:20# "$intf" 代表网口 类似于ens33这种
这条命令创建了一个IP协议的过滤器,将目标地址为ip子网的流量引导至类ID为1:20的流量类别,因此这些流量将受到500kbps的带宽限制。
限制 端口 示例:
下面的两步操作都跟限制ip相同,主要是第三步过滤器的不同。
1. 设置根qdisc (队列规则)
首先,我们需要在接口上设置一个队列规则作为流量控制的起点。假设我们要在ens192接口上使用HTB(Hierarchical Token Bucket)算法:
Bash
tc qdisc add dev ens192 root handle 1: htb default 20
这条命令将在ens192接口上添加一个根级别的HTB队列,分配给它的handle是1:,default 20意味着所有未经分类的流量将被送到handle为20的类,这里的default相当于switch里面的default,就是说网口默认收到的数据毁到handle为20的子类去处理,大家看到这可能会疑惑为什么会有默认,这是因为下方的过滤器,过滤器是为了更加细腻的去处理网口数据。
2. 创建子类进行带宽限制
接下来,创建一个子类并分配一定速率的带宽:
Bash
tc class add dev ens192 parent 1:0 classid 1:20 htb rate 500kbps ceil 1mbps
这条命令创建了一个新的类,其父级是上面创建的根类(handle为1:),新类的handle为1:20,这里同时也对应了上方基类的default的20,使用HTB算法,基础速率(rate)为500kbps,最高上限(ceil)为1mbps。
3. 创建端口过滤器
Bash
tc filter add dev ens192 parent 1:0 protocol ip handle 20 fw flowid 1:20
tc filter add dev ens192 parent 1:0 protocol ip u32 match ip sport 2049 0xffff flowid 1:20
这里第一步是将ipv4类型的接口都归于20的子类去处理,这一步也是为了添加容错,主要是第二步,u32是一种过滤器类型,但它提供了具体的匹配条件——match ip sport 2049 0xffff,这意味着只有源端口号(sport)等于2049的流量(这里范围是精确匹配,0xffff是因为u32匹配方式需要指定掩码长度)才会被这个过滤器捕获,并将其流量导向类ID为1:20的类去处理这个数据。
相关文章:
Linux下工具tc详细讲解及限制IP和端口实例
首先纠正某一篇博客,TC并不是只管发包不管收包,之前我也很纳闷 知道最后看到了14年前一位大佬的帖子。是ingress! 这里有个非常重要的点就是ingress,如果父类不是他的话是完不成限制源IP的,这个关键词表明你正在添加一个入口队列规…...
Java | Leetcode Java题解之第73题矩阵置零
题目: 题解: class Solution {public void setZeroes(int[][] matrix) {int m matrix.length, n matrix[0].length;boolean flagCol0 false;for (int i 0; i < m; i) {if (matrix[i][0] 0) {flagCol0 true;}for (int j 1; j < n; j) {if (…...
MySQL#MySql表的操作
目录 一、创建表 二、查看表结构 三、修改表 1.修改表的名字 2.新增一个列 3.修改列 4.删除列 5.修改列的名称 四、删除表 一、创建表 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校…...
git修改版本发布时间
一、场景 发现git版本发布时,服务器时间有误,需要修改。 二、解决 (1)准备 时间戳转换网址:http://shijianchuo.wiicha.com/ (2)SQLite 数据库 连接到安装git的服务器,修改版本表…...
【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计
前言 从今天开始,我们详解介绍制作实时天气时钟项目的方法步骤,主要分以下几个专题分别进行:(1)连接点亮SPI-TFT屏幕和UI布局设计;(2)NodeMCU的WIFI模式设置及连接;&…...
国内首发 | CSA大中华区启动《AI安全产业图谱(2024)》调研
在人工智能(AI)技术的快速发展浪潮中,AI安全已成为全球关注的焦点。为应对AI安全带来的挑战,确保AI技术的健康发展,全球范围内的研究机构、企业和技术社区都在积极探索解决方案。 在这一背景下,CSA大中华区…...
web页面与原生android通信,调用原生android方法
注册初始化方法JsBridge //JS注册事件监听 function connectWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) {callback(WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady,function() {callback(WebViewJav…...
Linux的编译器
程序编译的过程 程序的编译过程是将源代码转换为可执行文件的一系列步骤。这个过程涉及多个阶段,主要包括预处理、编译、汇编和链接。下面详细介绍每个阶段: 1. 预处理(Preprocessing) 在实际编译之前,源代码文件首…...
redis--安装
简介 官网:RedisInsight - The Best Redis GUI 各个版本官网下载地址:http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库,MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…...
魔法程序员的奥妙指南:Java基本语法
作为一名魔法程序员,精通Java语言是至关重要的。Java作为一种强大的编程语言,在编写优质代码和开发强大应用程序时发挥着重要作用。让我们深入探讨Java基本语法的关键要点,从注释到变量,无所不包! Java基本语法的神秘魔…...
SpringMVC传递参数
1.RequestMapping RequestMapping本身可以处理,get或post,指定了get或post之后,就只能处理对应的请求。 RequestMapping(value{"haihiyo","goodMoring"},methodRequestMethod.POST)2.RestFul风格 RestFul是一种风格 比如:网站的访…...
【Scala---04】函数式编程 『 函数 vs 方法 | 函数至简原则 | 函数式编程』
文章目录 1. 函数 vs 方法1.1 方法(1) 定义方法(2) 运算符即方法 1.2 函数(1) 定义函数(2) 匿名函数 1.3 方法转为函数1.4 可变参数&默认参数 2. 函数至简原则3. 函数式编程3.1 函数式编程思想3.3 函数柯里化&闭包3.5 递归 & 尾递归 4. 补充4.1 访问元祖元素4.2 &g…...
[华为OD] B卷 树状结构查询 200
题目: 通常使用多行的节点、父节点表示一棵树,比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后,请打印出来树中他的所有下层节点 输入描述 第一行输入行数,下面是多行数据,每行以空…...
基于机器学习的学生学习行为自主评价设计与实现
管理员功能: a)学生学习数据管理:可查看学生学习的详情,编辑学生学习的内容,删除和添加学生学习,设置学生学习库存。 b)角色管理:增加删除学生用户,分配学生用户权限,查看学生用户…...
toml与json联系对比
前言 本文简单介绍toml;并且和json转化做对比,以及我对toml设计的理解。 参考: TOML: 简体中文 v1.0.0 json和toml转化工具 在线JSON转toml-toml转JSON - bejson在线工具 正文 数组 说白了,就是一个变量名,有多个…...
(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException
报错截图 解决方案 1、登录rabbitMQ网址,删除所有队列 2、重启rabbitMQ 亲测有效!!!亲测有效!!!亲测有效!!!...
基于FPGA的数字信号处理(9)--定点数据的两种溢出处理模式:饱和(Saturate)和绕回(Wrap)
1、前言 在逻辑设计中,为了保证运算结果的正确性,常常需要对结果的位宽进行扩展。比如2个3bits的无符号数相加,只有将结果设定为4bits,才能保证结果一定是正确的。不然,某些情况如77 14(1110),如果结果只…...
基于STM32的宠物箱温度湿度监控系统毕业设计
基于STM32的宠物箱温度湿度监控系统毕业设计 一、项目背景与意义 随着人们生活水平的提高,养宠物已经成为一种流行趋势。然而,对于宠物的居住环境,尤其是温度与湿度的控制,是确保宠物健康的关键。本项目旨在设计一款基于STM32微…...
Linux sudo 指令
sudo命令 概念: sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等。这样不仅减少了root用户的登录和管理时间,同样也提高…...
【NumPy数组】:深入了解numpy.linspace()函数
一、numpy.linspace()函数的原理 numpy.linspace()函数的核心原理是在指定的起始值和终止值之间,按照给定的元素个数,生成等间隔的数值序列。与numpy.arange()函数不同,numpy.linspace()生成的是等间隔的数值,而不是等差的数值&a…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
