【问题标题】:Is it possible to redirect a TCP connection based on host name?是否可以根据主机名重定向 TCP 连接?
【发布时间】:2020-07-21 14:48:36
【问题描述】:

我希望能够像这样连接到 postgres 服务器:

psql -h postgres-a.example.com -p 9000

该连接应该由代理服务器(如 nginx 或 haproxy)接收,并且由于主机名postgres-a.example.com,它将被重定向到数据库 A。如果我使用postgres-b.example.com 和相同的端口,它应该转到数据库B。

我一直在研究这个,但我仍然不能 100% 确定它会如何工作。我读到基于主机名重定向 TCP 连接 (psql) 的唯一方法是使用 SNI 标头。但我仍然不明白我们是否需要 SSL 证书,或者我们是否需要使用 https://postgres-a.example.com(这对我来说没有任何意义)。它将如何运作?

谁能帮我理解这个?

【问题讨论】:

  • http(s) 是网络服务器的协议。 psql 可能使用专有协议与其数据库服务器通信。 http(s) 发送主机名作为初始请求的一部分,Nginx 理解这个协议,这就是它可以基于主机名反向代理的原因。 psql 完全有可能没有发送主机名,而且无论如何 Nginx 都无法确定它,所以简短的回答是否定的。

标签: postgresql http nginx tcp haproxy


【解决方案1】:

是的。您将需要 TLS/SSL 证书,并且可以将基于 req.ssl_sni 的请求路由到正确的后端。
我不确定 psql 是否使用 SNI,但我认为这有你检查。

frontend public_ssl

  bind :::9000 v4v6 crt /usr/local/etc/haproxy-certs

  option tcplog

  tcp-request inspect-delay 5s
  tcp-request content accept if { req.ssl_hello_type 1 }

  use-server postgres-a if { req.ssl_sni -i postgres-a.example.com }
  use-server postgres-b if { req.ssl_sni -i postgres-b.example.com }

backend postgres-a
    server postgres-a FURTHER SERVER PARAMS

backend postgres-b
    server postgres-b FURTHER SERVER PARAMS

我创建了一个带有图片的博客文章以获得更详细的描述。
https://www.me2digital.com/blog/2019/05/haproxy-sni-routing/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2022-10-01
    • 2020-08-19
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多