我已经为一个项目对这个主题进行了几周的研究,不幸的是,我只是个简单的代码猿,我对网络和 SSL 的了解有限。到目前为止,我所做的几乎每一次搜索都让我找到了 serverfault,我相信我得出的结论是这可能是不可能的。
我基本上需要开发一种解决方案,该解决方案将接收传入的 https 并将其无缝传递到克隆的 Web 服务器集群。它们都提供完全相同的内容。客户端 SSL 不应在负载均衡器处终止。(https -> 负载均衡 -> 集群)
所以从技术上讲,我的问题具有误导性,反向代理并不是真正必要的,但到目前为止,我的所有解决方案都倾向于某种代理。我只是需要一个透明的 SSL 负载平衡解决方案。
这是迄今为止我尝试过的。
Apache 2.4.x mod_proxy:适用于 https -> 代理 -> http -> 集群。完整 ssl 解决方案失败。
Pound:https -> 代理 -> https 运行良好,但是端点服务器接收 Pound 服务器的证书/信息。我需要客户端证书,因为端点服务器需要能够执行撤销。(出于安全考虑,代理/MITM 无法处理撤销)。
我研究过的其他选项有:Squid、Charles、HAproxy、nginx、Charles、Pen,也许还有一些我不记得了,我的大脑现在基本上一片混乱。
Pen 可能是最好的解决方案,因为它是 TCP 流量,不需要解码 ssl 标头来处理流量,但我很难找到有关配置它的信息。
硬件解决方案并非不可能。所以我想问题是 1. 这可能吗?2. 最好的解决方案是什么(最好是便宜的/开源的)?谢谢!
答案1
确认一下,您不希望 SSL 在负载均衡器处终止?因此您的后端服务器将提供 https。
这就是我要做的。在 Ubuntu 或 Debian 下。
设置几台服务器作为负载均衡器/代理服务器(如果需要,可以实现 HA)。它们不需要非常高端,但要合理。
1)安装keepalived
sudo apt-get 安装 keepalived
2)像这样设置/etc/keepalived/keepalived.conf:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0 # interface to monitor
virtual_router_id 51 # Assign one ID for this route
priority 100 # 101 on master, 100 on backup
nopreempt
virtual_ipaddress {
a.b.c.d # the virtual IP
}
track_script {
chk_haproxy
}
}
2)安装haproxy
sudo apt-get 安装 haproxy
3)使用如下配置设置 /etc/haproxy/haproxy.cfg:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option dontlognull
option redispatch
retries 3
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen myproxy a.b.c.d:443
mode tcp
option tcplog
balance leastconn
server http1 x.x.x.a:443
server http2 x.x.x.b:443
server http3 x.x.x.c:443
server http4 x.x.x.d:443
它的作用是使用 TCP 模式(无 https)。如果您想要 https,您可以在它前面安装 stud 或类似程序(在同一台服务器上)。
abcd 是您的 vrrp 虚拟 IP 地址。xxxa、xxxb、xxxc、xxxd 是负载平衡服务器的 IP。如果您愿意,这些可以安全地位于防火墙后面。
如果您选择了 HA 选项,请确保在 /etc/sysctl.conf 中设置此选项:
net.ipv4.ip_nonlocal_bind = 1
如果其中一个 haproxy 服务器出现故障或 haproxy 服务停止,则另一个服务器将介入。发生这种情况时,某些用户的连接可能会断开,但刷新应该可以解决这个问题。
这对我来说是可行的,尽管我的设置略有不同。我在负载均衡器上终止 SSL,然后从后端提供未加密的流量。