
【All in Boom】第 1.5 期:反向代理及内网 HTTPS 构建
目录:
0x00 总体介绍
在之前的文章中,主要展示了一个基本能用的网络,但是 AIO
系统中存在大量的服务及应用,比如群晖、软路由等,而它们普遍采用 <IP:port>
的方式访问,甚至 PVE
自身后台都是 8006
端口。显然,采用这种访问方式不优雅,也不可能实现 SSO。 因此需要采用反向代理,将 <IP:port>
转换为 <Domain Name>
,这样也便于下一步的 HTTPS
搭建及 SSO
部署。
在这次中,我们需要:
- 一个公网域名
Cloudflare
账号,并将公网域名转交其进行解析- 反向代理服务器上需要有
NGINX
由于本人采用独立的 LXC 容器
进行部署,因此方案可能会不适用于全部系统。
0x01 部分原理介绍
0x01.1 HTTPS
HTTPS 协议的工作原理是什么?
HTTP 传输未加密的数据,这意味着从浏览器发送的信息可能会被第三方拦截和读取。这一过程并不理想,因此将其扩展成为 HTTPS,以便为通信再增加一层安全性。HTTPS 将 HTTP 请求和响应与 SSL 和 TLS 技术相结合。
HTTPS 网站必须从独立证书颁发机构(CA)获取 SSL/TLS 证书。这些网站会在交换数据之前先与浏览器共享该证书,以建立信任。SSL 证书还包含加密信息,以便服务器和 Web 浏览器可以交换加密或刻意打乱的数据。该过程的工作原理是:
- 您通过在浏览器的地址栏中键入 https:// URL 格式来访问 HTTPS 网站。
- 浏览器尝试通过请求服务器的 SSL 证书来验证该站点的真实性。
- 该服务器发送包含公钥的 SSL/TLS 证书作为回复。
- 该网站的 SSL 证书将证明该服务器身份。浏览器确认一切妥当后,它将使用该公钥加密并发送包含秘密会话密钥的消息。
- Web 服务器使用其私钥解密消息并检索会话密钥。然后,它将加密该会话密钥,并向浏览器发送确认消息。
- 现在,浏览器和 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
提供了 Cloudflare
的 DNS 质询
接口,只需要简单配置就可以完成了。步骤如下:
- 在
Cloudflare
内登录,并创建一个API
,记录好 ID 和Secret
(Secret
仅会出现一次), 同时创建符合规则的token
- 在本地创建一个 ini 文件,内容为
dns_cloudflare_api_token = <token>
,并将其设置权限为 600 以保护未经授权的访问 - 通过
Certbot
安装Certbot
- 使用命令
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 超时以应对较差的互联网环境;设置反向代理仅需要获取证书即可,不需要额外配置 - 一般来说
Certbot
会自行设置定时证书更新任务,通过命令systemctl status certbot.timer
即可查看。此外,也可以使用certbot renew --dry-run
来确认自动续期状态 - 考虑到证书私钥的重要性,务必保存好密钥和 API Token 以防止被利用
至此,公网证书获取结束,在增加新的内网地址时,仅需要增加 -d <domain n>
参数即可。
0x02.2 反向代理设置
根据 nginx 文档,通过配置文件设置反向代理,编辑 /etc/nginx/sites-available/<config>
如下所示:
1 |
|
这样的代理配置基本可以使用,但是在某些场合(大文件上传)或者特殊需要返回的操作会出现问题。TODO: 将来需要解决
确定修改无误后,首先使用 nginx -t
验证配置文件是否有语法错误,随后 service nginx restart
重启服务即可。最后,别忘记在路由器上的 Dnsmasq
、SmartDNS
、AdGuard Home
等软件上设置指定的 DNS 覆写规则 以完成重指向。