一台新装的Linux或Windows服务器只要配置好公网IP,短则几分钟内就会被扫描器探测,SSH的22端口和RDP的3389端口几乎持续收到暴力破解请求。攻击者不一定针对特定目标,更多是通过自动化工具批量扫描弱口令和已知漏洞。由于攻击链路包含流量型、协议型、应用层和主机层多个环节,单独一款防攻击软件很难覆盖全部风险。实际生产环境中更推荐将边界防火墙、主机入侵防御、Web应用防火墙和应用级限流组合使用,并且把基础防护前移到云端高防或CDN侧。分层部署的核心逻辑是先在外围丢弃恶意流量,再在主机层限制异常行为,最后在应用层精确过滤攻击请求。

一、先厘清攻击类型,才知道该用什么软件
服务器面临的攻击通常可以分成三类。第一类是带宽耗尽型攻击,比如UDP Flood、SYN Flood、DNS反射放大,攻击者用海量垃圾流量占满服务器所在机房的出口带宽,导致正常用户根本连不上。第二类是资源耗尽型攻击,典型代表是CC攻击和慢速连接攻击,这类攻击不靠大流量,而是通过大量看似正常的HTTP请求或者长时间占住TCP连接,把服务器的CPU、内存、连接表慢慢耗尽。第三类是入侵型攻击,包括SSH暴力破解、SQL注入、XSS、远程代码执行等,目标不是让服务不可用,而是拿到服务器权限。
针对这三类攻击,软件工具的定位完全不同。网络层防火墙如iptables、nftables主要处理第一类中的一部分,比如限制单个IP的连接速率、丢弃明显异常的包。主机入侵防御工具如Fail2ban、OSSEC主要处理第三类中的暴力破解和文件篡改。Web应用防火墙如ModSecurity则聚焦HTTP请求中的注入攻击。而真正的大流量DDoS攻击,单靠服务器上的软件几乎无解,因为带宽已经在运营商侧被打满,必须依赖云高防、CDN清洗或者运营商黑洞路由。
以Linux自带的iptables为例,限制SSH端口的连接频率可以有效缓解基础爆破行为:
# 限制22端口每分钟最多5个新连接 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
这段规则会把一分钟内新建SSH连接超过5次的源IP直接丢弃。不过它解决不了HTTP层的CC攻击,因为攻击请求在TCP连接建立后才会发生,iptables只能看到IP、端口和包大小,无法判断请求内容是否恶意。所以真正完整的防攻击方案一定是多层工具叠加,而不是指望某一个软件包打天下。
二、好用的服务器防攻击软件推荐
下面按照不同防护层介绍几款经过生产环境验证的工具。它们可以单独使用,也可以配合部署。选择时要结合自己的业务类型、服务器性能和运维能力,不要盲目堆叠所有工具。
- Fail2ban:扫描服务日志,自动封禁异常IP,适合SSH、FTP、邮件服务等暴力破解防护。
- ModSecurity:开源WAF引擎,可配合Apache或Nginx使用,拦截SQL注入、XSS、命令注入等Web攻击。
- Nginx limit_req:应用层限流模块,针对单个IP限制请求速率,缓解CC攻击。
- 云高防/CDN:如Cloudflare、阿里云高防IP、腾讯云DDoS防护,在流量进入服务器前进行清洗。
- Windows环境:IIS自带请求筛选,配合安全狗、D盾等工具使用。
1. Fail2ban:主机层暴力破解拦截
Fail2ban通过监控日志文件,匹配预设的失败规则,一旦某个IP在设定时间内触发多次失败,就调用iptables或firewalld将其临时封禁。默认配置下,它能有效降低SSH、vsftpd、postfix等服务的爆破压力。安装后一般需要新建一个jail.local文件来覆盖默认配置,不建议直接修改jail.conf,因为后者会随软件更新被覆盖。
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600
上述配置的意思是:在600秒内如果某个IP对SSH服务出现5次认证失败,就封禁3600秒。对于公网服务器,这个规则可以挡住大部分自动化爆破脚本。需要注意,如果公司出口IP固定,一定要把自己的办公IP加入ignoreip白名单,否则误封后无法远程登录。
2. ModSecurity:Web应用防火墙
ModSecurity是一个开源WAF引擎,既可以嵌入Apache,也可以通过Nginx的ModSecurity模块运行。它规则灵活,能检测SQL注入、跨站脚本、文件包含等攻击特征。对于没有专职安全人员的团队,可以直接使用OWASP CRS规则集,开箱即用地获得基础防护能力。不过全量规则集对请求延迟有一定影响,建议先在测试环境压测后再上生产。
SecRuleEngine On SecRule REQUEST_URI "@contains /admin" "id:1000,phase:1,deny,status:403,msg:'Admin path blocked'"
这条示例规则表示只要请求路径包含/admin就直接返回403,适合隐藏后台入口。ModSecurity日志中会记录命中规则的ID和请求详情,排查误报时要结合日志逐条确认。对于高并发业务,建议只开启核心规则,关闭噪声较大的规则,并在前端配合Nginx限流使用。
3. Nginx限流与云防护
Nginx的limit_req模块可以基于客户端IP做请求速率限制,对于接口类业务尤其有效。它能识别出单IP异常高频请求,比单纯靠防火墙处理更贴近业务层。配置时先定义共享内存区域,再在具体location中引用。
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
这里rate=10r/s表示每秒最多处理10个请求,超出部分进入burst=20的突发队列。nodelay会立即丢弃超出队列的请求,避免请求堆积。对于普通HTML页面,这个限制可能过严,建议针对登录、搜索、验证码等敏感接口单独设置更低的速率。真正的大流量DDoS还是要在云侧清洗,Nginx限流只能作为最后一道兜底。
三、分层组合策略
把前面提到的工具按层次组合起来,才能形成相对完整的防护体系。通常的部署顺序是:云高防或CDN在最外层抵御带宽消耗型DDoS;服务器防火墙只开放必要端口;Fail2ban自动封禁暴力破解IP;Nginx对HTTP接口限流;ModSecurity过滤Web攻击请求;最后通过OSSEC或自研脚本监控文件完整性和异常登录。
| 防护层 | 典型工具 | 主要应对攻击 |
|---|---|---|
| 云端清洗层 | Cloudflare、阿里云高防IP | 大流量DDoS、CC攻击 |
| 网络层 | iptables、nftables、云防火墙 | 端口扫描、SYN Flood、异常IP封禁 |
| 主机层 | Fail2ban、OSSEC | SSH暴力破解、文件篡改 |
| 应用层 | Nginx limit_req、ModSecurity | CC攻击、SQL注入、XSS |
部署顺序不能反过来。如果ModSecurity已经拦截了请求,说明流量已经到达应用层,此时服务器带宽其实已经被占用了一部分。对于小规模业务,一台1核2G的服务器可能跑完Fail2ban加ModSecurity后CPU就常年超过50%,所以要根据实际负载做取舍。可以先开启Fail2ban和Nginx限流,观察一周资源使用情况,再决定是否引入ModSecurity。
中小网站更经济的做法是使用CDN隐藏源站IP。源站防火墙只允许CDN回源IP访问80和443端口,其他IP一律拒绝。这样普通扫描器根本找不到源站,攻击流量都会打在CDN节点上。缺点是如果CDN配置不当,可能将真实IP泄露在邮件头或DNS历史记录中,因此启用CDN后应当更换一次服务器公网IP。
四、常见问题与注意事项
防攻击工具配置不当会产生比攻击本身更严重的可用性问题。最常见的是误封正常用户,比如公司多人共用一个出口IP时,Fail2ban把整个公司IP封禁,导致所有同事无法访问。解决方法是维护白名单,同时将maxretry适当调高,或者只对特定端口启用封禁。
性能损耗同样需要关注。ModSecurity全量规则可能让请求延迟增加几十毫秒到上百毫秒,登录接口的limit_req设置过低也可能导致正常用户刷新页面时频繁看到503。所有规则上线前都应在测试环境验证,生产环境先以观察模式运行,收集一段时间日志确认无误后再切换为拦截模式。
Windows服务器虽然生态不同,但思路一致。IIS可通过请求筛选限制URL长度、查询字符串和特定扩展名,远程桌面服务可以修改默认端口并配置账户锁定策略。商业软件安全狗和D盾提供实时监控和木马查杀,适合不熟悉命令行操作的运维团队。但Windows防火墙的配置界面比较分散,导出规则不如iptables方便,建议将安全策略写成PowerShell脚本,方便多台服务器同步。
最后还要定期检查封禁日志和系统资源,确认防护规则仍然有效。几个常用命令可以帮助快速判断当前连接数和Fail2ban状态:
# 查看当前TCP已建立连接数 ss -tan state established | wc -l # 查看fail2ban对sshd的封禁状态 fail2ban-client status sshd # 查看某个IP是否被封禁 fail2ban-client get sshd banned
防攻击软件不是一次配置就永久有效。攻击手法会变化,业务接口也会增加,规则需要跟着调整。至少每月检查一次各工具的更新状态,尤其是ModSecurity规则集和系统补丁。所有操作最好保留变更记录,出现问题时能快速回滚到上一个稳定配置。

