SatyrLee
文章87
标签25
分类10

一言

文章归档

【All in Boom】第 1.5 期:反向代理及内网 HTTPS 构建

【All in Boom】第 1.5 期:反向代理及内网 HTTPS 构建

封面图 ID:387272

目录:

  1. 第 0 期:为什么要搭建 AIO 及硬件环境介绍
  2. 第 1 期:基础网络搭建

0x00 总体介绍

在之前的文章中,主要展示了一个基本能用的网络,但是 AIO 系统中存在大量的服务及应用,比如群晖、软路由等,而它们普遍采用 <IP:port> 的方式访问,甚至 PVE 自身后台都是 8006 端口。显然,采用这种访问方式不优雅,也不可能实现 SSO。 因此需要采用反向代理,将 <IP:port> 转换为 <Domain Name> ,这样也便于下一步的 HTTPS 搭建及 SSO 部署。

在这次中,我们需要:

  1. 一个公网域名
  2. Cloudflare 账号,并将公网域名转交其进行解析
  3. 反向代理服务器上需要有 NGINX

由于本人采用独立的 LXC 容器进行部署,因此方案可能会不适用于全部系统。

0x01 部分原理介绍

0x01.1 HTTPS

HTTPS 协议的工作原理是什么?

HTTP 传输未加密的数据,这意味着从浏览器发送的信息可能会被第三方拦截和读取。这一过程并不理想,因此将其扩展成为 HTTPS,以便为通信再增加一层安全性。HTTPS 将 HTTP 请求和响应与 SSL 和 TLS 技术相结合。

HTTPS 网站必须从独立证书颁发机构(CA)获取 SSL/TLS 证书。这些网站会在交换数据之前先与浏览器共享该证书,以建立信任。SSL 证书还包含加密信息,以便服务器和 Web 浏览器可以交换加密或刻意打乱的数据。该过程的工作原理是:

  1. 您通过在浏览器的地址栏中键入 https:// URL 格式来访问 HTTPS 网站。
  2. 浏览器尝试通过请求服务器的 SSL 证书来验证该站点的真实性。
  3. 该服务器发送包含公钥的 SSL/TLS 证书作为回复。
  4. 该网站的 SSL 证书将证明该服务器身份。浏览器确认一切妥当后,它将使用该公钥加密并发送包含秘密会话密钥的消息。
  5. Web 服务器使用其私钥解密消息并检索会话密钥。然后,它将加密该会话密钥,并向浏览器发送确认消息。
  6. 现在,浏览器和 Web 服务器都切换到使用相同的会话密钥来安全地交换消息。

HTTPS 将明文传输变成了非对称加密的密文传输,保护可用性、防篡改性和可追溯性HTTPS 也是众多网络安全的重要组件,接下来使用的 OpenID 认证也是基于 HTTPS 才得以实现。

0x01.2 反向代理

反向代理是一种位于服务器和客户端之间的代理服务器。客户端将请求发送给反向代理,然后由代理服务器根据一定的规则将请求转发给后端服务器。后端服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端。反向代理对客户端是透明的,客户端无需知道实际服务器的地址,只需将反向代理当作目标服务器一样发送请求就可以了。

这里应用了反向代理中的一个重要特性,将真实的地址包装为易于访问的域名,这为接下来的 HTTPS 和 SSO 部署提供必要的技术基础。

0x02 实现方法

在这里,按照操作顺序进行介绍。

0x02.1 HTTPS 证书获取

实现 HTTPS 的必要前提是获取一个证书,证书可以通过自签来完成,但是自签名证书不受浏览器及安全软件认可(参考)。因此最好在公网域名下部署受信任 CA 的 SSL 证书。穷哥们之选的 Let’s Encrypt 就可以免费申请可续期的 SSL 证书,且有极其方便的 Certbot 软件来完成这一操作。因此在接下来的证书都通过 Certbot 获取。

但是,由于公网资源极其稀少,ISP 提供绝大部分的 IPv4 地址都是经过 NAT 转换后的地址,无法被 CA 验证。因此只能通过 DNS 验证来完成 SSL 证书的获取。好在 Certbot 提供了 CloudflareDNS 质询接口,只需要简单配置就可以完成了。步骤如下:

  1. Cloudflare 内登录,并创建一个 API,记录好 ID 和 SecretSecret 仅会出现一次), 同时创建符合规则的 token
  2. 在本地创建一个 ini 文件,内容为 dns_cloudflare_api_token = <token>,并将其设置权限为 600 以保护未经授权的访问
  3. 通过 Certbot 安装 Certbot
  4. 使用命令 certbot certonly --dns-cloudflare --dns-cloudflare-credentials <path/to/secret.ini> -d <domain 1> -d <domain 2> --dns-cloudflare-propagation-seconds 60 来获取证书,它会自动存储在默认位置,通常在 /etc/letsencrypt/live/<domain>。采用 60s 超时以应对较差的互联网环境;设置反向代理仅需要获取证书即可,不需要额外配置
  5. 一般来说 Certbot 会自行设置定时证书更新任务,通过命令 systemctl status certbot.timer 即可查看。此外,也可以使用 certbot renew --dry-run 来确认自动续期状态
  6. 考虑到证书私钥的重要性,务必保存好密钥和 API Token 以防止被利用

至此,公网证书获取结束,在增加新的内网地址时,仅需要增加 -d <domain n> 参数即可。

0x02.2 反向代理设置

根据 nginx 文档,通过配置文件设置反向代理,编辑 /etc/nginx/sites-available/<config> 如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 443 ssl;
server_name <domain>;

ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;

location / {
proxy_pass http://<target IP:port>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Origin "https://$host";
proxy_buffering off;
proxy_ssl_verify off;
}
}

server {
listen 80;
server_name <domain>;
return 301 https://$host$request_uri;
}

这样的代理配置基本可以使用,但是在某些场合(大文件上传)或者特殊需要返回的操作会出现问题。TODO: 将来需要解决

确定修改无误后,首先使用 nginx -t 验证配置文件是否有语法错误,随后 service nginx restart 重启服务即可。最后,别忘记在路由器上的 DnsmasqSmartDNSAdGuard Home 等软件上设置指定的 DNS 覆写规则 以完成重指向。

参考

  1. HTTP 与 HTTPS 之间有什么区别?
  2. 图文总结:正向代理与反向代理

本文作者:SatyrLee
本文链接:http://www.naive514.top/posts/77ab6949/
版权声明:本文采用 CC BY-NC-SA 4.0 CN 协议进行许可