一、需求
公司内部服务器向外访问腾讯接口:https://qyapi.weixin.qq.com/cgi-bin,不能使用http直接访问。并且不支持域名,还需要设置互联网出口-出向白名单ip。
如何在尽量少改动代码的情况下实现应用的出向访问链接,考虑使用正向代理服务器实现SSL请求的隧道,支持https请求。
二、操作步骤
1. 确认服务器对外ip白名单已添加
先获取域名对应的ip地址:直接ping域名可以获取到qyapi.weixin.qq.com解析地址是117.185.253.167
C:\Users\Lenovo>ping qyapi.weixin.qq.com
正在 Ping qyapi.weixin.qq.com [117.185.253.167] 具有 32 字节的数据:
来自 117.185.253.167 的回复: 字节=32 时间=27ms TTL=46
如果服务器支持对外访问,curl可以收到返回值,
curl https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
服务器不支持,只能使用ip:
curl "https:// 117.185.253.167 /cgi-bin/gettoken?corpid=ID&corpsecret=SECRET" -H "Host:qyapi.weixin.qq.com" -k
能正常返回说明可以通。更简单的直接ping
2. 为nginx添加正向代理
2.1 下载ngx_http_proxy_connect_module模块
https://gitcode.com/gh_mirrors/ng/ngx_http_proxy_connect_module/tree/master
此模块提供了对连接(CONNECT)方法请求的支持。这种方法主要用于通过代理服务器实现SSL请求的隧道。
2.2 nginx安装模块
nginx版本和ngx_http_proxy_connect_module补丁文件的版本相关,按需下载nginx版本
我需要的是proxy_connect_rewrite_102101.patch,直接把proxy_connect_rewrite_102101.patch重命名为proxy_connect.patch
$ wget http://nginx.org/download/nginx-1.23.2.tar.gz
$ tar -xzvf nginx-1.23.2.tar.gz
$ cd nginx-1.23.2/
$ patch -p1 < /home/nginx/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-dynamic-module=/home/nginx/ngx_http_proxy_connect_module --modules-path=/home/nginx/modules --prefix=/home/nginx/nginx --with-http_ssl_module --with-http_realip_module --with-stream --with-stream_ssl_module
$ make && make install
nginx 版本 | 启用重写阶段 | 补丁文件 |
---|---|---|
1.4.x ~ 1.12.x | 不启用 | proxy_connect.patch |
1.4.x ~ 1.12.x | 启用 | proxy_connect_rewrite.patch |
1.13.x ~ 1.14.x | 不启用 | proxy_connect_1014.patch |
1.13.x ~ 1.14.x | 启用 | proxy_connect_rewrite_1014.patch |
1.15.2 | 启用 | proxy_connect_rewrite_1015.patch |
1.15.4 ~ 1.16.x | 启用 | proxy_connect_rewrite_101504.patch |
1.17.x ~ 1.18.x | 启用 | proxy_connect_rewrite_1018.patch |
1.19.x ~ 1.21.0 | 启用 | proxy_connect_rewrite_1018.patch |
1.21.1 ~ 1.22.x | 启用 | proxy_connect_rewrite_102101.patch |
1.23.x ~ 1.24.0 | 启用 | proxy_connect_rewrite_102101.patch |
1.25.0 ~ 1.25.x | 启用 | proxy_connect_rewrite_102101.patch |
2.3 nginx配置文件
安装nginx后可以到modules文件下面查看是否生成了ngx_http_proxy_connect_module.so,
nginx.conf 中显式加载模块,注意要在events,http模块之前定义
load_module /path/to/modules/ngx_http_proxy_connect_module.so;
nginx配置文件修改
server {
listen 3128 ssl;
# 正向代理使用的 DNS 解析器,这个可以找一个通用版,我是改为dns服务器的地址
resolver 8.8.8.8;
# 对于 CONNECT 请求的正向代理
proxy_connect;
proxy_connect_allow 443;
proxy_connect_connect_timeout 10s;
proxy_connect_data_timeout 10s;
# 非 CONNECT 请求的自定义配置(例如:非 CONNECT 请求的反向代理)
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
如果服务器支持域名访问,到此配置结束,启动nginx验证效果
curl -x 127.0.0.0:3128 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
3. 本地服务器安装dns服务
在本地网络或服务器上搭建DNS服务器,实现域名到IP的自定义解析:
BIND9:功能全面,适合复杂需求(如内部域名系统、反向解析)。
dnsmasq:轻量级,适合简单场景(仅需解析少量域名,同时支持DHCP)。
场景简单搭建的是dnsmasq。
3.1 linux安装dnsmasq
需要使用root用户
# CentOS/RHEL
sudo yum install dnsmasq -y
# Ubuntu/Debian
sudo apt install dnsmasq -y
3.2 查看安装结果并配置
sudo vim /etc/dnsmasq.conf
应该有默认的文件夹设置,不用改:
conf-dir=/etc/dnsmasq.d/,*.conf
直接到/etc/dnsmasq.d/下创建配置文件test.conf
输入
address=/qyapi.weixin.qq.com/117.185.253.167
3.3 测试配置文件启动服务
dnsmasq --test
没问题启动服务
systemctl start dnsmasq
查看端口是否启动
netstat -nltp|grep 53
配置客户端使用本地DNS
# 临时修改(重启失效)
sudo echo "nameserver [你的Linux服务器IP]" > /etc/resolv.conf
# 永久修改(以NetworkManager为例)
sudo nmcli con modify [网卡名] ipv4.dns "[你的Linux服务器IP]"
sudo nmcli con up [网卡名]
验证解析结果
dig qyapi.weixin.qq.com @127.0.0.1
成功后修改nginx配置文件dns服务器地址,然后可以测试
curl -x 127.0.0.0:3128 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
3.4 扩展
启动服务并设置开机自启
sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq
dnsmasq.conf
# 指定本地解析文件路径
addn-hosts=/etc/dnsmasq.d/custom-hosts
# 禁用从上游DNS获取解析(仅使用本地配置)
no-resolv
# 或指定上游DNS(如同时需要公共解析)
# server=8.8.8.8
配置客户端使用本地DNS
# 临时修改(重启失效)
sudo echo "nameserver [你的Linux服务器IP]" > /etc/resolv.conf
# 永久修改(以NetworkManager为例)
sudo nmcli con modify [网卡名] ipv4.dns "[你的Linux服务器IP]"
sudo nmcli con up [网卡名]
防火墙配置
# CentOS/RHEL
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload
# Ubuntu/Debian
sudo ufw allow 53/udp
常见问题排查
解析失败:
检查 /etc/dnsmasq.d/custom-hosts 文件格式是否正确。
查看日志:
journalctl -u dnsmasq --since "5 minutes ago"
确认防火墙允许UDP 53端口。
服务无法启动:
检查配置文件语法:
dnsmasq --test
扩展功能
泛域名解析:
在 custom-hosts 中添加:
183.47.100.66 .weixin.qq.com # 解析所有子域名
反向解析:
编辑 /etc/dnsmasq.conf,添加:
ptr-record=66.100.47.183.in-addr.arpa qyapi.weixin.qq.com