前言
对于一些较为庞大的服务,尝试采用了传统的 Nginx 反向代理结合 Cloudflare CDN 的方式来访问。得益于 Cloudflare 提供的源服务器证书,部署完全的 HTTPS 变的简单,无需配置 CertBot 或 acme.sh,Cloudflare 也会自动颁发、部署和更新边缘证书。

SSH 安全
SSH 是访问我们服务器的大门,可以有两种方式来保护对它的访问:
- 关闭 SSH 端口,使用 Cloudflare Tunnel 进行 SSH 访问
- 开启 SSH 端口,进行 SSH 相关的加固
对于第 1 种方式,无疑是最安全的,但是 SSH 质量会受到 Cloudflare 相关服务运行状态的影响:如 Cloudflare Tunnel 服务降级、服务器上的 cloudflared 进程 panic 🥹 等等。
第 2 种方式则是常规的 SSH 加固:
- 更改 SSH 默认端口
- 禁止空密码登录
- 禁止 root 用户登录
- 使用公/私钥访问 SSH(使用硬件安全密钥更佳)3
- 配置 Fail2ban
配置 UFW
一般情况下,除了 SSH 端口,我们仅开放 HTTP (80) 和 HTTPS (443),先在服务器商的云网络管理后台禁止其他端口的流量,然后配置 IP 访问策略。
UFW 是简化配置 Linux 系统底层防火墙的前端工具,它非常易于使用,在 Ubuntu 中它是默认安装的,对于 Debian 系统我们需要手动安装
| 代码块 |
|---|
|
sudo apt update && sudo apt install ufw -y |
第一步当然是放行 SSH 端口(将 9912 改为实际 SSH 端口)
| 代码块 |
|---|
|
sudo ufw allow 9912/tcp |
第二步,拒绝所有入站流量
| 代码块 |
|---|
|
sudo ufw default deny incoming |
第三步,80 和 443 端口仅允许被 Cloudflare IP 访问,手动输入太麻烦,创建一个脚本
| 代码块 |
|---|
|
touch ufw-only-cf.sh
#编辑脚本
vim ufw-only-cf.sh |
写入一下内容保存
| 代码块 |
|---|
|
#!/bin/bash
for ipv4 in `curl -s https://www.cloudflare.com/ips-v4 | tee ips-v4`
do
sudo ufw allow from $ipv4 to any port 80
sudo ufw allow from $ipv4 to any port 443
done
for ipv6 in `curl -s https://www.cloudflare.com/ips-v6 | tee ips-v6`
do
sudo ufw allow from $ipv6 to any port 80
sudo ufw allow from $ipv6 to any port 443
done |
执行脚本
| 代码块 |
|---|
|
sudo chmod +x ufw-only-cf.sh && ./ufw-only-cf.sh
#启用 UFW
sudo ufw enable
#重载 UFW 规则
sudo ufw reload |
配置 Nginx
为了让我们的服务透过 Cloudflare CDN 仍然能够获得访客的真实 IP,需要配置一下 Nginx,先备份默认配置文件
| 代码块 |
|---|
|
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
#编辑 Nginx 默认配置文件
sudo vim /etc/nginx/nginx.conf |
找到下面这部分
http {
...
}
加入下面内容
| 代码块 |
|---|
|
# modified
# https://www.cloudflare.com/ips-v4
set_real_ip_from 173.245.48.0/20;
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 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
# https://www.cloudflare.com/ips-v6
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;
# CF-Connecting-IP is recommend
# real_ip_header X-Forwarded-For;
real_ip_header CF-Connecting-IP; |
检查一下 Nginx 配置
| 代码块 |
|---|
|
sudo nginx -t
sudo systemctl reload nginx |
源服务器证书
在 Cloudflare 上生成对应的源服务器 SSL 证书,有效期最长 15 年,这个证书只被 Cloudflare 自身信任

然后将它安装到服务器上的 Web Server,以 Nginx 反代 Plausible 服务为例
| 代码块 |
|---|
|
cd /etc/nginx
sudo mkdir cert && cd $_
#创建上面域名为 stats.dejavu.moe 的源服务器证书
sudo touch stats.dejavu.moe.pem stats.dejavu.moe.key
#分别编辑公钥和私钥文件,将源服务器证书写进去保存
sudo vim stats.dejavu.moe.pem
sudo vim stats.dejavu.moe.key |
创建 Nginx 配置文件
| 代码块 |
|---|
|
sudo vim /etc/nginx/conf.d/stats.dejavu.moe.conf |
安装源服务器证书示例
| 代码块 |
|---|
|
server {
listen 80;
listen [::]:80;
server_name stats.dejavu.moe;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name stats.dejavu.moe;
# 指定源服务器证书路径
ssl_certificate /etc/nginx/cert/stats.dejavu.moe.pem;
ssl_certificate_key /etc/nginx/cert/stats.dejavu.moe.key;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
} |
检查配置文件,没问题就可以重载 Nginx 配置了
| 代码块 |
|---|
|
sudo nginx -t
sudo systemctl reload nginx |
然后在 Cloudflare 控制台将域名解析到服务器 IP,设置 SSL/TLS 加密模式 为 完全(严格) 即可。
参考信息