是否可以根据主机名重定向 TCP 连接?
Is it possible to redirect a TCP connection based on host name?
我希望能够像这样连接到 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 header。但我仍然不明白我们是否需要为此使用 SSL 证书,或者我们是否需要使用 https://postgres-a.example.com
(这对我来说没有任何意义)。它将如何运作?
谁能帮我理解一下?
是的。您将需要 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
我已经创建了一个博客 post 并附上一张图片以获得更详细的描述。
https://www.me2digital.com/blog/2019/05/haproxy-sni-routing/
我希望能够像这样连接到 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 header。但我仍然不明白我们是否需要为此使用 SSL 证书,或者我们是否需要使用 https://postgres-a.example.com
(这对我来说没有任何意义)。它将如何运作?
谁能帮我理解一下?
是的。您将需要 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
我已经创建了一个博客 post 并附上一张图片以获得更详细的描述。
https://www.me2digital.com/blog/2019/05/haproxy-sni-routing/