nginx正向代理https

发布于:2025-04-09 ⋅ 阅读:(34) ⋅ 点赞:(0)

一、需求

公司内部服务器向外访问腾讯接口: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

常见问题排查
解析失败:

  1. 检查 /etc/dnsmasq.d/custom-hosts 文件格式是否正确。

  2. 查看日志:

journalctl -u dnsmasq --since "5 minutes ago"
  1. 确认防火墙允许UDP 53端口。

  2. 服务无法启动:
    检查配置文件语法:

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

网站公告

今日签到

点亮在社区的每一天
去签到