OpenResty(nginx)配置正向代理绕过企微自建IP限制
搞企业微信开发的都知道,去年开始各种的权限收紧,导致服务商很多时候不得不转做自建,可又加码限制可信IP,导致很多前期方案又迭(重)代(构)一遍.
当时一直在群里给大家说可以配置代理,很多人不清楚怎么使用。今天我自己碰上了这么个场景(阿里商旅集成到企业微信,商旅提供企业微信自建连接器),在配置时让同事记录了配置过程做下分享!
先给大家可以解释下什么是正向代理和反向代理:
图为反向代理服务器
直接点说就是浏览器不直接访问web服务器,而是要通过中间服务器中转访问。
反向代理服务器的好处:
- 隐藏了原始服务器:反向代理充当了 Web 服务器和应用服务器之间的中间层,因此客户端不会直接与原始服务器通信。这使原始服务器的 IP 地址和位置保持安全不受攻击,同时减少了攻击面。
- 负载均衡:反向代理可以将来自多个客户端的流量分发到一组服务器上,从而减轻单个服务器的压力并提高系统的性能和吞吐量。
- 缓存静态内容:反向代理可以缓存经常使用的静态内容(如图像、脚本和页面元素),从而减少客户端请求和服务器响应所需的时间,提高性能并在低带宽条件下提供更好的用户体验。
常见的代理服务器有Nginx、apache、Squid、HAProxy等
图为正向代理服务器
直白说就是所有用户的请求要先经过正向代理服务器才能到达目标站点。
有正向代理服务器,用户端电脑可以控制不直接连接互联网
正向代理服务器的好处:
- 访问控制:通过正向代理,可以对用户访问和使用互联网进行控制,从而保护网络资源和设备的安全性。
- 技术支持:正向代理可以协助内部用户访问互联网,快速访问外部资源,支持内部员工和外部客户进行远程协作和技术支持。
- 访问控制和监控:正向代理可以通过类似于防火墙的方式拒绝或允许外部漏洞扫描,拒绝外部攻击、病毒和恶意软件,同时可以监控用户的访问记录。
- 负载均衡:正向代理可以分配 Web 流量,从而提高网络性能和可用性,使举重若轻的 Web 服务器更具弹性。
- 可缓存:正向代理可以缓存互联网上常见的请求,从而降低了网络负载,提高了响应速度,并降低了带宽成本。
常见的软件有Nginx、apache、Squid、HAProxy(你没看错,前面这几个软件都支持正向和反向代理)、CCProxy等
干货开始,为了让商旅连接器能通过自己服务器的可信IP调用需要配置OpenResty(一个nginx的增加版)
因为企业微信接口为https,默认OpenResty是不能代理的,需要装个扩展https://github.com/chobits/ngx_http_proxy_connect_module;需要重新编译OpenResty,这个在扩展的github主页已经有文档了。也有对应的nginx的说明。
$ wget https://openresty.org/download/openresty-1.19.3.1.tar.gz
$ tar -zxvf openresty-1.19.3.1.tar.gz
$ cd openresty-1.19.3.1
$ ./configure --add-module=/path/to/ngx_http_proxy_connect_module
$ patch -d build/nginx-1.19.3/ -p 1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_101504.patch
$ make && make install
重新安装完后添加一个代理配置
server {
listen 8000;
server_name proxy.domain.com; #替换为自己的域名
resolver 114.114.114.114;
proxy_connect;
proxy_connect_allow 443;
proxy_connect_connect_timeout 30s;
proxy_connect_read_timeout 30s;
proxy_connect_send_timeout 30s;
location / {
proxy_pass $scheme://$http_host$request_uri;
proxy_buffer_size 64k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
proxy_set_header Content-Type $http_content_type;
proxy_set_header Host $http_host;
}
access_log logs/proxy.log;
}
碰到的坑:
1、重新安装完OpenResty后未完全杀死所有nginx进程,配置重新reload不生效
2、listen配置了80端口就请求失败(没再深究,只是服务器又多了条安全组规则)
配置完后写了个代码测试:
package main
import (
"github.com/go-resty/resty/v2"
"log"
)
func main() {
client := resty.New().
SetProxy("http://proxy.domain.com:8000")
resp, err := client.R().Get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=xxx&corpsecret=xxx")
if err != nil {
panic(err)
}
log.Println(resp.String())
}
能正常响应,并且nginx的日志文件中能看到有请求日志,表示当前代码的请求是穿过了当前代理服务器才到达的企业微信服务端。
图为阿里商旅连接器配置
看到这个你是否已经有了绕过企业微信IP限制的方案?
更多分享内容欢迎关注号