这不仅仅是一个单一的操作,而是一套综合性的防护策略,下面我将从不同层面和角度,为您详细讲解如何实现。
服务器的“伤害”可能来自网络流量、应用程序漏洞、资源滥用等,防护也需要多层进行。
层面一:网络流量限制(防御DDoS/CC攻击、刷接口)
这是最直接意义上的“伤害限制”,主要针对洪水般的请求。
1、防火墙 (iptables, firewalld, 云防火墙)
限制连接速率 可以设置规则,限制单个IP地址在单位时间内的新建连接数或总连接数。
示例命令 (iptables)
# 允许每分钟最多25个新建SSH连接,超过则丢弃 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 25/minute --limit-burst 100 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP # 限制单个IP对80端口(HTTP)的并发连接数不超过20个 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT
2、Web服务器层限制 (Nginx/Apache)
* Nginx 的limit_req
和limit_conn
模块非常强大。
示例配置 (Nginx)
http { # 定义一个限制区域(一个共享内存区),名为one,每秒处理1个请求(1r/s),突发不超过5个 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /api/ { # 使用one这个zone的规则,突发请求排队延迟处理,超过队列长度则返回503错误 limit_req zone=one burst=5 nodelay; proxy_pass http://my_backend; } # 限制单个IP同时只能有10个连接 limit_conn_zone $binary_remote_addr zone=addr:10m; location /download/ { limit_conn addr 10; # 限制并发连接数 # ... 其他配置 ... } } }
3、使用专业DDoS防护服务
对于大规模流量攻击,硬件防火墙或本地软件规则很难抵御,必须使用上游服务
Cloudflare 提供免费的CDN和基础的DDoS防护,能有效缓解网络层和应用层攻击。
阿里云DDoS高防 / 腾讯云大禹 / AWS Shield 云厂商提供的付费高级防护服务,可以将恶意流量在进入你的服务器之前就清洗掉。
层面二:系统资源限制(防止单个用户/进程拖垮整个系统)
限制单个进程或用户所能使用的资源上限。
1、使用 ulimit
* 主要用于限制Shell会话及其启动的进程资源。
示例 限制所有用户的最大进程数、打开文件数,可以编辑/etc/security/limits.conf
文件。
* hard nproc 1000 # 所有用户最多只能启动1000个进程 * hard nofile 20000 # 所有用户最多同时打开20000个文件 www-data hard nproc 500 # 限制www-data用户(通常跑Web服务)的进程数
2、使用 cgroups (Control Groups)
* Linux内核功能,比ulimit更强大、更精细,可以限制CPU、内存、磁盘I/O、网络等。
对于Docker用户 Docker天然使用cgroups来限制容器资源。
# 运行一个容器,并限制其使用最多1个CPU核心和512MB内存 docker run -it --cpus="1.0" --memory="512m" my_image
对于系统服务 (Systemd) 可以直接在service文件中配置。
# /etc/systemd/system/my_service.service [Service] ... CPUQuota=100% # 最多使用1个核心的100% MemoryMax=512M # 最大内存使用512MB,超过则被OOM Killer杀死 MemorySwapMax=1G # 限制交换空间使用
使用systemd-run
临时测试
# 运行一个命令,并将其CPU使用限制在50% systemd-run --scope -p CPUQuota=50% /path/to/your/cpu_intensive_command
这是开发者和运维人员最能发挥的地方,针对具体的业务逻辑进行限制。
1、API速率限制 (Rate Limiting)
几乎所有Web框架都支持
Python (Django REST framework) 使用throttling
类。
Node.js (Express) 使用express-rate-limit
中间件。
Java (Spring Boot) 使用Spring Security
或resilience4j
。
示例 (Express):
const rateLimit = require('express-rate-limit'); const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100, // 每个IP在15分钟内最多100次请求 message: '请求过于频繁,请15分钟后再试。' }); app.use('/api/', apiLimiter);
2、数据库查询限制
设置最大连接数 在MySQL (max_connections
)、PostgreSQL等数据库中配置,防止太多连接耗尽资源。
限制单条查询 对用户输入进行严格过滤,避免慢查询,限制分页查询的最大条数(LIMIT 1000
)。
设置查询超时 在数据库或ORM框架中设置,自动杀死执行时间过长的查询。
3、输入验证与处理
* 对用户上传的文件大小进行限制(如Nginx的client_max_body_size
)。
* 对用户输入的数据长度、类型进行严格校验,防止注入攻击或异常数据导致程序崩溃。
层面四:监控与告警(知道“伤害”何时发生)
光有限制还不够,你必须知道限制何时被触发,从而发现潜在问题。
1、监控工具:
Prometheus + Grafana 行业标准,可以采集服务器、容器、应用的各种指标(如请求速率、CPU使用率、错误率),并设置漂亮的仪表盘和告警规则。
云监控 阿里云CloudMonitor、腾讯云云监控、AWS CloudWatch等,开箱即用。
2、日志分析:
* 集中收集和分析Nginx、应用程序的日志,如果看到大量503
(服务不可用)或429
(请求过多)错误,说明你的速率限制正在起作用,也可能意味着正在被攻击。
* 使用ELK Stack (Elasticsearch, Logstash, Kibana) 或Loki 等工具。
给服务器加“伤害限制”是一个系统工程,请遵循以下步骤:
1、风险评估: 你的服务器最怕什么?是数据库被打垮?还是带宽被占满?或者是CPU被挖矿程序耗尽?
2、分层配置:
网络层 在Nginx上配置基本的limit_req
和limit_conn
,这是第一道且非常有效的防线。
系统层 为关键服务(如Web服务器、数据库)使用cgroups
或systemd
设置内存和CPU上限。
应用层 在所有API接口上实现速率限制,对数据库操作进行超时和条数限制。
3、启用监控: 搭建一个简单的监控系统(如直接用云厂商的),关注CPU、内存、带宽、错误率等关键指标。
4、使用云防护: 如果服务器直接暴露在公网,务必使用Cloudflare等免费CDN服务,它能帮你抵挡大部分低层攻击。
5、定期复查: 根据监控日志,不断调整你的限制策略,使其既安全又不会影响正常用户。
通过上述组合拳,你的服务器抵御“伤害”的能力将会得到质的提升。
文章摘自:https://idc.huochengrm.cn/fwq/15694.html
评论