Fail2ban、防火墙与安全事件

配置自动封禁、白名单、搜索引擎验证、CDN 回源信任和 WordPress 安全事件。

Fail2ban 自动封禁

面板会根据登录攻击、XML-RPC、访问过快、敏感文件扫描和大量 404 请求执行自动封禁,并同步到系统防火墙和网站访问规则。重复违规会逐步延长封禁时间。

WordPress 登录和 XML-RPC 爆破会显示为独立的“登录防护”来源,不受网站选择哪种访问日志模式影响,也不会和全站访问频率混在一起计数。

常见封禁时间会从 10 分钟逐步增加到 1 小时、6 小时、24 小时,最长 7 天。管理员可以手工解封或设置永久封禁。

在托管网站上连续输错 WordPress 密码,可能暂时无法访问该网站,但不会连带阻止登录 WP Panel。确认是自己误触后,可等待到期或在防火墙页手工解封。

白名单和搜索引擎

网站与 SSH 白名单只应用于明确可信的来源。Googlebot、Bingbot 等搜索引擎需要通过官方 IP 信息验证,只有 User-Agent 名称不能证明身份。

修改 CDN 回源组会同时影响 Nginx 和 Fail2ban。配置检查失败时,面板会尝试恢复修改前的设置。

安全事件

安全报告会汇总敏感文件扫描、SQL 注入探测、可疑 PHP 请求、假搜索引擎、文件变化和访客 IP 信息异常。

HTTP 444 表示请求已经被规则拒绝。安全事件是排查线索,不代表每一条都需要再次永久封禁。

误封处理

  1. 在防火墙页查看 IP、封禁来源、时间和累计次数。
  2. 核对网站访问日志中的访客地址和实际连接来源。
  3. 确认 CDN 使用了正确的严格模式或兼容模式。
  4. 确认误封后执行解封,只有长期可信的来源才加入白名单。

敏感文件保护

面板会在网站服务层拦截一小部分高风险的敏感文件访问,例如 .env 配置文件和 .git 目录,避免网站凭据被直接读取。WordPress 和普通 PHP 网站都默认开启,并且不会误伤正常的业务页面。

WordPress 网站还额外开启了「探测限速」:当某个来源在短时间内频繁扫描并不存在的配置或程序文件时,会先被限速提示,持续异常再交给自动封禁处理。这个保护不会拦截后台、接口和正常的登录操作。

普通 PHP 网站默认不开启探测限速,以免误伤合法的接口、下载或安装页面。

WordPress SQL 注入请求防护

在“安全设置”中,可以分别开启高置信度 SQL 请求拦截和重复来源自动封禁,并设置独立阈值与统计窗口。命中高置信度 URL 结构的请求会在进入 PHP 前返回 403;较弱信号只作为安全证据记录。默认情况下,可信来源在 600 秒内累计 5 次后由独立规则临时封禁。

WordPress 首页只有 s 参数的纯搜索,以及文章或页面 REST 接口只有 search 参数的纯搜索会放行;同时带有其他参数时,不会因为含有搜索参数而整体豁免。该功能只检查 URL,不检查 POST 或 JSON 请求体,也不是完整 WAF。一次拦截只说明请求命中特征,不代表已经确认漏洞或入侵成功。

直连和严格可信代理/CDN 模式可以参与自动封禁;兼容代理模式仍会返回 403 并留证,但不会按请求头中的地址自动封禁。Cloudflare 官方 IP 段和真实 IP Header 由系统全局严格处理,无需在网站详情中选择 Cloudflare 组;网站级 CDN 配置用于其他 CDN、自定义可信段或兼容模式。

关闭拦截或自动封禁不会立即释放已有封禁,已有记录按原到期时间自然解除,也可在“安全防御”中手动解封。SQL 证据和处置集中在“安全防御”,不会发送面板、邮件或 Webhook 通知。

保存安全设置失败时

同一次保存涉及 SQL 注入防护、Fail2ban、限速或日志白名单时,面板会把数据库修改作为一个整体提交,并按顺序应用服务器配置。如果任一配置应用失败,面板会恢复保存前的设置并重新应用旧配置;即使恢复某个子系统失败,也会继续尝试其余子系统并汇总错误。

保存请求会串行执行,避免一个失败请求覆盖另一个已经成功保存的新值。看到失败提示后,不要假定部分新设置已经可靠生效,应按提示检查实际运行状态。

IPv4 与 IPv6 持久封禁

扫描防御、面板登录防护和管理员手动封禁会按地址类型写入独立的 IPv4、IPv6 Nftables 集合。当前封禁页会合并 Fail2ban、持久 Nftables 与 Nginx 黑名单的真实执行状态;数据库只补充原因、等级和时间。

如果 IPv4 或 IPv6 任一集合读取失败,页面仍会保留其他层已经确认的结果,并提示列表可能不完整。不能把读取失败理解为没有封禁。

需要通过 SSH 人工核验时,应分别检查两个地址族:

nft list set ip wppanel_persist banned_ips
nft list set ip6 wppanel_persist banned_ips

文件锁与代码完整性

只有已经开启文件锁且锁定状态健康的 WordPress 站点,面板才会在网站目录之外建立 SHA-256 比较基线,并约每小时检查 WordPress 核心、插件、主题、MU 插件、Drop-in、关键根目录文件,以及运行目录中的 PHP 文件。发现增删改时会留下证据并告警,但不会自动删除、隔离或恢复文件。

  • 第一次建立基线只是今后比较的起点,不表示站点当时已经安全。
  • 关闭文件锁后不再进行代码和组件监控;锁定期间已有变化转为历史,不再计入当前风险。
  • 暂停站点会保留旧基线但不扫描;重新启用后会比较暂停期间的变化,暂停不等于授权维护。
  • 第一版根据文件变化识别安装、删除和代码修改,不比较插件启用、停用或主题切换。

通过维护密码正确开启的维护窗口,或由面板受控的组件任务,在第一次回锁成功、权限验证和状态保存都成功时,只记录插件、主题、MU 插件或 Drop-in 的变化摘要并接受新基线,不发送安全通知。首次回锁失败、重启后恢复回锁、状态未知或变化发生在授权区间外时,不会静默接受变化,而会保留旧基线并按异常变化告警。

待人工处理的失败更新会暂时阻止完整性扫描,处理完成后才恢复。这段时间属于检测空窗,应优先处理失败任务。

完整性监控用于提醒和取证,不能替代恶意代码扫描,也不会替管理员自动处置。