1Panel + Cloudflare 服务器安全加固

1Panel + Cloudflare 服务器安全加固

阶段一:源站隐身、反测绘与网络隔离(核心)

1. 彻底排查源站 IP 泄露隐患

更换 DNS 记录无法抹去历史被动 DNS 和网络测绘平台(FOFA/Shodan)的记录。如果旧 IP 曾经直接暴露过,建议更换新 IP 或重置服务器。

  • 代理检查:确保 Cloudflare 中所有 A / AAAA / CNAME 记录的小黄云全部点亮(开启代理)。
  • 清理子域名:排查并删除未开启代理的 dev.、test.、ftp.、mail. 等子域名。
  • 禁止本地发信:千万不要在源站搭建邮件服务,也不要在 DNS 中配置指向源站 IP 的 MX 记录。邮件头与发信过程会直接泄露源站 IP。请使用第三方 API 发信服务(如 SendGrid、阿里云邮件推送)。

2. 部署 Cloudflare 源服务器证书

进入 Cloudflare 控制台 -> SSL/TLS -> 源服务器 -> 点击 创建证书(有效期选择 15 年),保存 PEM 证书和 KEY 私钥。

在 1Panel 的真实网站设置中部署该证书。

在 Cloudflare 的 SSL/TLS 设置中,将加密模式开启为 完全(严格) / Full (Strict)。

3. 设立默认站点,阻止 Host 碰撞与资产测绘(首选方案)

攻击者即使不知道源站域名,也可能通过批量修改 HTTP Host 请求头,判断某个 IP 是否承载目标网站。因此,服务器绝不能把真实业务站点作为未知域名或 IP 直连请求的默认响应。

在 1Panel 中创建一个独立的静态网站,并将其设置为默认站点。该站点只用于接收未知域名或直接 IP 请求:

方案 A:通过 OpenResty 配置文件直接断开连接(强烈推荐)

如果当前 1Panel/OpenResty 版本支持编辑主配置或站点配置,推荐让默认 HTTP/HTTPS 站点直接拒绝握手并静默断开:

# HTTP 默认站点:直接返回 444 断开连接
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

# HTTPS 默认站点:拒绝 TLS 握手并直接断开
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;

    # 兼容的 OpenResty/Nginx 版本可开启拒绝 TLS 握手
    ssl_reject_handshake on;

    return 444;
}

方案 B:返回基础错误码

如果版本受限,可以在默认静态站点中配置返回简单的 403 Forbidden 或 404 Not Found 页面,且不挂载任何真实业务证书(使用自签名证书即可)。

说明:不要尝试伪造 Cloudflare 1003 拦截页或冒充 sni.cloudflaressl.com 的证书。此类伪装很容易被测绘引擎的指纹识别穿透,还会干扰排障。真正的有效防御是静默拒绝连接(444)与严格的网络访问控制。

4. IPv6 专项处理与关闭 SOP

1Panel 的图形界面防火墙在部分版本中仅支持配置 IPv4 规则。如果服务器开启了公网 IPv6 却未做限制,攻击者可以通过 IPv6 绕过你的 IPv4 防火墙直连源站。请根据实际情况选择处置方式:

途径一:云服务器厂商控制台关闭(最彻底)

如果你不需要 IPv6 入站,直接登录阿里云、腾讯云、AWS 或 VPS 厂商控制台:

  • 在实例网卡或 VPC 网络设置中,直接解绑/关掉 IPv6 地址。
  • 或在云安全组(Security Group)中删除所有 IPv6(::/0)的入站放行规则。

途径二:在 1Panel 与 Linux 系统层彻底关闭 IPv6

如果云厂商没有提供快捷关闭选项,可在服务器内部通过以下步骤关闭:

  1. 1Panel 站点关闭监听:进入 1Panel 网站设置,在基本信息中取消勾选【监听 IPV6】并保存。
  2. 系统内核彻底禁用 IPv6:编辑系统内核文件:sudo nano /etc/sysctl.conf,在文件末尾添加以下配置:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

