配置 Linux 限流一共包含哪些部分?使用场景是什么?底层原理是什么?

1. 配置 Linux 限流包含哪些部分?

核心比喻:像“交通警察”一样控制车辆流量
  • 问题
    如果一条高速公路(服务器网络)突然涌入大量车辆(数据包),可能会堵成“停车场”,导致所有车辆无法通行!
  • 核心组成部分
    1. 带宽分配:定义每个网卡的最大传输速率(如每秒100Mbps)。
    2. 队列规则:控制数据包的优先级(如紧急请求先过)。
    3. 流量过滤:根据IP或端口限制特定流量(如封禁攻击IP)。
    4. 限流工具:如 tc(Traffic Control)、iptablesnftables
    5. 日志记录:记录被丢弃的数据包,分析攻击来源。

2. 使用场景

  • 服务器防护
    如防止DDoS攻击时限制每个IP的带宽(如每个IP最多1Mbps)。
  • 带宽管理
    如限制下载服务器的总带宽(如100Mbps),避免其他服务被挤占。
  • 优先级控制
    重要服务(如数据库)的流量优先于普通服务(如日志)。
  • 网络测试
    模拟网络拥堵,测试应用在限流下的表现。

3. 底层原理

(1) 如何限流?
  1. 流量控制工具 tc
    • 队列纪律(qdisc):控制数据包的排队和丢弃规则。
    • 类(class):将流量分组(如不同IP或端口)。
    • 过滤器(filter):将数据包分到对应的类中。
  2. iptables/nftables
    • 根据IP或端口设置速率限制(如每秒100个连接)。
  3. 内核机制
    • 数据包通过限流规则时被标记或丢弃,确保总带宽不超限。
(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
  1. 作用:删除网卡 eth0 的现有队列规则,避免冲突。
  2. 为什么这么写:确保配置从干净状态开始。
  3. 知识点tc 工具的 del 命令。
第 2 步:创建 HTB 队列
tc qdisc add dev eth0 root handle 1: htb default 10
  1. 作用:为网卡 eth0 创建 HTB 队列(分层令牌桶算法)。
  2. 为什么这么写:HTB 支持多级流量分类,适合复杂限流场景。
  3. 知识点tcqdisc(队列纪律)类型。
第 3 步:定义总带宽
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit burst 15k
  1. 作用:设置网卡 eth0 的总带宽为100Mbps。
  2. 为什么这么写:总带宽不能超过物理网卡的最大速率。
  3. 知识点tcclass 命令定义带宽。
第 4 步:创建子类限制IP
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit
  1. 作用:为特定IP创建子类,限制其带宽为10Mbps。
  2. 为什么这么写:防止单个IP占用过多带宽(如攻击者)。
  3. 知识点: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
  1. 作用:将目标IP 192.168.1.100 的数据包分到子类 1:10
  2. 为什么这么写:通过IP地址匹配,精准控制特定用户的流量。
  3. 知识点tc 的过滤器规则。
第 6 步:限制并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
  1. 作用:限制每个IP的并发连接数不超过100。
  2. 为什么这么写:防止单IP发起大量连接挤占服务器资源。
  3. 知识点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) 流量控制流程
  1. 数据包到达网卡
    • 如用户访问 192.168.1.100 的网页。
  2. tc 过滤器匹配
    • 将该IP的数据包分到 1:10 类。
  3. 带宽检查
    • 如果该类已用满10Mbps,则丢弃多余数据包。
  4. iptables 连接检查
    • 如果该IP的并发连接超过100,则拒绝新连接。

10. 总结

  • Linux限流是“交通警察系统”
    • tc:控制每辆车(数据包)的通过速度。
    • iptables:拦截违规车辆(过多连接的IP)。
  • 核心步骤
    1. tc 分配总带宽和子类带宽。
    2. 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。
  • 核心步骤
    1. 定义总带宽和子类带宽。
    2. 过滤数据包到对应类别。
    3. 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)。
  • 核心作用
    防止服务器因流量过大崩溃,合理分配网络资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值