根据源 IP 端口重定向将 1 个域/证书/ip/端口上的多个 SSL 连接到多个服务器

根据源 IP 端口重定向将 1 个域/证书/ip/端口上的多个 SSL 连接到多个服务器

我有一个非常具体的问题,看起来像是以前被问过的问题,但我认为它有点不同,而且并不是一个常见的情况。

是否可以运行多个内部(网络)服务器,运行于单一主机, 使用单个域, 和单个 SSL 证书, 使用单个外部 IP 地址单个外部端口,通过使用源 IP 地址到内部端口的端口转发映射?

试想一下,如果您想要为不同位置的 10 个客户提供网站 www.example.com,根据他们连接的源 IP 地址,提供不同的内容,并通过经过验证的 SSL 进行保护,而您只需要一台实际服务器(和一个外部 IP 地址)作为 10 个网络服务器的主机,当然只需要一个 SSL 证书。

更多信息和条件:

  • 主主机是一个 CentOS 7 机箱,位于防火墙(OpenBSD + PF)后面,使用基本 NAT
  • 每个内部(Web)服务器在单独的自定义端口上运行(即 4431、4432、4433...)
  • 仅使用 IPv4,不使用 IPv6
  • 没有使用/不需要 SNI(因为正在使用单个域)

为了针对示例情况进行设置,通过使用 Apache 作为(Web)服务器的示例,我考虑了以下计划(假设 Apache 已设置并且您已准备好为 Apache 使用 SSL 证书,并且为了方便此示例,CentOS 7 框上没有使用本地防火墙):

在 CentOS 7 机器上的 /etc/sysconfig/network-scripts/ifcfg-ethX 中为网络接口 ethX 设置静态 IP 别名

IPADDR=10.0.0.1
IPADDR1=10.0.0.2
IPADDR2=10.0.0.3
... etc. etc as many IP aliases as needed
PREFIX=24
PREFIX1=24
PREFIX2=24
... etc. etc. as many prefix aliases as needed

在 CentOS 7 机器上的 /etc/httpd/conf.d/example.conf 中设置 Apache 虚拟主机

Listen 4431
Listen 4432
... etc. etc. as many Listen entries as needed

<VirtualHost 10.0.0.1:4431>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /some/directory/www.example.com.crt
SSLCertificateKeyFile /some/directory/www.example.com.key
</VirtualHost>

<VirtualHost 10.0.0.2:4432>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /some/directory/www.example.com.crt
SSLCertificateKeyFile /some/directory/www.example.com.key
</VirtualHost>

... etc. etc. as many VirtualHost directives as needed

在 OpenBSD 防火墙的 /etc/pf.conf 中设置客户端源 IP 地址到端口重定向

match out on $netw_interface from $internal_server1 nat-to $external_ip
match out on $netw_interface from $internal_server2 nat-to $external_ip

... etc. etc. as many NAT rules as needed

pass in quick log on $netw_interface proto tcp from $client1 to $external_ip port 443 rdr-to $internal_server1 port 4431
pass in quick log on $netw_interface proto tcp from $client2 to $external_ip port 443 rdr-to $internal_server2 port 4432

... etc. etc. as many port redirect rules as needed

匹配规则用于 NAT,$client1 是客户端外部源地址等等,$internal_server1 是第一个监听 10.0.0.1:4431 的虚拟主机等等,$external_ip 是 www.example.com 的 A 记录指向的 IP 地址。

这听起来可能没什么用,但就我所处的实际情况而言,它可能有用。

之前有人尝试过吗?如果有,效果好吗?可管理吗?客户能以任何方式看到它吗?

提前致谢。

答案1

我认为你对这个问题的设计过度了。
你所需要的只是一个像 Nginx 这样的复杂反向代理服务器。它可以根据许多规则/条件(如源 IP、请求标头、特定 URI 等)将请求重定向到多个后端服务器。你可以让反向代理监听 80/443 端口,并让后端在同一台服务器上的其他端口或不同的服务器上运行。
必须在反向代理服务器上配置主域/SSL 以及各种规则。根据规则,反向代理将处理来自特定后端的请求,并且该配置对最终用户永远不可见。

相关内容