假设内网的 IP 是 192.168.1.100,域名为 internal.example.com

前提条件
  1. 代理服务器192.168.1.100,将其解析为 internal.example.com
  2. HAProxy 服务器:负责将请求转发到 Nginx。
  3. Nginx 服务器:负责处理最终的请求。
步骤 1:配置 /etc/hosts

在客户端或者需要解析 internal.example.com 的机器上,编辑 /etc/hosts 文件,添加如下内容:

192.168.1.100 internal.example.com
  • 1.

这样,当访问 https://internal.example.com 时,会通过 192.168.1.100 传递请求。

步骤 2:配置 HAProxy 服务器

编辑 HAProxy 配置文件 /etc/haproxy/haproxy.cfg,添加如下内容:

frontend https-in
    bind *:443 ssl crt /path/to/ssl_cert.pem no-sslv3 # 监听443端口并启用SSL
    mode tcp
    option tcplog

    default_backend default

backend default
    mode tcp
    server default 127.0.0.1:9443
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

重启 HAProxy 服务以应用新配置:

sudo systemctl restart haproxy
  • 1.
步骤 3:配置 Nginx 服务器

在 Nginx 服务器上,使用 stream 模块进行反向代理。编辑 Nginx 配置文件,例如 /etc/nginx/nginx.conf 或者专用的流配置文件(如 /etc/nginx/conf.d/stream.conf):

stream {
    map $ssl_preread_server_name $ssl_proxy_upstream {
        default                    $ssl_preread_server_name:443;
        ""                         127.0.0.1:8443; # 当域名为空时的默认地址
    }

    upstream backend {
        server $ssl_proxy_upstream;
    }

    server {
        listen 9443 ssl_preread; # 监听9443端口,开启SSL预读

        proxy_pass backend;

        resolver 100.100.2.136 100.100.2.138; # 使用阿里云的DNS解析
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

请务必确认已经启用了 ssl_preread 模块和相关配置。

重启 Nginx 服务以应用新配置:

sudo systemctl restart nginx
  • 1.
流程总结
  1. 访问 https://internal.example.com
  • 客户端访问 https://internal.example.com,根据 /etc/hosts 将域名解析为 192.168.1.100
  1. 代理服务器 (192.168.1.100) 转发到 HAProxy
  • 请求通过代理服务器进入 HAProxy。
  1. HAProxy 处理请求并转发到 Nginx
  • HAProxy 接收请求并将流量转发到 Nginx 的 127.0.0.1:9443
  1. Nginx 获取握手过程中的请求域名并解析
  • Nginx 使用 ssl_preread 获取到 SSL 握手阶段的请求域名。
  • 基于获取到的域名,使用 map$ssl_preread_server_name 映射为 $ssl_proxy_upstream
  • 如果域名为空,则默认走 127.0.0.1:8443
  1. Nginx 使用阿里云 DNS 解析并转发
  • Nginx 通过阿里云 DNS (resolver 100.100.2.136 100.100.2.138) 解析域名。
  • 最终请求由 proxy_pass backend 发往解析后的地址。

通过以上步骤,可以确保在访问 https://internal.example.com 时,通过一系列的代理和转发,最终将请求安全地传递到目标地址。