介绍
您好,欢迎观看本教程,了解如何使用 Cloudflare 保护您的网站。本教程将讲解如何在服务器上托管网站,如何使用 Cloudflare 出色的免费 L7 防护功能来保护网站安全,以及如何锁定服务器端口,防止攻击者绕过 Cloudflare 直接攻击服务器。.
关于 Cloudflare
在开始之前,先简单介绍一下 Cloudflare 及其功能:
- Cloudflare是全球最大的安全网络之一。如今,企业、非营利组织、博主以及所有拥有互联网业务的用户都拥有速度更快、更安全的网站和应用程序。它们能够抵御DDoS攻击,其后端服务器也受到保护,免受攻击者的侵害。Cloudflare还提供一系列安全服务,保护网站免受SQL注入、XSS和DDoS攻击等攻击。.
- Cloudflare 为数百万个网站提供互联网请求支持,平均每秒处理 5500 万个 HTTP 请求。.
- Cloudflare 在网络安全和性能方面取得了诸多改进。对于网站所有者来说,它是一款强大的工具,可以帮助他们保护网站免受攻击并提升网站性能。最棒的是,它是免费使用的。.
- 随着流量增加,您可以随时升级到付费套餐,以获得更多功能和更好的性能。.
先决条件
- 域名
- 一个添加了域名的 Cloudflare 帐户
- 运行 Debian 12 的服务器
- 一个用于保护的网站
步骤 1 – 更新服务器并安装 NGINX
首先,我们需要更新服务器,然后我们需要添加 NGINX 存储库并安装 NGINX。.
apt update && apt upgrade -y
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y
# Add the signing key for the nginx packages
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# Add the NGINX repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# Pin down the NGINX repository to avoid conflicts with the default Debian repository
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
apt update
# Install NGINX
apt install nginx -y步骤 2 – 网站设置和配置
配置 NGINX 来提供网站服务超出了本教程的范围,但本教程将使用默认设置,并使用 Cloudflare 保护服务器安全。.
您必须持有原产地证书。 Cloudflare 创建并列出它 /etc/nginx/ssl, 那是 cf.crt 和 cf.key 放上去。.
您可以通过在 Cloudflare 控制面板中选择您的域名并转到 SSL/TLS » 源服务器 » 创建证书来创建源证书。.
您可以根据网站的需求调整以下配置(例如 /etc/nginx/sites-available/default)。.
server {
listen 443 ssl;
server_name <example.com>;
access_log /var/log/nginx/host.access.log main;
ssl_certificate /etc/nginx/ssl/cf.crt;
ssl_certificate_key /etc/nginx/ssl/cf.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}步骤 2.1 – 重新加载 NGINX
此时,我们重新加载 NGINX 以应用更改并将域名指向该服务器。.
systemctl reload nginx
NGINX 重启后,您可以通过在 Cloudflare 控制面板中添加 A 记录将域名指向该服务器。请确保代理状态设置为“已代理”以启用 Cloudflare 的 L7 层保护,否则服务器将暴露在互联网上。.
步骤 3 – 已完成 60%
我们已经完成了60%。网站现在受到Cloudflare L7级别的保护,但服务器仍然暴露在互联网上,攻击者可以绕过Cloudflare直接攻击服务器。.
接下来,我们将锁定服务器端口,只允许 Cloudflare IP 地址范围访问服务器。.
我们可以使用 iptables 来实现这一点,但我们将更进一步,使用 Hetzner 云防火墙来锁定服务器端口。.
步骤 4 – 设置 Hetzner 云防火墙
在此步骤中,我们将设置 Hetzner 云防火墙来锁定服务器端口,并仅允许 Cloudflare IP 范围访问服务器。.
您可以通过 Hetzner Cloud 控制台完成此操作,方法是选择您的项目并单击“防火墙”选项卡。但是,Cloudflare 的 IP 地址范围是动态的,并且会随时间变化。因此,我们将使用 Hetzner Cloud API 来自动执行此过程。.
首先,您需要在 Hetzner 云控制台中执行以下几项操作:
- 前往«安全»»«API令牌»,然后点击«生成API令牌»来生成API令牌。请确保授予其读取和写入权限。.
- 记下防火墙 ID。您可以在防火墙页面的 URL 中找到它:
- 请确保服务器上已启用防火墙,否则防火墙将无法正常工作。.
返回服务器后,将以下脚本保存到一个文件中,例如 firewall.py。此脚本会将 Cloudflare IP 地址范围添加到 Hetzner 云防火墙的白名单中。.
注意:以下脚本会覆盖您已指定的任何现有防火墙规则,因此请确保您的防火墙不包含任何其他重要规则。如果有,您可能需要将其添加到脚本中,例如打开 SSH 端口。.
import requests
import json
HETZNER_API_TOKEN = "YOUR_HETZNER_API_TOKEN"
HETZNER_FIREWALL_ID = "YOUR_HETZNER_FIREWALL_ID"
def get_cloudflare_ips():
response = requests.get('https://www.cloudflare.com/ips-v4')
if response.status_code == 200:
return response.text.strip().split('\n')
else:
print("Failed to retrieve Cloudflare IP ranges")
return []
def whitelist_ips_in_hetzner(ip_ranges):
headers = {
'Authorization': f'Bearer {HETZNER_API_TOKEN}',
'Content-Type': 'application/json',
}
payload = {
"rules": [
{
"direction": "in",
"source_ips": ip_ranges,
"port": "443",
"protocol": "tcp",
"description": "Accept port 443"
},
#{
# "direction": "in",
# "source_ips": ["0.0.0.0/0","::/0"],
# "port": "22",
# "protocol": "tcp",
# "description": "Accept SSH connections"
#}
]
}
response = requests.post(f'https://api.hetzner.cloud/v1/firewalls/{HETZNER_FIREWALL_ID}/actions/set_rules', headers=headers, data=json.dumps(payload))
if 200 <= response.status_code < 203:
print("IPs whitelisted successfully in Hetzner Firewall")
else:
print("Failed to whitelist IPs in Hetzner Firewall", response.json())
if __name__ == "__main__":
cloudflare_ips = get_cloudflare_ips()
whitelist_ips_in_hetzner(cloudflare_ips)步骤 5 – 运行并自动化脚本
- 安装 Python
要运行此脚本,您需要在服务器上安装 Python。如果您尚未安装 Python,可以通过运行以下命令进行安装:
apt install python3 -y
- 运行脚本。
安装好 Python 后,您可以使用以下命令运行脚本:
python3 firewall.py
您应该等待类似“IP地址已成功添加到Hetzner防火墙白名单”的输出。否则,您可以查看错误消息并进行故障排除。.
- 自动化
脚本成功运行后,您可以将其添加到 cron 作业中以实现自动化,以便脚本每 24 小时运行一次,并使用 Cloudflare IP 范围更新 Hetzner 云防火墙。.
您可以通过运行 crontab -e 并将以下行添加到文件中来添加 cron 作业。.
* 0 * * * /usr/bin/python3 /path/to/firewall.py
步骤 6 – 加强 Cloudflare 方面的保护
登录您的 Cloudflare 控制面板。.
- 转到“SSL/TLS”选项卡
为确保网站始终通过 HTTPS 提供服务,并确保 Cloudflare 与服务器之间的通信经过加密且安全:
- 启用«始终使用 HTTPS» - 启用«HTTPS 自动重写» - 将 SSL/TLS 加密模式设置为«完全(强)»。.
转到“安全”选项卡
为确保网站免受机器人、盗链和其他攻击:
- 启用“浏览器完整性检查”——启用“防盗链保护”——启用“反机器人模式”
请注意,这并非一劳永逸的解决方案,您应该始终关注您的 Cloudflare 控制面板,并根据您网站的需求更改设置。.
- 您还可以启用«速率限制»来进一步保护您的网站免受攻击,幸运的是,Cloudflare 为此功能提供免费套餐(包括一条规则)。.
- 您还可以使用 Cloudflare 的缓存功能来缓存静态网站内容,从而降低服务器负载。.
再次提醒,您应该监控流量并根据网站的需求更改设置。.
还有这个脚本:https://github.com/guided-hacking/cfautouam
你可以使用此脚本在服务器 CPU 或内存使用率过高时自动将 Cloudflare 切换到“攻击模式”。这有助于保护服务器免受攻击,但这超出了本教程的范围。.
结果
在本教程中,您学习了如何使用 Cloudflare 的 L7 防护来保护网站,在不将端口暴露于互联网的情况下保护服务器和网站免受攻击。您还学习了如何使用 Cloudflare 的 IP 地址范围自动更新 Hetzner 的云防火墙,从而加强 Cloudflare 端的防护。.










