iptables限制并发

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 30001 -m state --state NEW -m hashlimit --hashlimit-above 25/sec \
         --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name edge_rate -j DROP

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8443 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 2000 \
         --connlimit-mask 0 --connlimit-daddr -j DROP

iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --set
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --update --seconds 1 --hitcount 20 -j DROP
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW,RELATED,ESTABLISHED -m connlimit \
         --connlimit-above 2000 --connlimit-mask 0 --connlimit-daddr -j DROP
 
 
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m limit --limit-burst 2 --limit 200/s -j DROP
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 200 \
         --connlimit-mask 0 --connlimit-daddr -j DROP


测了一下-m recent --name LIMIT --update --seconds 1 --hitcount 20 -j DROP 这种方式比较好点原理相同。但是令牌的方式可能不通,这个只能同时20个会话建立。

 

 https://zhuanlan.zhihu.com/p/632132323

ab用法

https://www.jianshu.com/p/5818af25c6fc

 

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 30001 -m state --state NEW -m hashlimit --hashlimit-above 25/sec \
         --hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name edge_rate -j DROP
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8443 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 2000 \
         --connlimit-mask 0 --connlimit-daddr -j DROP
# `iptables` 规则文档

## 概述

本文档详细介绍了一组 `iptables` 规则,这些规则用于限制通过特定端口的 TCP 流量。其目的是防止服务器过载和潜在的拒绝服务攻击。规则分别限制新连接的速率和已建立连接的总数。

## 规则详细说明

### 规则 1: 限制端口 30001 的新连接速率

```bash
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 30001 -m state --state NEW -m hashlimit --hashlimit-above 25/sec \
--hashlimit-burst 5 --hashlimit-mode dstip --hashlimit-name edge_rate -j DROP
```

- **效果**:
- **速率限制**: 使用 `hashlimit` 模块限制每秒超过 25 个新连接,允许的突发连接数为 5。
- **限制模式**: 基于目标 IP 地址进行限制,确保每个目标 IP 的连接速率被单独计算。
- **动作**: 丢弃超过限制的连接请求。这有助于防止短时间内的连接激增,保护服务器资源,防止过载和潜在的拒绝服务攻击。

### 规则 2: 限制端口 8443 的已建立连接总数

```bash
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8443 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 2000 \
--connlimit-mask 0 --connlimit-daddr -j DROP
```

- **效果**:
- **连接数限制**: 使用 `connlimit` 模块限制每个目标 IP 地址的已建立连接数。如果某个目标 IP 地址的连接数超过 2000,则该连接请求将被丢弃。
- **动作**: 丢弃超过限制的连接。这有助于防止单个 IP 地址占用过多的连接资源,确保服务器能够为更多的客户端提供服务。

## 效果

这些规则通过限制新连接的速率和每个目标 IP 的最大连接数,帮助服务器更好地管理资源,防止单个 IP 地址或恶意行为者消耗过多的连接资源,从而保护服务器免受过载和潜在的拒绝服务攻击。

## 注意事项

- **持久性**: 默认情况下,`iptables` 规则在重启后不会持久化。要使其持久化,可以使用 `iptables-save` 工具保存规则,并在启动时使用 `iptables-restore` 恢复。
- **测试**: 在生产环境中应用此类规则之前,请在受控环境中进行测试,以确保其按预期工作。
- **调整限制**: 可以根据你的具体需求和服务器的容量调整速率限制和连接数限制的值。

iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --set
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --update --seconds 1 --hitcount 20 -j DROP
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW,RELATED,ESTABLISHED -m connlimit \
         --connlimit-above 2000 --connlimit-mask 0 --connlimit-daddr -j DROP

# `iptables` 规则文档

## 概述

本文档详细介绍了一组 `iptables` 规则,这些规则用于限制通过端口 3000 的 TCP 流量。其目的是防止服务器过载和潜在的拒绝服务攻击。规则分别限制新连接的速率和已建立连接的总数。

## 规则详细说明

### 规则 1: 记录端口 3000 的新连接

```bash
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --set
```

- **效果**: 使用 `recent` 模块记录每个新连接的来源 IP 地址,并将其存储在名为 `LIMIT` 的列表中。此规则不丢弃任何连接,只是用于跟踪新连接。

### 规则 2: 限制端口 3000 的新连接速率

```bash
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m recent --name LIMIT --update --seconds 1 --hitcount 20 -j DROP
```

- **效果**: 检查 `LIMIT` 列表中记录的 IP 地址。如果某个 IP 地址在 1 秒内尝试建立超过 20 个新连接,则该连接请求将被丢弃。这有效地限制了每个 IP 地址的连接速率,防止短时间内的连接激增。