运行 sudo sysctl -p 使其立即生效。

  1. SSH 限制 IPv4:编辑 /etc/ssh/sshd_config,添加或修改 AddressFamily inet(仅允许 IPv4),然后重启 SSH(sudo systemctl restart sshd)。

5. 开启防火墙白名单(限制仅 Cloudflare 放行)

如果你选择使用公网 80/443 直连回源,必须在防火墙上限死来源 IP:

  1. 进入 1Panel 主机 -> 防火墙 -> 端口规则。
  2. 删除 原有 对 所有人 放行的 80 和 443 端口规则。
  3. 创建新的规则:端口 80,443,协议 TCP,策略 允许,来源点选 指定 IP,填入 Cloudflare 官方 IPv4 网段:
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
104.16.0.0/13
104.24.0.0/14
108.162.192.0/18
131.0.72.0/22
141.101.64.0/18
162.158.0.0/15
172.64.0.0/13
173.245.48.0/20
188.114.96.0/20
190.93.240.0/20
197.234.240.0/22
198.41.128.0/17

6. 可选方案:Cloudflare Tunnel(零入站暴露)

如果业务条件允许,可以使用 Cloudflare Tunnel (cloudflared) 代替"公网 80/443 + Cloudflare IP 白名单"的方案。

  • 运作原理:Tunnel 由服务器内部的 cloudflared 进程主动向 Cloudflare 节点建立出站长连接,源站完全不需要开放公网 80/443 端口。
  • 核心优势:源站无需直接接受任何公网入站连接,也不必手动维护 Cloudflare IP 地址段。
  • 注意事项:Tunnel 会增加一层运行依赖,应为 cloudflared 配置自动启动、进程守护、健康检查与故障告警。两种方案应根据业务稳定性要求选择,切勿在没有理解流量路径的情况下混合配置。

阶段二:边缘防御与真实 IP 恢复

1. Cloudflare 边缘 WAF 配置

  • 自动程序攻击模式 (Bot Fight Mode):前往 CF -> 安全性 -> 自动程序 开启,能拦截绝大多数低级扫描器和无头浏览器。
  • 按地区拦截/质询:若网站仅面向国内用户,在 CF WAF 中创建规则:(not ip.src.country in {"CN" "HK" "MO" "TW"}),执行操作选 托管质询 (Managed Challenge)。
  • 敏感路径防护:针对 /admin、/wp-admin、/login 等后台路径单独设置规则,强制触发 Managed Challenge 或绑定 Cloudflare Access。
  • 速率限制 (Rate Limiting):针对登录、注册、短信验证码和搜索接口配置频率限制,超过阈值触发质询或拦截。

2. 恢复真实客户端 IP (CF-Connecting-IP)

通过 Cloudflare 代理后,源站 TCP 连接的来源地址通常是 Cloudflare 节点 IP。如果 OpenResty 没有正确恢复访客 IP,日志记录、应用限速以及 Fail2ban 封禁功能可能会把 Cloudflare 节点误认为真实用户。

OpenResty 应信任 Cloudflare 官方地址段,并从 CF-Connecting-IP 标头提取真实客户端地址。在全局配置或站点配置中添加:

⚠️ 安全前提:部分 1Panel/OpenResty 版本已内置相关配置,请先检查避免重复。只有在源站已严格限制为仅 Cloudflare 地址可访问时,才能信任该请求头;否则攻击者可以直接连接源站并伪造 CF-Connecting-IP 标头绕过鉴权。

# 从 CF-Connecting-IP 获取真实访客 IP
real_ip_header CF-Connecting-IP;
real_ip_recursive on;

# 信任 Cloudflare IPv4 地址段
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;

# 信任 Cloudflare IPv6 地址段(如启用 IPv6)
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

阶段三:面板自身与系统加固

1. 修改面板入口与安全认证

在 1Panel 面板设置 中,将默认端口改为高位随机端口(如 38492),并设置复杂安全入口(如 /entry_my_secret_99)。

