1. 配置 Linux 限流包含哪些部分?
核心比喻:像“交通警察”一样控制车辆流量
- 问题:
如果一条高速公路(服务器网络)突然涌入大量车辆(数据包),可能会堵成“停车场”,导致所有车辆无法通行! - 核心组成部分:
- 带宽分配:定义每个网卡的最大传输速率(如每秒100Mbps)。
- 队列规则:控制数据包的优先级(如紧急请求先过)。
- 流量过滤:根据IP或端口限制特定流量(如封禁攻击IP)。
- 限流工具:如
tc
(Traffic Control)、iptables
或nftables
。 - 日志记录:记录被丢弃的数据包,分析攻击来源。
2. 使用场景
- 服务器防护:
如防止DDoS攻击时限制每个IP的带宽(如每个IP最多1Mbps)。 - 带宽管理:
如限制下载服务器的总带宽(如100Mbps),避免其他服务被挤占。 - 优先级控制:
重要服务(如数据库)的流量优先于普通服务(如日志)。 - 网络测试:
模拟网络拥堵,测试应用在限流下的表现。
3. 底层原理
(1) 如何限流?
- 流量控制工具
tc
:- 队列纪律(qdisc):控制数据包的排队和丢弃规则。
- 类(class):将流量分组(如不同IP或端口)。
- 过滤器(filter):将数据包分到对应的类中。
iptables
/nftables
:- 根据IP或端口设置速率限制(如每秒100个连接)。
- 内核机制:
- 数据包通过限流规则时被标记或丢弃,确保总带宽不超限。
(2) 核心机制
- 令牌桶算法:
每秒生成固定数量的“通行令牌”,没有令牌的数据包被丢弃。 - 带宽分配:
将网卡总带宽分成多个“车道”(类),每个车道有自己的速率限制。 - 丢包策略:
当流量超过限速时,丢弃部分数据包(如随机丢弃或优先丢弃低优先级包)。
4. 流程图
以下是 Linux 限流的流程:
+-------------------+
| 数据包到达网卡 | (如用户访问服务器)
+-------------------+
|
v
+-------------------+
| Linux流量控制层 | (由 `tc` 或 `iptables` 配置)
+-------------------+
|
v
+-------------------+
| 检查限流规则 | (如IP带宽限制)
+-------------------+
|
v
+-------------------+
| 决定放行或丢弃 | (超过限流则丢弃数据包)
+-------------------+
5. 概念图
以下是 Linux 限流的核心概念:
+-------------------+
| Linux限流配置 |
+-------------------+
|
v
+-------------------+
| tc工具 | (流量控制)
+-------------------+
|
v
+-------------------+
| iptables/nftables | (IP级别的限流)
+-------------------+
|
v
+-------------------+
| 带宽分配 | (总带宽和各类带宽)
+-------------------+
|
v
+-------------------+
| 丢包策略 | (如随机丢弃或优先丢弃)
+-------------------+
6. UML 类图
以下是简化后的 UML 类图(用配置组件表示):
+-------------------+
| LinuxNetwork |
+-------------------+
| - interfaces: array| (网卡列表,如 eth0)
| - tcConfig: object | (tc限流配置)
| - iptablesConfig: object | (IP限流配置)
+-------------------+
+-------------------+
| TrafficControl |
+-------------------+
| - qdisc: string | (队列纪律,如 htb)
| - class: string | (流量分类)
| - filter: string | (数据包过滤规则)
+-------------------+
+-------------------+
| IptablesRules |
+-------------------+
| - chain: string | (规则链,如 INPUT)
| - rate: string | (速率限制,如 100/s)
+-------------------+
7. 思维导图
以下是 Linux 限流的思维导图:
+-------------------+
| Linux限流配置 |
+-------------------+
| + 核心工具 |
| + tc |
| + iptables |
| + 配置步骤 |
| + 定义qdisc |
| + 分配带宽 |
| + 设置过滤器 |
| + 作用 |
| + 控制总带宽 |
| + 限制IP流量 |
| + 丢弃多余数据包 |
+-------------------+
8. 实例代码(用 tc 配置带宽限流)
以下是使用 tc
工具的配置示例:
# 1. 清除现有规则(避免冲突)
tc qdisc del dev eth0 root # (a) 删除 eth0 的根队列规则
# 2. 创建 HTB 队列(Hierarchical Token Bucket)
tc qdisc add dev eth0 root handle 1: htb default 10 # (b) 定义根队列和默认类
# 3. 定义总带宽(如100Mbps)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k # (c) 总带宽限制
# 4. 创建子类(限制特定IP的带宽)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit # (d) 允许IP 192.168.1.100 最多10Mbps
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10 # (e) 将目标IP的数据包分到子类
# 5. 限制所有IP的总连接数(用 iptables)
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT # (f) 允许每个IP最多100个并发连接
代码注释详细解释
第 1 步:清除现有规则
tc qdisc del dev eth0 root
- 作用:删除网卡
eth0
的现有队列规则,避免冲突。 - 为什么这么写:确保配置从干净状态开始。
- 知识点:
tc
工具的del
命令。
第 2 步:创建 HTB 队列
tc qdisc add dev eth0 root handle 1: htb default 10
- 作用:为网卡
eth0
创建 HTB 队列(分层令牌桶算法)。 - 为什么这么写:HTB 支持多级流量分类,适合复杂限流场景。
- 知识点:
tc
的qdisc
(队列纪律)类型。
第 3 步:定义总带宽
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k
- 作用:设置网卡
eth0
的总带宽为100Mbps。 - 为什么这么写:总带宽不能超过物理网卡的最大速率。
- 知识点:
tc
的class
命令定义带宽。
第 4 步:创建子类限制IP
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit
- 作用:为特定IP创建子类,限制其带宽为10Mbps。
- 为什么这么写:防止单个IP占用过多带宽(如攻击者)。
- 知识点:HTB 的层级结构(父类和子类)。
第 5 步:过滤数据包到子类
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:10
- 作用:将目标IP
192.168.1.100
的数据包分到子类1:10
。 - 为什么这么写:通过IP地址匹配,精准控制特定用户的流量。
- 知识点:
tc
的过滤器规则。
第 6 步:限制并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
- 作用:限制每个IP的并发连接数不超过100。
- 为什么这么写:防止单IP发起大量连接挤占服务器资源。
- 知识点:
iptables
的连接限制模块connlimit
。
9. 详细说明
(1) tc 工具的核心参数
qdisc
:htb
:分层令牌桶算法,支持多级流量分类。pfifo_fast
:简单先进先出队列,适合低复杂度场景。
class
:
定义带宽分配(如rate 10mbit
)。filter
:
将数据包分到对应的类中(如按IP或端口)。
(2) iptables 的连接限制
connlimit
:
统计每个IP的连接数,超过100
则拒绝新连接。-m connlimit
:
启用连接数限制模块,--connlimit-above 100
表示超过100时触发规则。
(3) 流量控制流程
- 数据包到达网卡:
- 如用户访问
192.168.1.100
的网页。
- 如用户访问
- tc 过滤器匹配:
- 将该IP的数据包分到
1:10
类。
- 将该IP的数据包分到
- 带宽检查:
- 如果该类已用满10Mbps,则丢弃多余数据包。
- iptables 连接检查:
- 如果该IP的并发连接超过100,则拒绝新连接。
10. 总结
- Linux限流是“交通警察系统”:
tc
:控制每辆车(数据包)的通过速度。iptables
:拦截违规车辆(过多连接的IP)。
- 核心步骤:
- 用
tc
分配总带宽和子类带宽。 - 用
iptables
限制IP的并发连接。
- 用
- 底层原理:
通过内核队列管理数据包,丢弃超过限流的流量。
11. 扩展问题解答
Q1: 如何查看当前限流规则?
- A1:
tc -s qdisc show dev eth0 # 查看队列规则 iptables -L -n -v # 查看iptables规则
Q2: 如何持久化配置?
- A2:
将命令写入/etc/rc.local
或通过systemd
服务在开机时执行。
Q3: 如何限制上传和下载带宽?
- A3:
# 下载限速(出站) tc qdisc add dev eth0 root handle 1: htb default 10 tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit # 上传限速(入站) tc qdisc add dev eth0 ingress # 创建入站队列 tc filter add dev eth0 parent ffff: protocol ip u32 match ip src 192.168.1.100 flowid 1:2 tc class add dev eth0 parent ffff:1 classid ffff:2 htb rate 5mbit
12. 完整配置示例(用 tc 限制总带宽)
# 清除旧规则
tc qdisc del dev eth0 root
# 创建 HTB 根队列
tc qdisc add dev eth0 root handle 1: htb default 10
# 定义总带宽为100Mbps
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k
# 创建子类:普通流量(80Mbps)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:10
# 创建子类:特定IP限速(10Mbps)
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 10mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip dst 192.168.1.100 flowid 1:20
13. 总结
- Linux限流是“网络的交通管制系统”:
tc
:控制数据包的通过速度。iptables
:拦截违规的IP或端口。
- 核心作用:
防止服务器因流量过大崩溃,保护带宽资源。 - 底层原理:
内核通过队列和令牌桶算法动态控制数据包的放行与丢弃。
14. 关键知识点总结
指令/工具 | 作用 | 示例 |
---|---|---|
tc | 配置带宽和流量分类 | 限制网卡总带宽为100Mbps |
iptables | 限制IP的连接数或流量 | 拒绝超过100个连接的IP |
qdisc | 定义队列纪律(如 HTB) | tc qdisc add ... |
class | 定义流量类别(如不同IP的带宽) | tc class add ... |
filter | 将数据包分到对应的类别中 | tc filter add ... |
15. 总结
- Linux限流是“网络的交通警察”:
- 通过
tc
控制带宽,iptables
阻止违规IP。
- 通过
- 核心步骤:
- 定义总带宽和子类带宽。
- 过滤数据包到对应类别。
- 用
iptables
补充连接数限制。
- 底层原理:
内核通过令牌桶算法和队列管理,动态丢弃超过限流的数据包。
16. 代码补充说明
限制特定端口的流量
# 限制 SSH 端口(22)的带宽为2Mbps
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 2mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dport 22 0xffff flowid 1:30
17. 总结
- Linux限流是“网络的红绿灯”:
tc
:控制每辆车(数据包)的通过速度。iptables
:禁止违规车辆(过多连接的IP)。
- 核心作用:
防止服务器因流量过大崩溃,合理分配网络资源。