服务器防火墙配置,核心在于仅开放必要的端口,同时拦截所有非必要的访问请求;它是抵御DDoS攻击、暴力破解和恶意爬虫流量的第一道防线。在实际操作中,我们的目标是:限制SSH访问、有控制地开放Web服务、对可疑请求实施速率限制、监控日志,并尽可能结合CDN/WAF等上层防护,在流量抵达服务器之前就进行过滤。
当你将一台Web服务器接入互联网的那一刻,几分钟内就可能遭遇端口扫描、SSH登录尝试、漏洞扫描爬虫以及伪造的用户代理。特别是运行WordPress、电商平台、管理面板、API或游戏服务器的环境,防火墙不仅是技术选项,更是保障业务连续性的刚需。在本指南中,我们将为Linux服务器构建一套切实可行、循序渐进的防火墙架构;并一同探讨UFW、firewalld、nftables、Fail2ban、Web应用防火墙以及DDoS缓解策略。
让我们从一个重要的事实开始:单靠本地服务器防火墙,无法抵御大规模的DDoS攻击。当20 Gbps、80 Gbps甚至更高流量的攻击抵达数据中心或网络骨干网时,数据包在触及你操作系统中的规则集之前,就能耗尽带宽。因此,正确的思路是分层防御:供应商级别的DDoS防护、CDN/WAF、操作系统防火墙、应用层速率限制以及定期的日志分析,必须协同运作。关于合适的基础设施选择,可以参考Hostragons VPS 和 VDS 服务器解决方案页面,而网站端的安全托管方案,则可查看Hostragons 网络托管套餐页面。
服务器防火墙到底有什么用?
服务器防火墙是一个安全层,它依据源IP、目标IP、端口、协议、连接状态,甚至在某些情况下依据数据包特征来过滤网络流量。举个简单的例子:你的网站需要开放80和443端口,但像3306这样的数据库端口,绝不应该直接暴露在公网上。对于SSH,与其允许所有人尝试连接22端口,不如只允许你自己办公室的IP地址进行连接,这样更安全。
防火墙的核心目标并非神奇地消灭所有攻击,而是缩小攻击面。攻击面越小,攻击者可尝试的途径就越少。例如,一台刚安装好的Linux服务器,可能同时开放着SSH、Web管理面板、邮件服务、数据库、监控代理以及测试服务。每一项服务都会产生独立的风险。一个配置得当的防火墙,遵循的是“默认拒绝,按需放行”的原则。
理解DDoS与爬虫流量
DDoS攻击为何与众不同?
DDoS,即分布式拒绝服务攻击,旨在利用来自大量源头的海量流量,使目标服务无法访问。这类攻击有时会堵塞带宽,有时会耗尽服务器的CPU和内存资源,有时则会触发应用层中代价高昂的操作。例如,一台小型的应用服务器,即使网络线路没有满载,如果每秒收到5万个HTTP请求,也可能因为PHP-FPM、Node.js或数据库连接池被打满而无法响应。
爬虫都是坏家伙吗?
并非如此。像Googlebot、Bingbot以及一些监控爬虫是有益的。然而,恶意爬虫会扫描管理面板、搜索开放目录、发送表单垃圾信息、抄袭内容、滥用XML-RPC、创建虚假注册以及进行登录尝试。因此,爬虫管理的目标不是封禁所有爬虫,而是根据行为进行区分。高错误率、极短时间内的大量请求、不像真实浏览器的头部信息以及可疑的URL模式,都是重要的识别信号。
动手配置前的检查清单
在线上服务器上编写防火墙规则时,最大的风险就是把自己锁在服务器外面。因此,在进行任何更改之前,务必做好简短的准备工作。下面的检查清单,是在生产环境中常用的一种安全启动方法。
- 不要关闭当前的SSH会话;用第二个终端窗口进行测试。
- 确保你的服务器供应商提供了控制台、VNC或救援访问模式。
- 列出当前所有开放的端口:查看 ss -tulpn 或 netstat -tulpn 的输出结果。
- 记录下Web、邮件、DNS、数据库、面板及监控服务各自使用了哪些端口。
- 如果使用IPv6,务必同步规划IPv6的防火墙规则。
- 先应用允许(allow)规则,再应用拒绝(deny)规则。
- 确保规则集是持久化的;服务器重启后不应丢失。
例如,在一台仅用于托管网站的典型服务器上,需要对外部开放的端口通常只有80、443以及受限制的SSH端口。如果服务器不运行邮件服务,那么25、465、587、993等端口就无需开放。如果数据库仅供服务器内部使用,那么3306或5432端口就必须对外部世界关闭。
该选择哪款防火墙工具?
在Linux生态中,有多款工具可供选择,它们大多是在管理相同的内核过滤子系统,只是易用性不同。对于新手,UFW简洁且快速。在企业级或基于Red Hat的系统中,firewalld很普遍。在更高级的场景下,nftables则提供了现代且灵活的框架。下面的表格有助于你做出选择。
| 工具 | 最适用场景 | 优势 | 注意事项 |
|---|---|---|---|
| UFW | 基于Ubuntu和Debian的简单Web服务器 | 语法简单,快速上手 | 在非常复杂的规则集下可能受限 |
| firewalld | AlmaLinux, Rocky Linux, CentOS Stream, RHEL | 区域(Zone)逻辑,持久化规则,服务配置文件 | 需透彻理解运行时(Runtime)与永久(Permanent)规则的区别 |
| nftables | 高级Linux网络安全 | 现代、高性能、灵活 | 错误的规则编写可能导致访问中断 |
| 云安全组 | VPS、云服务器及数据中心环境 | 在流量到达服务器前进行过滤 | 应作为操作系统防火墙的补充,而非替代品 |
| WAF/CDN | Web应用及HTTP攻击防护 | 减少爬虫、HTTP洪水攻击和漏洞扫描 | 需要正确的DNS和真实IP配置 |
服务器防火墙配置实战步骤
1. 确定开放端口与服务
第一步是看清当前开放了什么。在Linux服务器上,ss -tulpn 命令会显示哪些服务正在监听哪些端口。例如,如果nginx在 0.0.0.0:80 和 0.0.0.0:443 上监听,意味着Web流量会从所有网络接口被接收。如果MariaDB在 0.0.0.0:3306 上监听,这通常是有风险的;在大多数网站架构中,数据库应仅在 127.0.0.1 上运行。
这里有一条黄金法则:任何不需要从互联网访问的服务,都不应在 0.0.0.0 上监听。更稳妥的做法是,先修正服务配置本身,再通过防火墙关闭端口。因为即使防火墙被禁用,服务本身也不应该对外暴露。
2. 将默认策略设为拒绝
在安全的规则集中,默认的入站流量应被拒绝,而出站流量则按需放行。这种方法能防止后续安装的服务意外暴露在公网上。在一台使用UFW的Ubuntu服务器上,逻辑是这样的:先放行SSH,再开放80和443端口,然后将默认的入站策略设为拒绝,最后启用防火墙。
示例流程:为你自己的管理员IP地址放行SSH,开放HTTP和HTTPS流量,关闭不必要的端口,然后启用防火墙。在放行SSH之前就启用防火墙,是远程服务器管理中最常见的错误之一。
3. 限制SSH访问
SSH是攻击者最常盯上的服务之一。一台开放了默认22端口的服务器,每天可能会遭受成百上千次密码尝试。最安全的做法是将SSH访问限制在特定IP地址内。如果你有固定IP,可以只允许你办公室或VPN的IP地址访问。如果没有固定IP,至少也要使用基于密钥的认证,并禁用密码登录。
- 禁止root用户直接通过SSH登录。
- 使用SSH密钥代替密码。
- 通过 AllowUsers 或 AllowGroups 限制可登录的用户。
- 使用Fail2ban自动封禁失败的登录尝试。
- 如果你使用管理面板,同样要对面板端口进行IP限制。
单独更改端口并不能提供实质性的安全保障,但可以减少自动爬虫制造的“噪音”。真正的防护还是要靠IP限制、强认证机制和日志监控来实现。
4. 有控制地开放Web端口
对于大多数发布网站的服务器,80和443端口是必需的。但如今,443端口(HTTPS)应是主要的流量端口,而80端口应仅用于重定向到HTTPS。没有SSL证书的网站,既损害用户信任,又影响SEO表现。此时,Hostragons SSL 证书链接是一个引导读者了解安全HTTPS配置的自然内链机会。
在开放Web端口时,要特别注意真实IP的行为。如果你的服务器前面有CDN或反向代理,那么更强大的防护方式不是将80和443端口直接向整个互联网开放,而是仅允许来自CDN IP段的流量。这样,即使攻击者知道了源服务器的真实IP地址,也无法直接访问Web服务。
5. 对公网关闭数据库及内部服务
将MySQL、MariaDB、PostgreSQL、Redis、Elasticsearch、MongoDB及类似服务暴露在公网上,会带来严重风险。Redis未授权访问、Elasticsearch的越权索引访问,或是MongoDB开放的运维端口,过去都曾导致过大量数据泄露事件。这些服务如果可能,应仅监听本地回环地址或内网。
例如,对于运行在同一服务器上的WordPress网站,数据库在 127.0.0.1 上运行就足够了。如果你使用独立的应用和数据库服务器,那么只允许应用服务器的内网IP访问数据库。在公网上开放3306或5432端口,是爬虫持续扫描的常见漏洞。
6. 使用Fail2ban阻止暴力破解尝试
Fail2ban通过监控日志文件,检测重复的失败登录尝试,并临时封禁相关IP地址。你可以为SSH、nginx、Apache、Postfix、Dovecot、WordPress登录以及某些面板服务定义“监狱(jail)”规则。例如,将在10分钟内SSH登录失败5次的IP封禁1小时,是一个简单而有效的起点。
在配置Fail2ban时,要小心不要使用过于激进的规则。错误的日志匹配模式可能会封禁真实用户。因此,初期将封禁时间设得合理一些,监控日志,之后再逐步收紧策略,是更稳妥的做法。
7. 增加速率限制与连接数限制
在操作系统层面实施速率限制,有助于对抗DDoS和爬虫流量。例如,如果来自同一IP的新建连接数每秒过多,就可以施加限制。在Web服务器层面,nginx可以使用 limit_req 和 limit_conn 模块,Apache可以使用 mod_evasive 或类似方案。在应用层面,还需要对登录、搜索、购物车、支付和API接口等端点,分别设置速率限制。
一个具体的例子:对于一个登录页面,单个IP每分钟尝试10次可能是合理的。对于一个搜索接口,每秒2-5次请求可能就足够了。如果你提供API服务,应结合设计基于用户的令牌限制、IP限制和行为分析。这样,攻击者就无法仅仅通过更换IP来绕过所有限制了。
UFW安全配置实战场景
在一台基于Ubuntu或Debian的Web服务器上,可以按以下思路构建一个简单的安全起步场景:首先检查现有服务,允许来自你管理员IP的SSH访问,开放80和443端口,默认拒绝所有入站流量,然后验证UFW状态。如果你的SSH访问无法限制在固定IP,可以先暂时允许所有IP访问SSH,之后再迁移到VPN或固定IP方案。
示例决策集如下:假设 203.0.113.10 是你的管理员IP。SSH仅允许来自此IP。Web流量通过80和443端口对所有人开放。数据库、Redis、管理面板和测试端口对外关闭。对于许多中小型企业网站来说,这是一个良好的起点。关于域名和DNS方面的正确配置,可以内链至Hostragons 域名查询与注册页面。
firewalld的区域(Zone)逻辑
在AlmaLinux、Rocky Linux和基于RHEL的服务器上,firewalld使用广泛。firewalld基于“区域”的概念运作。public 区域用于面向公网的接口,trusted 区域用于受信任的内网,而 drop 区域则可用于静默丢弃不受欢迎的流量。最重要的一点是区分运行时规则和永久规则的区别。运行时规则即时生效,但重启后可能丢失;永久规则是持久化的,但可能需要重载才能生效。
在企业环境中使用firewalld时,基于服务的定义能让工作更轻松。例如,你可以在 public 区域开放 http 和 https 服务,并确保 ssh 服务只能从特定的源IP地址访问。如果管理网络、备份网络和用户流量分布在不同的网络接口上,区域结构能显著提升安全性和可读性。
CDN、WAF与供应商级DDoS防护
本地防火墙是在数据包到达服务器后才做出决策。而面对大规模DDoS攻击时,目标是在流量抵达服务器之前就进行过滤。这正是CDN、WAF和供应商级DDoS防护至关重要的原因。CDN在边缘节点提供静态内容,WAF过滤应用层的恶意请求,而供应商的防护则吸收或清洗网络层的大流量攻击。
在理想模型中,你的DNS记录通过CDN解析,源服务器的真实IP被隐藏,服务器防火墙仅允许来自CDN IP段的流量访问80和443端口。管理端口则通过VPN或固定IP访问。这种模式降低了直接攻击IP的可能性,并能在恶意流量到达应用之前就将其剔除。对于同时涉及Web安全和性能的主题,可以使用网站加速与安全指南链接。
针对爬虫的应用层防御措施