强制开启两步验证 (2FA):绑定 Google Authenticator 或其他动态口令工具。

2. 系统 SSH 加固(双终端验证 SOP)

  1. 修改默认 22 端口为高位端口(如 22022)。注意:先在防火墙放行新端口!
  2. 生成并配置 SSH 密钥登录,修改 /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
  1. 执行语法检查与重启:
sudo sshd -t && sudo systemctl restart sshd

双终端验证规则:不要关闭当前终端,另外打开一个新的终端测试新端口和密钥能否正常登录。确认无误后再退出原会话。


阶段四:Docker 与应用层防穿透

1. 警惕 Docker 防火墙穿透陷阱

陷阱原理:1Panel 基于 Docker 运行应用。Docker 默认会接管 iptables 中的 PREROUTING 链。如果你安装 MySQL、Redis 时映射了宿主机端口(-p 3306:3306),哪怕你在 1Panel 或 UFW 防火墙里没有放行该端口,公网依然能直接访问该数据库!

防范操作:

  • 数据库等内部应用绝不勾选【端口外部访问】。容器间通过 Docker 内部网络通信。
  • 如必须在宿主机访问,端口绑定显式指定回环地址(如 127.0.0.1:3306:3306)。

2. 网站应用安全

  • 开启 OpenResty WAF:在 1Panel 网站设置中开启内置 WAF,拦截 SQL 注入与 XSS 攻击。
  • 文件权限与函数禁用:严禁将任何网站目录设置为 777 权限。在 PHP 配置中禁用危险函数(如 exec, system, shell_exec, passthru)。

阶段五:灾备、审计与恢复

  • 异地定时自动备份:在 1Panel 绑定第三方 S3 兼容对象存储(阿里云 OSS、腾讯云 COS、Cloudflare R2 等)。
  • 创建计划任务:每日自动备份网站文件、数据库(使用逻辑导出)与 1Panel 配置到云端,保留 7~14 份。
  • 为存储桶开启版本控制和防删保留策略。
  • 定期恢复演练:每半年在空白虚拟机或廉价 VPS 上,演练一次从云端备份完整恢复业务的全流程。
  • 保持系统更新:定期更新 1Panel 主程序、OpenResty 及操作系统安全补丁。

防御全景检查清单 (Checklist)

  • [ ] 源站 IP 干净,DNS 未泄露真实 IP(无直接 MX 记录,无废弃子域名)。
  • [ ] 域名已接入 Cloudflare,小黄云全开,开启 Full (Strict) SSL 模式。
  • [ ] 1Panel 已设置默认站点,未知 Host/直接 IP 请求返回 444 或拒绝 TLS 握手。
  • [ ] 已处理 IPv6(在云控制台关闭、或在 1Panel 取消监听 IPv6 并通过内核禁用)。
  • [ ] 1Panel 防火墙 80/443 端口已限制仅放行 Cloudflare 官方 IPv4 段(或使用了 Cloudflare Tunnel)。
  • [ ] 本地网络直连服务器 IP 显示超时或拒绝连接。
  • [ ] OpenResty 已正确配置 CF-Connecting-IP 恢复访客真实 IP。
  • [ ] CF WAF、Bot 防护和速率限制已开启。
  • [ ] 1Panel 面板已修改默认端口、随机安全入口,并开启 2FA 双重认证。
  • [ ] SSH 已修改高位端口、禁用密码登录、禁用 root 直连,且已进行双终端验证。
  • [ ] 内部数据库 (3306/6379) 端口外部访问已关闭/仅监听 127.0.0.1(防止 Docker 防火墙穿透)。
  • [ ] 每日定时将数据和数据库备份到了异地对象存储,且包含恢复演练计划。
上一篇 【保姆级】VPS 拿到手后必做的初始化配置脚本v2
下一篇 Stripe 据传将以超 70 亿美元收购 AI 网关初创公司 OpenRouter
目录