仅允许CloudFlare的IP段访问80 443端口脚本 彻底防止源站泄露
如何彻底防止源站IP泄露(Nginx+防火墙方案)
问题背景
- 即使Nginx设置了80/443端口返回444,用
http://ip:443
访问仍会暴露Nginx的400错误页 - 这会泄露服务器在线状态和使用Nginx的信息
终极解决方案
防火墙白名单模式:只允许Cloudflare的IP段访问80/443端口
零中断更新脚本(适合宝塔/手动用户)
#!/bin/bash
# 功能:安全更新Cloudflare IP白名单(不影响其他端口规则)
# 1. 获取最新CF IP列表
cf_v4=$(curl -s https://www.cloudflare.com/ips-v4)
cf_v6=$(curl -s https://www.cloudflare.com/ips-v6)
# 2. 给新规则打标记(避免误删)
marker="cf-$(date +%s)"
# 3. 先添加新规则(IPv4+IPv6)
for ip in $cf_v4 $cf_v6; do
ufw allow proto tcp from $ip to any port 80 comment $marker
ufw allow proto tcp from $ip to any port 443 comment $marker
done
# 4. 等待新规则生效
sleep 2
# 5. 删除旧规则(保留刚添加的)
ufw status numbered | grep -E '80\/tcp|443\/tcp' | grep -v "$marker" \
| awk -F'[][]' '{print $2}' | sort -rn | xargs -I{} ufw --force delete {}
# 6. 设置默认拒绝(如果尚未设置)
ufw status | grep -q "DENY.*80" || ufw deny 80/tcp
ufw status | grep -q "DENY.*443" || ufw deny 443/tcp
echo "✅ 安全更新完成!80/443端口仅允许Cloudflare访问"
使用建议
- 宝塔用户:放入「计划任务」每周自动更新
- 手动用户:保存为
/usr/local/bin/cf-firewall
后chmod +x
常见问题解答
Q1:为什么不用CF隧道?
- ✔️ 优点:完全隐藏源站
- ❌ 缺点:部分地区会阻断(特别是国内)
Q2:为什么不能固定回源IP?
因为Cloudflare实际回源IP ≠ 网站解析IP,必须放行全部CF IP段
Q3:WARP代理能绕过吗?
不能!因为:
- WARP使用的IP不在CF官方公布的IP段中
- 防火墙会直接拦截非白名单IP
Q4:终极防御方案?
graph LR
A[用户] -->|只允许CF IP| B[反代服务器]
B -->|专用IP白名单| C[源站]
C -->|IPv6回源| B
- 反代机做WAF+CF接入
- 源站仅允许反代机IP访问
- 可用IPv6回源增加隐蔽性
总结
当前方案已能防御:
- 直接扫描源站IP
- Nginx版本泄露
- WARP代理探测
- 非CF官方IP的访问
如果还被穿透,建议:
- 上Tengine混淆指纹
- 启用IPv6专属回源通道
- 反代机+严格白名单组合
经实测和官方文档验证,这是目前最可靠的方案之一。除非攻击者能破解Cloudflare的IP体系,否则你的源站就是安全的!