我在三台不同的机器上的防火墙后面运行虚拟服务器(每台机器服务于不同的域,它不是集群)。要自动续订 Let's Encrypt 证书,我需要代理根据域名将请求发送到三个不同的服务器。
+--------+ +-------------+
| +----->| domain1.com |
| | +-------------+
| | +-------------+
domain1,2,3.com-->443-->| proxy +----->| domain2.com |
| | +-------------+
| | +-------------+
| +----->| domain3.com |
+--------+ +-------------+
代理在 OpenBSD 上中继。我按照本指南(完全相同的情况)使用 HTTP 设置常规 Web 服务: https://serverfault.com/questions/856807/openbsd-how-to-use-relayd-and-httpd-for-redirecting-subdomain-requests
但 SSL 与 HTTPS 似乎有所不同。看来我必须在代理和服务域的 Web 服务器上安装 SSL 证书。
- 任何人都可以为此建议适当的语法吗?
- 我可以同时为同一台机器提供 80 和 443 端口服务吗?谢谢。
答案1
通常在此类前端中,您在前端安装 SSL 流量,并将不加密的正常 HTTP 流量转发到后端。
https http Internet --------> relayd reverse proxy -------> internal LAN web server port 443 port 80
如,在man relayd
:
以下配置将添加一个中继,以使用负载平衡模式(TLS 加速和第 7 层负载平衡)将安全 HTTPS 连接转发到 HTTP Web 服务器池。 HTTP协议定义将添加两个包含客户端和服务器地址信息的HTTP标头,将“Keep-Alive”标头值设置为配置的会话超时,并在散列中包含“sessid”变量来计算目标主机:
http 协议 "https" {
匹配标头设置 "X-Forwarded-For" \
值 "$REMOTE_ADDR"
匹配标头设置 "X-Forwarded-By" \
值 "$SERVER_ADDR:$SERVER_PORT"
匹配标头设置 "Keep-Alive" 值“$超时”匹配查询哈希“sessid”
匹配哈希“sessid”传递
块路径“/cgi-bin/index.cgi”值“命令=”tls { 没有 tlsv1.0,密码“HIGH” }
}中继“tlsaccel”{
监听www.example.com端口443 tls
协议“https”
转发到端口8080模式负载平衡检查tcp
}
如果ssl
或 tlskey
存在,它会尝试根据虚拟主机关联的 IP 地址查找文件。对于 X.509 证书,将尝试在私钥和证书公钥中relayd
查找它们。/etc/ssl/private
/etc/ssl
从中继代理
如果存在 ssl 关键字,就像我们的行“listen on $relayd_addr port $relayd_port ssl”一样,中继将接受使用加密 SSL 协议的连接。中继将在 /etc/ssl/private/address.key 中查找私钥,并在 /etc/ssl/address.crt 中查找公共证书,其中 address 是要侦听的中继的指定 IP 地址。
因此,文件的名称必须与中继正在侦听的地址相同。在我们的示例中,relayd.conf 正在监听“relayd_addr=127.0.0.1”,因此我们的文件必须被命名为 127.0.0.1.key、127.0.0.1.csr 和 127.0.0.1.crt。
要为端口 80 提供服务,您只需将常用语法作为 HTTP 代理添加到上述配置中即可。它们可以同时共存。