反向代理服务器可以将SNI与SSL传递一起使用吗?


18

我需要使用一个外部IP地址通过https服务多个应用程序。

ssl证书不应在反向代理上进行管理。它们安装在应用程序服务器上。

可以将反向代理配置为使用SNI并通过ssl来在端点处终止吗?

是否可以使用Nginx或Apache之类的东西?配置是什么样的?

Answers:


14

Haproxy可以做到这一点。您可以设置TCP代理并提取SNI并根据SNI进行路由。这是一个例子:

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0

延迟请求直到您获得SSL问候是必不可少的,否则haproxy会在接收SNI头之前尝试建立连接。

我使用权重为0的服务器,因为在我当前的配置中,每个SNI仅运行一台服务器,并且我不希望它们接收随机请求。您可能会找到更好的方法来玩这个游戏。

我希望这有帮助。


您能否将我指向该文档或配置摘要的任何文档,以便我接受答案?
user319862

3
@ user319862我发现这个不错的教程似乎正在讨论中。
迈克尔·汉普顿

1
真?为什么有人会否决这个答案?
FlorinAsăvoaie2014年

这样做的问题是客户端的IP地址无法转发,因此服务器只能看到来自代理的流量。
凯尔(Kyle)

@Kyle当然。它是TCP代理。您唯一可以做的就是将haproxy配置和设置为服务器的路由器,并使用tproxy。
FlorinAsăvoaie17年

5

您可以使用sniproxy:https : //github.com/dlundquist/sniproxy

配置示例:

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

感谢您发布有关该项目的信息。我没有意识到
user319862

@mick嗨,mick,作为透明代理运行SNI时,它会破坏一些带有SSL错误的站点。如何解决?
gripenfighter

1

即使在2019年即将推出TLS 1.3的情况下,这肯定也是有可能的!许多Web服务器或专门的反向代理都提供了开箱即用的功能:

  • Nginx≥1.11.5(Debian≥破坏者或拉伸向后移植)
  • HAProxy≥1.5(Debian≥jessie)
  • 狙击手(Debian≥buster)
  • 等等

这是Nginx的示例配置,对于需要反向代理的设置,这是一个非常受欢迎的选择:

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

相关的Nginx模块是stream_corestream_ssl_preread。手册:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.