https正向代理(goproxy、nginx对比)

背景:

很多项目的网络环境都相对安全,有内外网之分,有网闸,有防火墙,有waf等等,通常内网是无法上公网的,外网可以(互联网前置),应用在部署的时候又通常都是部署在内网,但也不免涉及调用第三方互联网接口(如微信、支付宝支付接口,短信接口,认证接口等等),那如何才能让内网代用到公网接口呢,这个时候正向代理服务就是不错的解决方案。

方案一:goproxy

下载:

https://github.com/snail007/goproxy/releases

使用文档:

https://snail007.host900.com/goproxy/manual/zh/#/

功能模块有点强大。这边做http(s)正向代理为主。

Example:

请求https://www.baidu.com
goproxy代理服务器ip:192.168.11.55
客户端ip:192.168.11.87
配置参数并启动goproxy
proxy http -t tcp -p "0.0.0.0:38080" --log proxy.log --daemon
启动本机的38080端口作为代理端口

验证(以windows为例):

A.同网段模拟不能上网的主机
1.清空dns配置

2.在客户端192.168.11.87上配置代理

B.打开浏览器请求https://www.baidu.com

C.关闭代理

D.打开网页

告诉研发,内网java配置直接请求地址协议可以不改,代码要支持走代理,http和https代理的ip和端口是192.168.11.55:38080,例如jar启动参数配置-Dhttps.proxyHost=192.168.11.55 -Dhttps.proxyPort=38080 -Dhttp.proxyHost=192.168.11.55 -Dhttp.proxyPort=38080
优点:方便部署,快捷启动,支持linux和windos,应用配置的请求协议不用改,保持原始https地址,配置正向代理参数就可以直走代理调用https公网接口。
缺点:暂无,不知道甲方安全产品能不能扫出来,有待考察。

方案二:nginx

Nginx正向代理细分三种方案:

1.nginx通过location规则一个个代理https公网接口

这种方法。客户端直接调用内网http请求,http://代理ip:代理port/XXXXX/api

Example:

请求https://api.weixin.com/abc/api
配置
Nginx代理服务器ip:172.16.1.8

server {
        listen 8899;
        charset utf-8;
		 client_max_body_size     50m;
		 access_log logs/access_proxy.log;
		  location ^~ /abc/ {
                proxy_pass https://api.weixin.com;
		    }
		}

告诉研发,内网java配置直接请求http://172.16.1.8:8899/abc/api即可

缺点:

配置繁琐,需要研发罗列出详细的公网接口地址,提供给运维一条一条配置。维护起来也麻烦。

2.nginx直接代理https协议

这种方法,可以说是对上一种方法的延伸(同样内网也是访问http的地址),要求Java应用底层网络连接对象都要提供设置代理的接口,说白了,应用上要改两个地方,1.将代理服务器的ip和端口配置上去;2.java上配置的公网地址https要改成http,因为请求通过nginx才能再转成https,从而实现nginx代理https的目的。

Example:

请求https://api.weixin.com/abc/api
配置
Nginx代理服务器ip:172.16.1.8

server {
   listen 8899;
   charset utf-8;
   resolver 114.114.114.114;
   client_max_body_size     50m;
   access_log logs/proxy.log;
   location / {
        proxy_pass https://$http_host$request_uri;
        set $fixed_destination $http_destination;
		#判断请求的地址是不是http协议,是的话,转换成https
        if ( $http_destination ~* ^http(.*)$ ) {
           set $fixed_destination https$1;
        }
        proxy_set_header Destination $fixed_destination;
        proxy_connect_timeout 10;
        proxy_send_timeout 10;
        proxy_read_timeout 10;
        proxy_redirect     off;
        proxy_set_header Host $http_host;
        proxy_buffers 256 4k;
        proxy_next_upstream error timeout invalid_header http_502;
        proxy_max_temp_file_size 0k;
        proxy_ssl_server_name on;
    }
}

告诉研发,内网java配置直接请求http://api.weixin.com/abc/api,http代理的ip和端口是172.16.1.8:8899
例如jar启动参数配置-Dhttp.proxyHost=172.16.1.8 -Dhttp.proxyPort=8899

验证:

curl --proxy 172.16.1.8:8899 http://api.weixin.com/abc/api
或者加入linux全局环境变量做代理直接curl进行验证
echo “export HTTP_PROXY=http://172.16.1.8:8899” >>/etc/profile && source /etc/profile

缺点:

改变应用配置的请求协议(https----->http),配置的管理也是相对繁琐混乱。

3.通过nginx第三方模块ngx_http_proxy_connect_module代理https协议

https://github.com/chobits/ngx_http_proxy_connect_module
这种方法,就要重新编译nginx,将第三方模块编译进去。目前该模块支持nginx和openresty,找对应版本的模块。

编译步骤:

Example:

请求https://api.weixin.com/abc/api
配置
Nginx代理服务器ip:172.16.1.8

server {
    listen 8899;
    charset utf-8;
    resolver 114.114.114.114;
    client_max_body_size     50m;
    access_log logs/proxy.log;

    #引用ngx_proxy模块
    proxy_connect;
    proxy_connect_allow            443 80;
    proxy_connect_connect_timeout  10s;
    proxy_connect_read_timeout     10s;
    proxy_connect_send_timeout     10s;

    location / {
        proxy_pass $scheme://$http_host$request_uri;
        proxy_connect_timeout 10;
         proxy_send_timeout 10;
         proxy_read_timeout 10;
         proxy_redirect     off;
         proxy_set_header Host $http_host;
         proxy_buffers 256 4k;
         proxy_next_upstream error timeout invalid_header http_502;
         proxy_max_temp_file_size 0k;
        proxy_ssl_server_name on;
    }
}

告诉研发,内网java配置直接请求地址协议可以不改,http和https代理的ip和端口是172.16.1.8:8899
例如jar启动参数配置-Dhttps.proxyHost=172.16.1.8 -Dhttps.proxyPort=8899 -Dhttp.proxyHost=172.16.1.8 -Dhttp.proxyPort=8899

验证:

curl --proxy 172.16.1.8:8899 https://api.weixin.com/abc/api
或者加入linux全局环境变量做代理直接curl进行验证
echo “export HTTP_PROXY=http://172.16.1.8:8899” >>/etc/profile && source /etc/profile

优点:

应用配置的请求协议不用改,保持原始https地址,配置正向代理参数就可以直走代理调用https公网接口。

缺点:

1.当Nginx发现高危漏洞且Nginx官网出了新版本修复漏洞,且甲方聘请的安全厂家第一时间漏洞预警要求升级,一定要保佑第三方模块支持的版本和Nginx官网新出的版本适配,不然的话,编译可能会出问题,https正向代理也可能会不好使,从而导致漏洞无法修复。
2.生产的nginx不一定只配置了https正向代理这一个功能,估计还有很多生产的配置,不动则已,要动,牵一发而动全身,升级维护比较麻烦。

总结:
goproxy取胜,需编写个windows版本的bat和linux的shell的快速部署脚本,方便项目部署使用。

posted @ 2023-03-02 16:21  海yo  阅读(2725)  评论(0编辑  收藏  举报