WardPane 2.0 的功能
WardPane 2.0 可托管静态、PHP 和 Node.js 网站,自动签发证书并支持 Cloudflare。防护和流量控制按网站在 Web 服务器内部运行。在对比页面的八款面板中,大多数要靠 ModSecurity 或付费附加组件才能实现这些功能。
面向新手,也面向经验丰富的管理员
新手可以获得一条命令完成安装、自动签发的证书、在沙箱中运行的网站,以及用通俗语言解释的设置。经验丰富的管理员可以获得所有选项、浏览器中的终端、每个所有者一个 PM2、.htaccess、按已知顺序执行的按网站规则、Cloudflare API、导出与导入、发布包校验和以及源代码。
托管
网站采用与 ISPmanager 类似的目录结构,归一个 Linux 用户所有,由 WardPane 本身在 80 和 443 端口上提供服务。
- 网站与别名
- 一个网站由一个域名加最多 99 个别名组成(一张 Let's Encrypt 证书最多包含 100 个名称)。别名可以提供主网站的内容,如果它有自己的文件夹,则提供该文件夹的内容。网站可以设置显示名称。
- 所有者目录结构
- 文件位于 /var/www/<owner>/data/www/<domain>,日志和临时文件在其旁边。默认所有者是 www-root,这是 WardPane 创建的一个 Linux 用户。来自 1.x 的网站保留原来的文件夹。
- 三种处理程序
- 无处理程序(静态托管)、PHP 或 Node.js,按网站选择,可随时切换。其他处理程序的设置会被保留,切换回来时会恢复。
- 静态文件
- SPA 模式(未知路径交给 index.html)、自定义 404.html、支持断点续传的强 ETag、HTTP 到 HTTPS 的重定向,以及永远无法离开网站文件夹的符号链接。
- 运行时
- 面板列出服务器上已安装的 PHP 版本,以及它支持的 Node.js 主版本:20、22、24 和 26,默认为 24(20 已于 2026 年 4 月停止支持)。Node.js 构建来自 nodejs.org,并会对照公布的 SHA256 校验和进行校验。
- 每个网站都有菜单
- 网站列表的每一行都有一个菜单,包含该网站的所有操作;还有一个开关,可以停用网站并重新启用,不会删除任何内容。
- 浏览器中的 shell
- 终端就在面板中:在 root 会话中是 root shell,否则是网站所有者在网站文件夹中的 shell。对于 Node.js 网站,可以在其中使用 pm2 list 和 pm2 restart。
- 导出与导入
- 每个网站及其所有设置,加上全局黑名单,都会写入一个 JSON 文件。导入时可以合并或替换,会先检查整个文件,并且绝不触碰 /var/www 中的文件。
PHP 与 Node.js
每个动态网站都以独立的 Linux 用户身份在 systemd 沙箱中运行。出故障或被入侵的网站无法读取相邻网站的内容。
- 每个网站一个 php-fpm 池
- 没有共享的池,也没有共享的 opcache 或会话。代码对 PHP 是只读的;它只能写入 tmp/、logs/、data/ 以及您列出的文件夹,而且 PHP 永远不会在这些文件夹中执行。
- 严格的 PHP 沙箱
- 除 php-fpm 本身外,整个文件系统都是只读且 noexec 的;设置了 open_basedir;禁用了 exec、system、shell_exec、proc_open、popen 和 putenv;系统调用也经过过滤。
- 无需 Apache 的 .htaccess
- 真实网站中的重写规则、重定向、访问规则、Basic auth、响应头和缓存设置都能原样生效:WordPress、Laravel 以及常见的 HTTPS 和 www 重定向。无法应用的行会被显示出来,绝不靠猜测处理。
- 带 PM2 的 Node.js
- 选择 Node.js 主版本、npm 脚本或入口文件、环境变量和限制。每个所有者一个 PM2 守护进程负责运行应用,因此 pm2 可以在所有者的 shell 中使用。
- 应用前面的代理
- 如有需要,public/ 中的文件会被直接提供,其余请求转给应用,并在 X-Forwarded-For 和 X-Real-IP 中携带真实访客 IP。WebSocket 同样要先通过相同的防护检查。
- 重启、npm install 和日志
- “处理程序”选项卡提供重启和 npm install(存在 lockfile 时使用 npm ci)按钮,输出、错误和安装日志,以及可从中选择的 package.json 脚本。
证书与 Cloudflare
证书的签发和续期无需手动操作,位于 Cloudflare 之后的网站也一样。
- Let's Encrypt,全自动
- 每个网站一张证书,包含其所有别名,在有效期剩余三分之一时续期。DNS 未指向服务器的名称会被跳过,并在指向正确后加入,面板会显示原因。
- 同样检查 IPv6
- Let's Encrypt 会优先尝试 IPv6,因此每条 AAAA 记录都必须指向服务器。WardPane 会在申请证书前检查这些记录。
- 为 IP 签发证书
- 服务器 IP 会获得一张短期证书,每隔几天续期一次。位于 https://<ip>:1500 的面板打开时不会出现警告。
- Let's Encrypt 速率限制
- 面板不会重复申请证书,会一次性报告一个订单中所有失败的名称,每次失败后等待更长时间,并替换已停用的 ACME 账户。
- 一键获取 Cloudflare 令牌
- “创建 Cloudflare 令牌”按钮会打开 Cloudflare,并预先填好所需的权限。把令牌粘贴回面板后,面板即可检查并修复您网站的区域配置。
防护
每个网站都有自己的检查,它们在 PHP 或 Node.js 看到请求之前于 Web 服务器内部运行。只有明确的攻击才会导致地址被封禁。
- 速率限制与封禁
- 默认情况下,每个地址 10 秒内最多可发送 150 个请求。超过限制后返回 404,并按您设定的分钟数封禁。IPv6 访客按其 /64 计数和封禁,因此更换地址无济于事。每个网站都有允许列表。
- Bot Fight
- 拦截 AI 爬虫、SEO 爬虫、漏洞扫描器、脚本和无头浏览器、空 User-Agent 以及您自己的列表。搜索引擎和链接预览仅在您选择时拦截。监控服务和 RSS 阅读器不受影响。
- 探测与恶意载荷
- 请求 /.env、/.git、/wp-login.php 等网站上并不存在的类似名称,会导致该地址被封禁。URL 中明确的 SQL 注入、XSS、路径遍历和 Log4Shell 载荷会触发封禁;含义不明确的只会拒绝该请求。
- 扫描检测
- 连续多次未命中(默认 60 秒内 25 次)看起来像 gobuster 或 ffuf,会导致该地址被封禁。缺失的图片只算十分之一次未命中,因此一个图片损坏的旧页面不会被当作扫描。
- 经过验证的爬虫
- Google、Bing、DuckDuckGo、Apple、OpenAI、Anthropic、Perplexity 和 Ahrefs 会公布其 IP 范围。WardPane 每天下载这些范围,并封禁从其他地址冒充它们的任何人。即使这些爬虫伪装成浏览器的 User-Agent,您也可以按 IP 拦截它们。
- 公共 IP 源
- Spamhaus DROP、FireHOL level 1 和 blocklist.de,每天更新,一个开关即可按网站启用。
- 支持分组的地域规则
- 逐个或按分组允许或拒绝国家:前苏联、独联体、欧亚经济联盟、欧盟、欧洲经济区、申根区、北约、七国集团、二十国集团、经合组织、金砖国家、上合组织、东盟、阿拉伯国家联盟、南方共同市场、各大洲等。可以添加例外,并查看最终的国家列表。
- 托管网络与 AS 编号
- 拦截来自 AWS、Azure、Google Cloud、Hetzner、OVH、DigitalOcean、Vultr 等云平台的请求(大多数自动化流量都来自这些平台),或来自您列出的任意 AS 编号的请求。
- 语言过滤
- 按浏览器语言允许或拒绝,对完全不发送语言信息的请求有单独的开关。这是国家之外一个有用的补充信号,例如在访客使用 VPN 时。
- 设备
- 只允许 Windows、macOS、Linux、Android、iOS 或其他系统访问,作为针对普通浏览器的过滤器。
- 仅限链接
- 必需的 URL 参数:网站只对通过您的链接来访的人开放,例如来自广告的 ?ref=metaads。已签名的 Cookie 以及可选的访客 IP 会让他们持续保持访问。用于 webhook 和支付回调的路径保持开放。
- 密码
- 用于草稿和网站测试副本的 HTTP Basic 登录。密码以 scrypt 哈希存储,并在主线程之外、所有其他过滤器之后进行校验。
- 防盗链
- 其他网站无法嵌入您的图片和文件。可以选择扩展名、允许的网站(支持通配符),以及如何处理不带 Referer 的请求。
- 安全响应头
- 按网站设置 X-Frame-Options、Referrer-Policy、带 includeSubDomains 和 preload 的 HSTS、Content-Security-Policy 和 Permissions-Policy。
- 蜜罐
- 一个被 robots.txt 禁止的路径。正常人不会打开它,因此请求它的一方会被立即封禁。
- 自定义拦截页面
- 为设备、机器人、地域和仅限链接拦截设置您自己的页面和状态码(404、403 或 200),并以 no-store 方式返回。
- 全局黑名单
- 在所有网站上拦截的地址和网络,存储在磁盘上,重启后依然保留。即使某个网站关闭了防护,它也同样生效。
流量控制
决定谁能访问每个网站、规则按什么顺序生效,以及被拦截的访客会看到什么。
每个请求的检查顺序
- Cloudflare:真实访客 IP、仅允许经由 Cloudflare 访问
- 全局黑名单,然后是网站允许列表
- 速率限制与当前封禁
- Bot Fight:User-Agent、经过验证的爬虫、IP 源、探测、恶意载荷、扫描、蜜罐
- 地域:国家与分组、托管网络、AS 编号、浏览器语言
- 设备
- 安全响应头与防盗链
- 仅限链接
- 密码
- .htaccess 规则,然后是处理程序:文件、PHP 或 Node.js
- 感知 Cloudflare 的真实 IP
- 只有当连接确实来自 Cloudflare 时,访客地址才从 CF-Connecting-IP 中获取。网络列表每天从 cloudflare.com 更新。
- 仅允许经由 Cloudflare 访问
- 直接访问服务器 IP 的请求会得到 404,因此谁都无法绕过 CDN 及其规则。
- 开关关闭时
- 位于 Cloudflare 之后但未作此标记的网站,绝不会封禁 Cloudflare 地址,并且每台 Cloudflare 服务器的限额提高到十倍。日志会给出修复建议。
- Cloudflare Workers
- 来自 Worker 的请求按其区域计数,适用正常的限额和封禁;您自己区域的 Worker 被视为 Cloudflare。
- 拦截页面的状态码
- 用 404 让地址看起来是空的,用 403 表明请求被拒绝,或用 200 显示您自己的页面。被限速和被封禁的客户端始终只会得到一个纯 404。
- 缓存安全的响应
- 依赖链接通行凭证的响应会带上 Cache-Control: private 和 Vary: Cookie,因此 CDN 绝不会把它们交给没有链接的人。
面板安全
面板以无特权用户 wardpane 的身份运行,其登录页面有自己的暴力破解限制。
- root 登录
- 可选择使用服务器的 root 密码以 root 身份登录。密码由 unix_chkpwd 通过一个小型 root 辅助程序进行校验,该辅助程序的套接字只有面板能打开。默认关闭。
- 暴力破解限制
- 失败 5 次会将一个地址(IPv6 为其 /64)封锁 15 分钟,失败 50 次会封锁其 /48。如果大量地址接连登录失败,面板会对未知地址关闭登录 5 分钟。过去 30 天内成功登录过的地址可以继续使用。
- IP 允许列表
- 设置 PANEL_ALLOW_IPS 后,面板完全不响应其他地址。如果某个列表会把您当前使用的地址锁在外面,面板会拒绝该列表。
- root 辅助程序隔离
- 面板只写入期望的状态;由 systemd 启动的 root 辅助程序在创建用户、文件夹和单元之前会再次检查每个值。
- 沙箱化的 PHP 与 Node.js
- 按网站划分的 Linux 用户、只读系统、私有 /tmp、禁止获取新权限、内存和 CPU 限制,以及可选的禁止出站连接。
- 发布包校验和
- 每个压缩包都随附其 SHA-256 校验和一同发布,并包含完整源代码。安装程序通过 HTTPS 下载压缩包,并在运行任何内容之前校验 SHA-256。
- 可撤销的更新
- 每次更新都会创建一个带恢复脚本的备份,检查新版本能否启动,如果不能则自动回滚。
- 恢复访问
- 如果把自己锁在了外面,在服务器上运行一条命令即可重置面板登录和 IP 允许列表,并解除登录封锁。
在一台闲置服务器上试试
在全新的 Ubuntu 24.04 上安装只需几分钟。