使用 Cloudflare 保护您的网站,无需将端口暴露在互联网上

0 股票
0
0
0
0

介绍

您好,欢迎观看本教程,了解如何使用 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.crtcf.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 端的防护。.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

您可能也喜欢