🔥 Ubuntu 源站隐藏:只允许 Cloudflare 回源,禁止 IP 直连

很多人把站挂在 Cloudflare 后,以为已经“隐藏源站”了。
但如果你的服务器 80/443 仍对公网开放,攻击者依然可以绕过 Cloudflare 直打源站 IP。
这篇是可直接落地的 Ubuntu 方案:仅允许 Cloudflare IP 访问 80/443,其余全部拒绝。
目标
只允许 Cloudflare 回源访问 Web 端口(80/443)
禁止通过服务器公网 IP 直接访问站点
降低绕过 Cloudflare 的攻击面(含常见 DDoS 直打)
原理
理想链路:
Client -> Cloudflare -> Origin
防护后的效果:
Attacker -> Origin IP 会被防火墙拒绝。
Step 1:安装 UFW
sudo apt update sudo apt install ufw -y
Step 2:设置默认策略(先封后放)
sudo ufw default deny incoming sudo ufw default allow outgoing
• deny incoming:默认拒绝所有进入连接
• allow outgoing:允许服务器访问外网
Step 3:先放行 SSH(避免锁死)
sudo ufw allow 22/tcp
先确认你实际 SSH 端口,不一定是 22。
如果你用的是自定义端口,比如 2222:
sudo ufw allow 2222/tcp
Step 4:仅放行 Cloudflare 到 80/443
IPv4
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do sudo ufw allow from $ip to any port 80 proto tcp sudo ufw allow from $ip to any port 443 proto tcp done
IPv6
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do sudo ufw allow from $ip to any port 80 proto tcp sudo ufw allow from $ip to any port 443 proto tcp done
自动导入 Cloudflare 官方 IP
Step 5:关闭 firewalld防止与 UFW冲突(如存在)
某些环境装过 firewalld,会和 UFW 规则管理冲突:
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl mask firewalld
如果提示服务不存在,可以忽略
Step 6:启用防火墙
sudo ufw enable
Step 7:检查规则
sudo ufw status numbered
应看到:
SSH 端口放行
Cloudflare 网段到 80/443 的规则
不应出现:
80 ALLOW Anywhere
443 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Step 8:删除错误“全网放行”规则(如有)
sudo ufw status numbered sudo ufw delete <编号>
删除后编号会变化,建议删一条查一次。
Step 9:验证结果
测试 IP 直连(应失败)
curl -I http://<服务器IP> curl -I https://<服务器IP>
预期:超时、拒绝连接、握手失败等(总之不能返回正常站点内容)。
测试域名访问(应正常)
https://<你的域名>
预期:访问正常。
常见坑位
忘记先放行 SSH:高概率把自己锁在门外。
DNS 记录是灰云:流量没走 Cloudflare,等于白做。
只配 IPv4,不配 IPv6:攻击者可以走 IPv6 直连。
遗留 80/443 allow anywhere 规则:直接破功。
Cloudflare IP 变更未同步:建议定期更新规则(可做定时任务)。
结论
这套策略的核心是:源站不直接对公网提供 Web 服务,只对 Cloudflare 开门。 配置正确后,攻击者拿到源站 IP 也难以直接访问你的站点。
声明: 本文为学习实践记录,部分内容由 AI 生成后经人工整理与核对。由于本人经验有限,难免存在错误或表述不严谨之处,欢迎在评论区指正补充,共同进步。
