如何通过单个端口处理加密和未加密的 http 连接

如何通过单个端口处理加密和未加密的 http 连接

请看一下下图。

替代文本

这应该如何工作?

  • 当远程请求 http:// myhost.com:8080/* 时,请求应转发到监听环回接口 8008 端口的 http 服务器。这是最简单的部分。

  • 当远程用户请求 http:// myhost.com:8080/specialurl ...

    • 作为应用程序级网关的程序应该能够将连接升级到加密会话(无需更改端口

    • 与远程浏览器建立加密会话后,它应该将请求转发给监听环回接口 8000 端口的 C 程序

我的问题是

  1. 您是否曾在生产环境中部署过这样的解决方案?如果您有...
  2. 您使用什么产品作为应用程序网关?
  3. 您能提供一个配置示例吗?

严格限制

  • 无法控制防火墙,并且我可以将外部流量引入内部服务器的唯一端口是 8080。端口号无关紧要,关键是在防火墙级别只有一个端口打开,用于将传入流量转发到内部服务器。
  • 内部服务器必须运行 Linux(当前运行的是 Debian Lenny)
  • 远程用户只需一个当前的 Web 浏览器和 Internet 连接即可访问此服务器。这意味着通过 SSH 进行反向端口转发在这里不是一种选择。
  • 我需要一个已经过生产测试并且可以随时部署的产品。我不想开发自己的应用程序网关(如果是这样的话,我想我会在 Stack Overflow 上询问这个问题,而不是在 Server Fault 上询问)。

软限制

  • 我想避免将 Apache 作为应用程序网关(尽管如果这是唯一可能的选择,我愿意这样做)
  • 如果可能的话,应用网关应该是成熟的、开源的软件产品。

迄今为止尝试作为应用网关的产品(没有成功)

  • nginx
  • lighttpd

相关 RFC

  • RFC2817(...解释如何使用 HTTP/1.1 中的升级机制在现有 TCP 连接上启动传输层安全性 (TLS)。这允许不安全和安全的 HTTP 流量共享相同的知名端口... )
  • RFC2818(...描述如何使用 TLS 保护互联网上的 HTTP 连接。当前的做法是在 SSL(TLS 的前身)上分层 HTTP,通过使用不同的服务器端口来区分安全流量和非安全流量... )

答案1

一个港口统治所有港口,表明有人至少在 Java 世界中实现了它。

您是否曾在生产环境中部署过这样的解决方案?

我没有——也永远不会建议这样做。作为一名顾问,我试图鼓励我的客户使用标准化和经过验证的技术。除了极端情况外,似乎没有系统能够正确实施这些 RFC——而这不是我想要建议或支持的事情。

答案2

Apache 在这里帮不了你。它只能在任何给定端口上监听 HTTP 或 HTTPS 连接(不能同时监听两者)。

据我所知,没有“成熟的产品”可以实现此功能。请您的网络管理员在防火墙上再打一个洞,或者设置一个 VPN 或 SSH 隧道到外部端点,您可以在其中设置多个侦听端口。

相关内容