我有一个非常具体的问题,看起来像是以前被问过的问题,但我认为它有点不同,而且并不是一个常见的情况。
是否可以运行多个内部(网络)服务器,运行于单一主机, 使用单个域, 和单个 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 以及各种规则。根据规则,反向代理将处理来自特定后端的请求,并且该配置对最终用户永远不可见。