HAProxy 通过同一端口路由 https SNI 和 http

HAProxy 通过同一端口路由 https SNI 和 http

我有一个使用 SNI 且不​​终止的 HAProxy 路由 HTTPS。

配置类似如下:

frontend ft_ssl_vip
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

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

  default_backend bk_ssl_default

# Using SNI to take routing decision
backend bk_ssl_default
  mode tcp

  acl application_1 req.ssl_sni -i foo.example.com
  acl application_2 req.ssl_sni -i bar.example.com

  use-server server1 if application_1
  use-server server2 if application_2
  use-server server3 if !application_1 !application_2

  option ssl-hello-chk
  server server1 127.0.0.1:777
  server server2 127.0.0.1:778
  server server3 127.0.0.1:779

我还需要通过同一端口 (5000) 路由 HTTP 流量。

如何修改我的配置以通过 SNI 同时适应 HTTP 和 HTTPS,而无需通过同一端口终止?


编辑


我已经更接近了。HTTPS 路由似乎正在运行,但由于某种原因,HTTP 后端 acl 与域不匹配。

我现在的位置是:

frontend app
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

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


  use_backend testing_http if HTTP

  default_backend testing_https



backend testing_https
  mode tcp

  acl app_2 req.ssl_sni -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default 127.0.0.1:443



backend testing_http
  mode http

  acl app_2 hdr(host) -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default 127.0.0.1:80

答案1

我发布自己问题的答案是因为我已经拼凑了一些内容,但这个问题似乎没有任何意义。如果它出现在谷歌搜索中,这应该会对某人有所帮助。

到目前为止,以下内容对我有用:

frontend app
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

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


  use_backend testing_http if HTTP

  default_backend testing_https



backend testing_https
  mode tcp

  acl app_2 req.ssl_sni -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default serverfault.com:443



backend testing_http
  mode http

  acl app_2 hdr_dom(host) -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default www.example.com:80

需要理解的重要部分是——前端检查请求是否为 HTTP。如果不是,它会检查它是否是 SNI 请求。否则,它不会接受。

另一个让我困惑的部分是 http 后端的主机匹配。使用 hdr_dom 而不是 hdr 进行域匹配非常重要,这样字符串中手动指定的端口就不会破坏 acl。

最困难的部分是前端的 tcp 模式对 http 的日志记录毫无帮助。而且由于 http 后端无法记录,因此您无法获得任何 http 信息。

相关内容