HAProxy:检测 SSL 连接内容,然后决定是否转发

HAProxy:检测 SSL 连接内容,然后决定是否转发

我想要一个在端口 443 上使用 HAProxy 的前端。该前端的工作方式如下:

它解密连接的内容并检查:

1-如果连接的加密内容是 ssh,即如果数据包的第一个字是SSH-2.0,那么它会将解密的数据包转发到端口 22。我假设这样的后端看起来像这样:

backend ssh
    mode tcp
    option tcplog
    server ssh 127.0.0.1:22
    timeout server 2h

2- 如果加密内容是其他内容,则将加密内容转发到端口 8443,该端口包含具有正确 SNI 密钥的 Apache 服务器。如果必须为每个网址包含所有正确的 SNI 密钥(为了不看起来像中间人攻击,您能否举例说明如何做到这一点?我可以毫无问题地将所有密钥添加到 HAProxy。

为什么?因为我已经让 Apache 在端口 443 上运行。我想将其移动到其他端口,而不必重写整个配置。因此,我想将其移动到端口 8443,然后告诉 HAProxy,如果连接不是 SSH,则将您收到的所有内容转发到端口 443。

我该如何编写这样的前端+后端?请帮忙。

我当前有以下前端作为起点:

frontend ssl
    bind 0.0.0.0:443 ssl crt /home/myuser/SSL/certs.pem no-sslv3   #decrypts the connection with the keys certs.pem
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if HTTP
    acl client_attempts_ssh payload(0,7) -m bin 5353482d322e30   #if the decrypted information starts with SSH-2.0

    use_backend ssh if client_attempts_ssh   #forward to SSH if condition client_attempts_ssh is satisfied.
    use_backend forwardToApache if !client_attempts_ssh

如果您需要任何其他详细信息,请询问。

谢谢。

答案1

您可以先使用 SNI,选择

site1.domain.com, 
site2.domain.com,

或者

ssh.domain.com

并且仅当选择了 ssh.domain.com 时,您才会解密,执行 ssh magic 并将其以未加密的形式发送到本地 Web 服务器,假设这看起来像常规 https 流量,但不包含 https 内容内的敏感信息,因为这由 site1 和 site2 处理。

相关内容