### 规则 3: 限制端口 3000 的连接总数

```bash
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW,RELATED,ESTABLISHED -m connlimit \
--connlimit-above 2000 --connlimit-mask 0 --connlimit-daddr -j DROP
```

- **效果**: 使用 `connlimit` 模块限制每个目标 IP 地址的总连接数。如果某个目标 IP 地址的连接数超过 2000,则该连接请求将被丢弃。这有助于防止单个 IP 地址占用过多的连接资源。

## 效果

这些规则通过限制新连接的速率和每个目标 IP 的最大连接数,帮助服务器更好地管理资源,防止单个 IP 地址或恶意行为者消耗过多的连接资源,从而保护服务器免受过载和潜在的拒绝服务攻击。

## 注意事项

- **持久性**: 默认情况下,`iptables` 规则在重启后不会持久化。要使其持久化,可以使用 `iptables-save` 工具保存规则,并在启动时使用 `iptables-restore` 恢复。
- **测试**: 在生产环境中应用此类规则之前,请在受控环境中进行测试,以确保其按预期工作。
- **调整限制**: 可以根据你的具体需求和服务器的容量调整速率限制和连接数限制的值。

 
 
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m limit --limit-burst 2 --limit 200/s -j DROP
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 200 \
         --connlimit-mask 0 --connlimit-daddr -j DROP
# `iptables` 规则文档

## 概述

本文档详细介绍了一组 `iptables` 规则,这些规则用于限制通过端口 3000 的 TCP 流量。其目的是防止服务器过载和潜在的拒绝服务攻击。规则分别限制新连接的速率和已建立连接的总数。

## 规则详细说明

### 规则 1: 限制端口 3000 的新连接速率

```bash
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state NEW -m limit --limit-burst 2 --limit 200/s -j DROP
```

- **效果**: 使用 `limit` 模块限制每秒超过 200 个新连接,允许的突发连接数为 2。如果在短时间内有超过 2 个突发连接请求,则这些请求将被丢弃。这有助于防止短时间内的连接激增,保护服务器资源。

### 规则 2: 限制端口 3000 的已建立连接总数

```bash
iptables -t mangle -A PREROUTING -p tcp --dport 3000 -m state --state RELATED,ESTABLISHED -m connlimit --connlimit-above 200 \
--connlimit-mask 0 --connlimit-daddr -j DROP
```

- **效果**: 使用 `connlimit` 模块限制每个目标 IP 地址的已建立连接数。如果某个目标 IP 地址的连接数超过 200,则该连接请求将被丢弃。这有助于防止单个 IP 地址占用过多的连接资源,确保服务器能够为更多的客户端提供服务。

## 效果

这些规则通过限制新连接的速率和每个目标 IP 的最大连接数,帮助服务器更好地管理资源,防止单个 IP 地址或恶意行为者消耗过多的连接资源,从而保护服务器免受过载和潜在的拒绝服务攻击。

## 注意事项

- **持久性**: 默认情况下,`iptables` 规则在重启后不会持久化。要使其持久化,可以使用 `iptables-save` 工具保存规则,并在启动时使用 `iptables-restore` 恢复。
- **测试**: 在生产环境中应用此类规则之前,请在受控环境中进行测试,以确保其按预期工作。
- **调整限制**: 可以根据你的具体需求和服务器的容量调整速率限制和连接数限制的值。

  

 

 

 

# 综合文档

## `iptables` 规则文档

### 概述

本文档详细介绍了两条 `iptables` 规则,这些规则用于限制通过端口 8443 的 TCP 流量。其目的是防止服务器过载和潜在的拒绝服务攻击。规则分别限制新连接的速率和已建立连接的总数。

### 规则详细说明

#### 规则 1: 限制新连接速率

##### 规则解释

- **链和协议**:
  - **`-A PREROUTING`**: 该规则被添加到 PREROUTING 链,处理所有入站数据包在路由决策之前。
  - **`-p tcp`**: 规则适用于 TCP 协议。

- **端口和状态**:
  - **`--dport 8443`**: 目标端口为 8443,通常用于 HTTPS 或其他安全通信。
  - **`-m state --state NEW`**: 仅匹配状态为 NEW 的连接,即新的连接请求。

- **速率限制**:
  - **`-m hashlimit`**: 使用 `hashlimit` 模块来限制流量速率。
  - **`--hashlimit-above 25/sec`**: 限制每秒超过 25 个新连接。
  - **`--hashlimit-burst 5`**: 允许的突发连接数为 5,超过此数量的连接将被丢弃。
  - **`--hashlimit-mode dstip`**: 基于目标 IP 地址进行限制,确保每个目标 IP 的连接速率被单独计算。
  - **`--hashlimit-name edge_rate`**: 为此限制规则命名为 `edge_rate`,便于管理和监控。