反爬虫不仅仅是拉黑IP。现代爬虫会使用代理、移动网络、数据中心IP和多变的用户代理。因此,需要采取基于行为的方法。需要分析的行为包括:同一IP短时间内大量登录尝试、持续产生404错误的扫描、对 wp-login.php 或 xmlrpc.php 的集中访问、与正常用户不同的点击模式,以及可疑的头部信息。
- 在登录和注册表单上使用速率限制。
- 关闭或限制不必要的XML-RPC访问。
- 通过更改URL、IP限制和多因素认证来保护管理面板。
- 在WAF层面过滤可疑的user-agent和referer模式。
- 在表单中适度使用CAPTCHA或无感验证机制。
- 为API接口增加密钥、签名、配额和时间戳校验。
在管理爬虫时,不损害用户体验至关重要。过多的验证码、激进的封锁或错误的地区屏蔽,都可能伤害到你的真实客户。因此,衡量、测试和逐步收紧策略是最健康的方法。
日志监控与告警规则
认为配置完就万事大吉,是一个常见误区。防火墙是一个动态系统,需要定期监控。应关注 auth.log 或 secure 文件中的SSH尝试、nginx访问日志中的异常请求频率、错误日志中404和500错误的激增,以及系统指标中的CPU和连接数。即使是一个简单的告警,也能在攻击开始时为你争取到宝贵的几分钟响应时间。
起步阶段的阈值示例可以这样设定:5分钟内同一IP产生超过100次404请求,1分钟内对登录页面的尝试超过20次,CPU使用率持续10分钟超过90%,连接数达到正常水平的3倍。这些阈值因站点而异;关键在于了解你自己的正常流量基线。
常见错误与规避方法
- 在放行SSH前就启用防火墙:这可能导致你失去对远程服务器的访问。务必使用第二个会话进行测试。
- 忘记配置IPv6:当IPv4端关闭时,服务仍可能通过IPv6暴露在外。
- 将数据库暴露在公网:像3306、5432、6379和9200这样的端口,是爬虫持续扫描的目标。
- 使用了CDN却暴露了源站IP:攻击者可以绕过CDN直接攻击源服务器。
- 在不做记录的情况下修改规则:在紧急情况下,你将很难理解每条规则的作用。
- 没有制定后备访问计划:当规则配置错误又没有控制台访问权限时,宕机时间会大大延长。
实战防火墙策略范例
对于一个企业展示网站,一个可行的策略总结如下:入站流量默认拒绝;443端口对所有访客开放;80端口仅用于重定向至HTTPS;SSH仅允许通过VPN或固定管理员IP访问;数据库位于本地或内网;如果使用CDN,80和443端口仅对CDN的IP段开放;Fail2ban监控SSH和Web登录尝试;每日日志发送到集中式监控工具。
对于一个中等规模的电商网站,除了上述策略,还需要将支付回调IP加入白名单,将管理面板置于VPN之后,对API实施基于用户的配额管理,在WAF上启用SQL注入和XSS防护规则,并准备好基于国家或ASN的临时过滤方案。将这些计划书面化非常重要;在攻击发生时,执行预先制定好的流程,比临时决策更能有效缩短宕机时间。
测试环节:你的规则真的生效了吗?
防火墙配置完成后,务必进行测试。从一个不同的网络进行开放端口扫描,验证SSH访问是否仅对授权IP生效,检查网站是否可通过HTTPS正常访问,确保数据库端口对外部是关闭的。如果使用了CDN,直接向源站IP发送HTTP请求,确认请求被屏蔽。
在测试过程中,不要进行可能损害生产系统的激进扫描。目的是进行安全验证。此外,在每次修改后,导出或记录你的规则集。这样,一旦出现问题,可以轻松地回滚到上一个健康的配置状态。
维护与更新计划
服务器安全不是一次性的配置,而是一个持续的维护过程。当添加新服务时,需要审视其端口需求;当移除旧服务时,应删除相关权限;安全更新要及时应用;日志要定期检查。每月至少进行一次开放端口审计,每季度审视一次防火墙规则集,是一个良好的实践开端。
此外,备份计划也是安全策略的一部分。DDoS攻击可能导致服务中断,而勒索软件或未授权访问则可能造成数据丢失。安全的主机、SSL、域名管理和备份应被统一考量。在此背景下,选择安全托管时需注意事项 和 如何安装SSL证书 是自然的延伸阅读链接。
总结
服务器防火墙配置,并不能让服务器在DDoS和爬虫面前完全隐身;但它能显著缩小攻击面,降低未授权访问的风险,并使你能更可控地应对各类事件。最佳的效果,是通过结合供应商级DDoS防护、CDN/WAF、严格的端口策略、SSH限制、Fail2ban、速率限制和定期日志监控来实现的。
如果你正准备上线一个新项目,从一开始就规划好防火墙策略,远比事后修补要容易得多。当你在Hostragons上评估服务器、主机、域名和SSL基础设施时,将安全需求一并纳入考量,你就能构建一个更具韧性的Web环境。如果需要,可以从一份小小的检查清单开始:关闭不必要的端口,限制好SSH,强制启用HTTPS,并持续监控日志。
常见问题解答
服务器防火墙能完全阻止DDoS攻击吗?
不能。本地防火墙可以缓解小规模及某些协议层面的攻击,但对于大流量DDoS攻击,必须使用供应商级别的DDoS防护、CDN和WAF。
Web服务器上应该保持哪些端口开放?
典型的Web服务器会保持80和443端口开放。SSH端口应仅对管理员IP地址授权。数据库和内部服务端口必须对公网关闭。
我应该使用UFW还是firewalld?
对于Ubuntu和Debian,UFW提供了一个更简单的起点。在AlmaLinux、Rocky Linux和基于RHEL的系统上,firewalld更为普遍。在高级或特殊场景下,可以优先选择nftables。
仅通过封禁IP就能阻止爬虫流量吗?
通常不能。现代爬虫会使用不同的IP和代理。除了IP封禁,还应结合使用速率限制、WAF规则、行为分析、验证码和应用层配额。
配置防火墙时最大的风险是什么?
最大的风险是由于错误的规则导致自己的SSH访问被切断。因此,务必先定义SSH放行规则,使用第二个会话进行测试,并确保供应商的控制台访问可用。