如何在Ubuntu20.04上使用Cloudflare和Nginx托管网站
作为 Write for DOnations 计划的一部分,作者选择了 Electronic Frontier Foundation 来接受捐赠。
介绍
Cloudflare 是一种位于访问者和网站所有者服务器之间的服务,充当网站的反向代理。 Cloudflare 提供内容交付网络 (CDN),以及 DDoS 缓解和分布式域名服务器服务。
Nginx 是一种流行的 Web 服务器,负责托管 Internet 上一些最大和流量最高的网站。 组织使用 Nginx 为网站提供服务并使用 Cloudflare 作为 CDN 和 DNS 提供商是很常见的。
在本教程中,您将使用来自 Cloudflare 的 Origin CA 证书保护由 Nginx 服务的网站,然后配置 Nginx 以使用经过身份验证的拉取请求。 使用此设置的优点是您可以从 Cloudflare 的 CDN 和快速 DNS 解析中受益,同时确保所有连接都通过 Cloudflare。 这可以防止任何恶意请求到达您的服务器。
先决条件
要完成本教程,您需要以下内容:
- 按照Ubuntu 20.04初始服务器设置指南设置一台Ubuntu 20.04服务器,包括
sudo
非root用户和防火墙。 - Nginx 安装在您的服务器上。 您可以按照 我们的指南了解如何在 Ubuntu 20.04 上安装 Nginx。
- 一个 Cloudflare 帐户。
- 添加到您的 Cloudflare 帐户并指向您的 Nginx 服务器的注册域。 我们关于 如何使用 Cloudflare 缓解针对您的网站的 DDoS 攻击的指南可以帮助您进行设置。 我们对DNS术语、组件和概念的介绍也可以提供帮助。
- 为您的域配置的 Nginx 服务器块,您可以按照如何在 Ubuntu 20.04 上安装 Nginx 的 步骤 5 进行操作。
第 1 步 — 生成 Origin CA TLS 证书
Cloudflare Origin CA 允许您生成由 Cloudflare 签名的免费 TLS 证书,以安装在您的 Nginx 服务器上。 通过使用 Cloudflare 生成的 TLS 证书,您可以保护 Cloudflare 的服务器和您的 Nginx 服务器之间的连接。
要使用 Origin CA 生成证书,请在 Web 浏览器中登录您的 Cloudflare 帐户。 选择要保护的域并导航到 Cloudflare 仪表板的 SSL/TLS 部分。 从那里,导航到 Origin Server 选项卡,然后单击 Create Certificate 按钮:
保留默认选项 Generate private key and CSR with Cloudflare 被选中。
单击 Next,您将看到一个对话框,其中包含 Origin Certificate 和 Private key。 您需要将原始证书和私钥从 Cloudflare 传输到您的服务器。 为安全起见,Private Key信息将不再显示,请在点击Ok之前将密钥复制到您的服务器。
您将使用服务器上的 /etc/ssl
目录来保存原始证书和私钥文件。 该文件夹已存在于服务器上。
首先,复制浏览器对话框中显示的Origin Certificate的内容。
然后,在您的服务器上,在您首选的文本编辑器中打开 /etc/ssl/cert.pem
:
sudo nano /etc/ssl/cert.pem
将证书内容粘贴到文件中。 然后保存并退出编辑器。 如果您使用的是 nano
,请按 Ctrl+X
,然后在出现提示时按 Y
,然后按 Enter。
然后返回浏览器并复制私钥的内容。 打开文件/etc/ssl/key.pem
进行编辑:
sudo nano /etc/ssl/key.pem
将私钥粘贴到文件中,保存文件,然后退出编辑器。
注意: 有时,当您从 Cloudflare 仪表板复制证书和密钥并将其粘贴到服务器上的相关文件中时,会插入空白行。 Nginx 会将此类证书和密钥视为无效,因此请确保您的文件中没有空行。
警告: Cloudflare 的 Origin CA 证书仅受 Cloudflare 信任,因此只能由主动连接到 Cloudflare 的原始服务器使用。 如果您在任何时候暂停或禁用 Cloudflare,您的 Origin CA 证书将引发不受信任的证书错误。
现在您已将密钥和证书文件复制到服务器,您需要更新 Nginx 配置以使用它们。
第 2 步 — 在 Nginx 中安装 Origin CA 证书
在上一节中,您使用 Cloudflare 的仪表板生成了原始证书和私钥,并将文件保存到您的服务器。 现在,您将更新站点的 Nginx 配置,以使用原始证书和私钥来保护 Cloudflare 的服务器与您的服务器之间的连接。
首先,确保 UFW 将允许 HTTPS 流量。 启用 Nginx Full
,这将打开端口 80
(HTTP) 和端口 443
(HTTPS):
sudo ufw allow 'Nginx Full'
现在重新加载 UFW:
sudo ufw reload
最后,检查您的新规则是否被允许并且 UFW 是否处于活动状态:
sudo ufw status
你会看到这样的输出:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
现在您已准备好调整您的 Nginx 服务器块。 Nginx 在安装过程中会创建一个默认的服务器块。 如果它仍然存在,请删除它,因为您已经为您的域配置了自定义服务器块:
sudo rm /etc/nginx/sites-enabled/default
接下来,打开您的域的 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/your_domain
该文件应如下所示:
/etc/nginx/sites-available/your_domain
server { listen 80; listen [::]:80; root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; server_name your_domain www.your_domain; location / { try_files $uri $uri/ =404; } }
您将修改 Nginx 配置文件以执行以下操作:
- 监听端口
80
并将所有请求重定向到使用https
。 - 监听端口
443
并使用上一节中添加的源证书和私钥。
修改文件,使其如下所示:
/etc/nginx/sites-available/your_domain
server { listen 80; listen [::]:80; server_name your_domain www.your_domain; return 302 https://$server_name$request_uri; } server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; server_name your_domain www.your_domain; root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } }
保存文件并退出编辑器。
接下来,测试以确保您的任何 Nginx 配置文件中都没有语法错误:
sudo nginx -t
如果您没有发现任何问题,请重新启动 Nginx 以启用您的更改:
sudo systemctl restart nginx
现在转到 Cloudflare 仪表板的 SSL/TLS 部分,导航到 Overview 选项卡,然后将 SSL/TLS 加密模式 更改为 Full(严格) 。 这会通知 Cloudflare 始终加密 Cloudflare 和您的原始 Nginx 服务器之间的连接。
现在访问您的网站 https://your_domain
以验证其设置是否正确。 您将看到您的主页显示,并且浏览器将报告该站点是安全的。
在下一部分中,您将设置 Authenticated Origin Pulls 以验证您的源服务器确实在与 Cloudflare 而不是其他服务器通信。 通过这样做,Nginx 将被配置为仅接受使用来自 Cloudflare 的有效客户端证书的请求; 所有未通过 Cloudflare 的请求都将被丢弃。
第 3 步 — 设置经过身份验证的来源拉取
Origin CA 证书将帮助 Cloudflare 验证它是否正在与正确的源服务器通信。 此步骤将使用 TLS 客户端身份验证来验证您的原始 Nginx 服务器是否正在与 Cloudflare 通信。
在经过客户端身份验证的 TLS 握手中,双方都提供要验证的证书。 源服务器配置为仅接受使用来自 Cloudflare 的有效客户端证书的请求。 未通过 Cloudflare 的请求将被丢弃,因为它们没有 Cloudflare 的证书。 这意味着攻击者无法绕过 Cloudflare 的安全措施并直接连接到您的 Nginx 服务器。
Cloudflare 提供由 CA 签名的证书和以下证书:
-----BEGIN CERTIFICATE----- MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI 42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3 Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5 lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa +4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1 QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz 6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z 0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc 5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/ fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM fVQ6VpyjEXdiIXWUq/o= -----END CERTIFICATE-----
您也可以直接从 Cloudflare 的文档 下载证书。
复制此证书。
然后创建文件 /etc/ssl/cloudflare.crt
文件来保存 Cloudflare 的证书:
sudo nano /etc/ssl/cloudflare.crt
将证书添加到文件中。 然后保存文件并退出编辑器。
现在更新您的 Nginx 配置以使用 TLS Authenticated Origin Pulls。 打开您的域的配置文件:
sudo nano /etc/nginx/sites-available/your_domain
添加 ssl_client_certificate
和 ssl_verify_client
指令,如下例所示:
/etc/nginx/sites-available/your_domain
. . . server { # SSL configuration listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; ssl_client_certificate /etc/ssl/cloudflare.crt; ssl_verify_client on; . . .
保存文件并退出编辑器。
接下来,测试 Nginx 以确保 Nginx 配置中没有语法错误:
sudo nginx -t
如果没有发现问题,重新启动 Nginx 以启用您的更改:
sudo systemctl restart nginx
最后,要启用 Authenticated Pulls,请打开 Cloudflare 仪表板中的 SSL/TLS 部分,导航到 Origin Server 选项卡并切换 Authenticated Origin Pulls 选项。
现在访问您的网站 https://your_domain
以验证它是否已正确设置。 和以前一样,您将看到您的主页显示。
要验证您的服务器是否只接受由 Cloudflare 的 CA 签名的请求,请切换 Authenticated Origin Pulls 选项以禁用它,然后重新加载您的网站。 您应该收到以下错误消息:
如果 Cloudflare 的 CA 未签署请求,您的源服务器会引发错误。
注意: 大多数浏览器都会缓存请求,所以要查看上述更改,您可以在浏览器中使用隐身/隐私浏览模式。 要防止 Cloudflare 在您设置网站时缓存请求,请导航到 Cloudflare 仪表板中的 Overview 并切换 Development Mode。
既然您知道它可以正常工作,请返回 Cloudflare 仪表板中的 SSL/TLS 部分,导航到 Origin Server 选项卡并切换 Authenticated Origin Pulls 选项再次启用它。
结论
在本教程中,您通过使用 Cloudflare 的 Origin CA 证书加密 Cloudflare 和 Nginx 服务器之间的流量来保护由 Nginx 提供支持的网站。 然后,您在 Nginx 服务器上设置 Authenticated Origin Pulls 以确保它只接受 Cloudflare 服务器的请求,防止其他任何人直接连接到 Nginx 服务器。