- **动作**:
  - **`-j DROP`**: 丢弃超过限制的连接请求,防止过多的新连接对服务器造成压力。

#### 规则 2: 限制已建立连接总数

##### 规则解释

- **链和协议**:
  - **`-A PREROUTING`**: 同样添加到 PREROUTING 链。
  - **`-p tcp`**: 规则适用于 TCP 协议。

- **端口和状态**:
  - **`--dport 8443`**: 目标端口为 8443。
  - **`-m state --state RELATED,ESTABLISHED`**: 仅匹配状态为 RELATED 或 ESTABLISHED 的连接,即已经建立或相关的连接。

- **连接数限制**:
  - **`-m connlimit`**: 使用 `connlimit` 模块来限制连接数。
  - **`--connlimit-above 2000`**: 限制每个目标 IP 地址的连接数超过 2000。
  - **`--connlimit-mask 0`**: 不使用子网掩码进行限制,适用于所有 IP。
  - **`--connlimit-daddr`**: 基于目标 IP 地址进行限制,确保每个目标 IP 的连接数被单独计算。

- **动作**:
  - **`-j DROP`**: 丢弃超过限制的连接,防止过多的已建立连接对服务器造成压力。

### `COMMIT`

- **`COMMIT`**: 表示将所有挂起的规则更改提交到 `iptables`,使其生效。这是 `iptables` 配置文件中的一个关键字,用于确保规则在内核中被应用。

### 效果

这些规则的主要目的是通过限制新连接的速率和已建立连接的总数来保护服务器免受过载和潜在的拒绝服务攻击。通过限制每秒的新连接数和每个目标 IP 的最大连接数,服务器可以更好地管理资源,防止单个 IP 地址或恶意行为者消耗过多的连接资源。

### 注意事项

- **持久性**: 默认情况下,`iptables` 规则在重启后不会持久化。要使其持久化,可以使用 `iptables-save` 工具保存规则,并在启动时使用 `iptables-restore` 恢复。
- **测试**: 在生产环境中应用此类规则之前,请在受控环境中进行测试,以确保其按预期工作。
- **调整限制**: 可以根据你的具体需求和服务器的容量调整 `--hashlimit-above` 和 `--connlimit-above` 的值。

# 如何测试和验证 `iptables` 规则效果

## 1. 检查当前规则

首先,确保你的 `iptables` 规则已正确设置:

```
sudo iptables -L -v -n
```

## 2. 模拟流量

为了测试规则,你可以模拟会触发它们的流量。以下是一些方法:

- **使用 `curl` 或 `wget`**:向服务器的指定端口(例如,8443)发送请求,查看连接是否被限制或丢弃。

  ```bash
  curl http://your-server-ip:8443
  ```

- **使用负载测试工具**:像 `ab`(Apache Benchmark)、`siege` 或 `wrk` 这样的工具可以模拟多个连接以测试速率限制和连接限制。

  ```bash
  ab -n 100 -c 10 http://your-server-ip:8443/
  ```

  此命令发送 100 个请求,使用 10 的并发数。

## 3. 监控日志

检查系统日志以查看是否有连接被丢弃。你可以使用 `dmesg` 或检查 `/var/log/syslog` 或 `/var/log/messages`,具体取决于你的系统配置。

```bash
sudo dmesg | grep iptables
```

## 4. 检查连接数

使用 `netstat` 或 `ss` 查看当前连接,验证限制是否被执行:

```bash
netstat -an | grep :8443
```

或

```bash
ss -an | grep :8443
```

## 5. 查看 `iptables` 计数器

在模拟流量后,再次检查 `iptables` 计数器,查看规则是否被触发:

```bash
sudo iptables -L -v -n
```

查看你正在测试的规则上的数据包和字节计数是否增加。

## 6. 调整和重新测试

如果规则没有按预期工作,调整参数(例如,连接限制、速率限制)并重新测试。确保在规则按预期工作时保存它们:

```bash
sudo iptables-save > /etc/iptables/rules.v4
```

## 7. 自动化测试

为了更全面的测试,考虑编写脚本来自动化测试过程,模拟各种流量模式并检查结果。

通过遵循这些步骤,你可以有效地测试和验证 `iptables` 规则的行为,以确保它们提供所需的保护和性能。

 

  

posted on 2025-01-06 18:10  吃草的青蛙  阅读(115)  评论(0)    收藏  举报

导航