一、场景
1、场景描述
- 在客户的场景中,有两台测试服务windows server系统,无法访问外网。
- 测试服务器中运行的业务程序,需要访问有几个公网域名。
- 场景中还有一台代理服务器 ,它可以访问外网,也可以通两台测试服务器;
系统架构图如下。
2、需求
两台不能访问外网的测试服务器里面的程序,需要访问外网的几个固定域名。
3、解决方法
- 正向代理:代理服务器的nginx配置正向代理,为后面的测试服务器代理全部访问【限制条件是程序需要支持识别代理】。
- 反向代理:代理业务程序所使用到的域名,使访问请求通过代理出去。
二、反向代理配置
1、公共域名http的反向代理
- 反向代理公共域名,将内网服务器的http请求,代理转发至原本的域名中。
- 例如 www.tyun.cn 代理转发至www.tyun.cn。
nginx配置
2、公共域名https的反向代理
- 由于这次需要代理转发是其他公共域名,所以代理服务器没有这些公共域名的https证书,公共域名的IP也是会变动的,需要能够不提示证书问题,并且能够根据域名对应代理转发。
- 所以通过4层转发,并且4层代理通过使用域名的形式,转发至原本的域名中。
- 例如 www.tyun.cn代理转发至www.tyun.cn。
(1)nginx的ssl_preread
nginx的ssl_preread介绍:
Nginx 开始支持 SSL 的 ssl_preread 功能是在版本 1.9.0 中引入的。
ssl_preread 是 Nginx 的 Stream 模块中的一个指令,用于在 SSL 握手之前读取客户端发送的数据,通常用于提前获取客户端发送的信息,比如域名,从而根据这些信息做出代理或路由决策。这在反向代理和负载均衡的场景中特别有用。
以下是关于 ssl_preread 的详细描述:
功能介绍: ssl_preread 允许 Nginx 在 SSL/TLS 握手的早期阶段读取客户端发送的数据,包括 ClientHello 消息。这样做的目的是为了从握手的预读取数据中获取一些信息,以便在接下来的代理和路由过程中做出更明智的决策。
使用场景: ssl_preread 常用于以下场景:
- 根据客户端发送的域名(SNI)将流量代理到不同的后端服务器。
- 根据不同的协议或应用层协议(如 HTTP、SMTP、POP3 等)将流量路由到不同的后端服务器。
(2)nginx配置
安装nginx配置:
nginx编译安装需要添加特定模块。
nginx配置文件
这里需要业务系统中使用了几个域名就要配置几个upstream。
(3)无外网win server服务器配置
需要配置hosts文件将域名指向代理服务器中。
C:\Windows\System32\drivers\etc\hosts。
三、正向代理解决方案
1、正向代理存在的一些问题
正向代理配置之后,需要业务程序中本身支持读取系统中的代理配置。
2、配置正向代理
nginx正向代理,默认的nginx的无法支持https的访问,需要添加github上开源的proxy_connect模块,模块的链接如下 https://github.com/chobits/ngx_http_proxy_connect_module/。
编译安装nginx1.23 并添加开源的模块。
配置nginx
3、无外网win server服务器配置
- 配置完成后,经过验证服务器上的浏览器是可以正常代理http https类型都是没有问题的。
- 业务系统无法走代理,因为程序不会自动使用系统设置的代理,而需要单独进行代理配置。
4、使用ptyhon获取系统代理配置示例
以下展示了一段Python的代码,来展示如何获取Windows server系统的代理,并使用该代理,访问公网。