AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1116573
Accepted
Pavel Klimov
Pavel Klimov
Asked: 2022-11-25 23:12:41 +0800 CST2022-11-25 23:12:41 +0800 CST 2022-11-25 23:12:41 +0800 CST

为什么正确的基于 HAProxy SNI 的路由需要“tcp-request content accept”前端指令?

  • 772

我最近尝试在 HAProxy 上为 mongodbmongodb+srv协议连接设置基于 SNI 的路由。

我让它工作,但直到我把它

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }

在我的前端配置中它开始正常工作

如果没有这些(或只有其中之一),我的大约 70% 的请求会不断收到零星的连接重置。请注意,有时连接确实能够建立。

根据http://cbonte.github.io/haproxy-dconv/2.0/configuration.html#4-tcp-request%20content

基于内容的规则按照它们的确切声明顺序进行评估。如果没有规则匹配或没有规则,则默认操作是接受内容。可插入的规则数量没有具体限制。

所以它应该默认工作。

要么是我遗漏了一些基本的 TCP 概念,要么是一些特定的 Mongo 连接细节。但我注意到几乎每个人在选择基于 SNI 的路由时都定义了相同的规则,因此它对大多数人来说一定是有意义的。

工作 HAProxy 配置:

    frontend fe_mongo-nonprod
      bind :27017
      tcp-request inspect-delay 5s
      tcp-request content accept if { req_ssl_hello_type 1 }

      acl mongoAtlas-01 req_ssl_sni -i host1.mongodb.net
      acl mongoAtlas-02 req_ssl_sni -i host2.mongodb.net
      acl mongoAtlas-03 req_ssl_sni -i host3.mongodb.net
      use_backend be_mongo-nonprod if mongoAtlas-01 || mongoAtlas-02 || mongoAtlas-03

    backend be_mongo-nonprod
      mode tcp

      acl mongoAtlas-01 req_ssl_sni -i host1.mongodb.net
      acl mongoAtlas-02 req_ssl_sni -i host2.mongodb.net
      acl mongoAtlas-03 req_ssl_sni -i host3.mongodb.net

      use-server server-01 if mongoAtlas-01
      use-server server-02 if mongoAtlas-02
      use-server server-03 if mongoAtlas-03

      server server-01 host1.mongodb.net:27017
      server server-02 host2.mongodb.net:27017
      server server-03 host3.mongodb.net:27017

还值得一提的是,HAProxy 部署在 Kubernetes(GCP 中由 Google 管理的集群)中,具有 istio-sidecar 并通过 Internal LoadBalancer k8s 服务公开。

如上所述,上述配置运行良好。我感兴趣的是为什么tcp-request content accept绝对需要并且这里默认情况下 [always] 不接受连接。

haproxy
  • 1 1 个回答
  • 45 Views

1 个回答

  • Voted
  1. Best Answer
    Pavel Klimov
    2022-11-29T04:05:03+08:002022-11-29T04:05:03+08:00

    在考虑一下之后,我将尝试回答我自己的问题。

    因此,HAProxy 文档也有以下提及: http ://cbonte.github.io/haproxy-dconv/2.0/configuration.html

    如果需要内容切换,建议先等待完整的客户端问候(类型 1),如下例所示。

    现在,由于 SNI 数据也包含在请求的客户端问候部分中 ( https://www.rfc-editor.org/rfc/rfc6066#page-6 ),我的假设如下:

    在这种情况下,如果 Client Hello 分布在多个 TCP 数据包中,并且没有tcp-request content accept is configured,在收到第一个数据包时,HAProxy 会尝试路由它,并且会发生以下两种情况之一:

    1. 如果配置了默认后端,则数据包将转发到此后端。
    2. 如果没有配置默认后端(我的情况),数据包将被丢弃并重置连接。

    另请注意,即使在第一种情况下描述的服务器 HAProxy 指向后端部分也可能需要 SNI。因此在没有 SNI 指示的情况下转发不完整的请求也会导致重置连接。

    • 0

相关问题

  • 是否可以使用负载均衡器加密内部网络服务器之间的流量[关闭]

  • HAProxy 和后端服务器之间丢失一半的数据

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve