The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
shannn

[求助] Go 项目中大量第三方 SDK 需要访问外部域名,但甲方要求全部走内网代理,有哪些优雅处理方式?

  •  2
     
  •   shannn · May 28, 2025 · 9235 views
    This topic created in 527 days ago, the information mentioned may be changed or developed.

    各位大佬,

    我们在给甲方部署一个 Go 项目 时,遇到一个关于外部网络访问受限的问题,想请教有没有通用、优雅的解决方案。

    ✅ 背景信息:

    1. 项目使用 Go 编写,集成了多个第三方 SDK ,比如:
    	•	阿里云 SDK ( Aliyun )
    	•	AWS SDK
    	•	Let’s Encrypt (自动申请证书)
    	•	其他 RESTful API 客户端
    2. 这些 SDK 会直接访问公网域名,比如:
    	•	https://alidns.aliyuncs.com
    	•	https://acme-v02.api.letsencrypt.org
    	•	https://sts.amazonaws.com
    

    🚧 甲方网络要求:

    1.	甲方有严格的出口策略,服务器不能直接访问公网。
    2.	所有流量必须经过其提供的 内网网关,并统一审计。
    3.	我们需要先提交所需的“外部域名列表”,然后他们会提供 一一对应的代理地址,比如:
    	•	https://alidns.aliyuncs.com → http://alidns.my.local
    	•	https://acme-v02.api.letsencrypt.org → http://acme.my.local
    4.	服务实际运行时,必须通过这些映射地址访问外部服务。
    

    ⛰️我们面临的核心挑战是:

    1.	Go 项目中大量使用第三方 SDK ,这些 SDK 会直接访问外部域名。
    2.	我们不想直接修改 SDK 的代码,不想维护一堆 fork 。
    3.	域名数量多、来源复杂,难以完全靠手工收集和配置。
    

    🤔 当前尝试:

    1.	部分 SDK (如 AWS )提供了自定义 Endpoint 的设置方式,我们可以通过代码配置替换了对应的 URL 。
    2.	其他 SDK (如 tencentcloud go sdk 、Aliyun Go SDK ):
    	•	有的不支持 endpoint 替换,或者是在计算签名要包含 host 参数
    	•	有的需要深度改代码或 fork
    3.	考虑过系统层或中间层方案,比如:
    	•	hosts 劫持(不适用于 HTTPS + SNI )
    	•	本地 HTTP 代理 + 域名重写(如 mitmproxy 、squid )
    	•	iptables + redsocks 实现透明代理(过于复杂)
    	•	Go 中自定义 http.Transport + DialContext:受限于 SDK 能否复用全局 http.Client
    

    ❓想请教大家:

    1.	有没有通用方式拦截 Go 项目中 SDK 发起的 HTTPS 请求,并做统一的域名映射或代理转发?
    	•	比如运行时 Hook 、网络中间层、标准库配置等。
    2.	是否有成熟的内网网关代理解决方案(支持 hostname 映射、HTTPS 转发)适合这种场景?
    3.	有没有人做过类似政企、金融、军工、政府等受限内网部署,你们是怎么处理第三方 SDK 出口问题的?
    

    非常感谢大家宝贵的经验和建议!🙏 如有成熟工具、框架、示例代码或经验文章,也欢迎推荐。

    Supplement 1  ·  May 28, 2025
    📝 补充说明:
    甲方提供的代理地址是 HTTP 协议 的(他们有审计要求),例如:
    https://alidns.aliyuncs.com → http://alidns.my.local 。

    而我们项目中大量 SDK 请求是基于 HTTPS 协议 的,这就要求我们在实际方案中进行 HTTPS → HTTP 的协议转换
    72 replies  •  2025-06-05 17:14:05 +08:00
    cat
    cat
    May 28, 2025❤️2
    1
    内部 DNS 不行嘛,解析到有外网访问权限的机器上反代
    FrankAdler
    FrankAdler
    May 28, 2025 via Android
    2
    go 的网络库支持指定 proxy ,你可以在 proxy 内分析所有出现的 host ,或者直接代理
    lsk569937453
    lsk569937453
    May 28, 2025
    3
    内网配置 dns 解析,然后解析到代理机上,由代理机统一出口。
    minami
    minami
    May 28, 2025
    4
    挂透明代理,你这个是 go 项目,不能用 proxychains-ng ,用 graftcp 或者 cgproxy 可以
    aladdinding
    aladdinding
    May 28, 2025
    5
    搭建一个公网代理服务器,然后让这些 sdk 走代理就行了
    lepig
    lepig
    May 28, 2025❤️3
    6
    我觉得分析第三方 SDK 的 host 这个路子就不对,一开始就钻牛角尖了。

    简单的方法就是项目基本不做变动,而且想办法将所有请求劫持打到一台代理服务上,让这个代理服务去访问公网。

    所有的审计,就审计这一台代理服务就行。
    mengzhuo
    mengzhuo
    May 28, 2025
    7
    HTTPS_PROXY+ NO_PROXY 环境变量就行了啊,当然 SDK 得用的是 DefaultTrans
    ohhal
    ohhal
    May 28, 2025
    8
    我们需要先提交所需的“外部域名列表”,然后他们会提供 一一对应的代理地址
    yplam
    yplam
    May 28, 2025
    9
    试试自己实现 net.Resolver , 覆盖掉 net.DefaultResolver
    ohhal
    ohhal
    May 28, 2025
    10
    @ohhal 不好意思回车直接回了,直接搞个代理就行啊
    dallaslu
    dallaslu
    May 28, 2025
    11
    Go 所在主机将所有域名解析到代理机,代理机可自动收集域名并上报给甲方,甲方反馈的代理地址自动应用到代理机规则上。可以使用 Nginx+ETCD+Confd ,加上一个收集上报、写入规则的管理器
    vus520
    vus520
    May 28, 2025
    12
    考虑到有些 SDK 可能会使用自己的 Resolver 和 DefaultTrans ,最简单的方案是 HTTPS_PROXY 环境变量,最复杂和可靠的方案是做流量劫持。
    COW
    COW
    May 28, 2025 via Android
    13
    挂透明代理,第三方 sdk 请求统一走你的代理,代理日志里提取域名列表
    macaodoll
    macaodoll
    May 28, 2025
    14
    申请域名白名单啊
    kidlj
    kidlj
    May 28, 2025
    15
    建议内网搭一个 clash 🐶
    zhenlang
    zhenlang
    May 28, 2025
    16
    gost 研究一下
    sky3hao9
    sky3hao9
    May 28, 2025
    17
    SDK 都下载下来 , 搭建私有仓库
    wwhontheway
    wwhontheway
    May 28, 2025
    18
    DNS 劫持 + 反向代理
    fulln
    fulln
    May 28, 2025
    19
    申请个内部域名专门走内网代理,用 fasthttp 走设置 http proxy 访问的域名就行。 这个应该很成熟了
    name1991
    name1991
    May 28, 2025
    20
    蹲个答案
    lysShub
    lysShub
    May 28, 2025
    21
    替换 net.DefaultResolver
    nuk
    nuk
    May 28, 2025
    22
    可以不改 SDK ,直接改官方库,然后 map 一下地址
    crackidz
    crackidz
    May 28, 2025
    23
    环境变量就行,你们内部接口不需要走代理的就自己单独初始一个不用代理的 client
    zljklang
    zljklang
    May 28, 2025
    24
    写 hosts 文件嘛
    realpg
    realpg
    May 28, 2025
    25
    全局代理, 代理处分流
    用 ss 那种带分流的代理软件...
    Augix
    Augix
    May 28, 2025❤️1
    26
    透明代理又不能 HTTPS 转 HTTP ,你这只能 DNS 劫持+自签证书+Nginx 转发到上游 HTTP 地址
    ntdll
    ntdll
    May 28, 2025❤️1
    27
    怕是有点难办

    https://alidns.aliyuncs.com → http://alidns.my.local

    这个过程中,你有测试过,具体网关是什么行为嘛,https 降级成 http ,那基本不可能是简单的一个 http/socks 代理那种形式了,因此其他回答里提到的 https_proxy 这种环境变量是白扯的。

    同样的 DNS 劫持无法实现,因为客户端发起请求时,需要降级到 http ,这一点单纯 DNS 劫持做不到。

    相对而言,fork ,改代码可能结果与工期更为可控。

    非要整花活的话,运行程序的本机,DNS 设置为自己或其他可控的机器,先让原始请求到自己的代理,然后自签证书返回给客户端,你这边的代理,再根据外部域名列表,请求到.my.local 的地址。

    相当于你自己需要写个代理,先把 https 降级。

    而且这种情况下,还得原始的 SDK 内没有采用一些证书固定的方案,否则也降级不了。
    IndexOutOfBounds
    IndexOutOfBounds
    May 28, 2025 via Android❤️1
    28
    问题表达形式不错呀
    freemoon
    freemoon
    May 28, 2025
    29
    第三方不支持替换 url 的 sdk 能有多少?改代码可能还是最靠谱的。
    ksedz
    ksedz
    May 28, 2025
    30
    隔离环境最好用的还是 go mod vendor
    ksedz
    ksedz
    May 28, 2025
    31
    看错了,忽略吧
    shannn
    shannn
    OP
    May 28, 2025
    32
    @lasuar 不想改腾讯云的 go sdk 了
    kekxv
    kekxv
    May 28, 2025
    33
    看起来只有几个 sdk ,最合适的方法,应该是直接 fork 他们的仓库,然后加上参数或者配置之后,给他们提交 pr ,这样就不需要自己单独维护一套代码
    ansuanboy
    ansuanboy
    May 28, 2025
    34
    可以使用双层代理,
    向甲方申请一个代理出口到你们公司自己的公网代理入口
    然后自己写代码创建一个 http 代理服务器,代理所有 SDK 请求包并自定义封装一层。
    再通过甲方的代理出口代理到你们自己的公网代理服务入口,解包发出实际请求,再将响应内容返回
    整个过程只涉及四层网络结构,http\https 都可以穿透
    chf007
    chf007
    May 28, 2025
    35
    一般第三方 sdk ,域名这种变量,一般都会暴露配置出来的啊,你们用的时候都不配置一下的么?或初始化时配置,或通过环境变量配置,只要把这些集中管理一下就行了。
    mooyo
    mooyo
    May 28, 2025
    36
    你这个咋看着像 fake ip ,和 fake ip 实现类似吧?
    flat
    flat
    May 28, 2025
    37
    如果甲方允许在代理服务器上部署代理,那就很简单,直接用代理就行。但是如果不行,就只能看原本的 sdk 支持不支持域名替换了。前面那些内网 dns 的啥的,都不行,你配置解析到那个代理服务器有啥用,那个机器上又没有类似 nginx 的东西监听你原本的这个域名。只监听了人家给你提供的新域名。
    flat
    flat
    May 28, 2025
    38
    @flat

    一般的 http 库都支持这几个环境变量,配置下就能用,但是只是走代理
    export HTTP_PROXY=http://127.0.0.1:8888
    export HTTPS_PROXY=http://127.0.0.1:8888
    export NO_PROXY=localhost,127.0.0.1
    zxp
    zxp
    May 28, 2025
    39
    在公网上部署 1 个接口服务,设置成通过 a.com 域名访问,把需要访问外部域名的第三方 SDK 全部剥离出来集成到接口服务上,内网开放 1 个可以访问接口服务的代理域名,内网应用只需要通过代理域名访问这个接口服务就行了。
    shannn
    shannn
    OP
    May 28, 2025
    40
    @chf007

    我们这边不考虑走 SDK 层配置 endpoint 的方案了,主要原因有两个:
    1. 不同 SDK 支持程度不一,有的可以配,有的只能改源码;
    2. 后续维护成本高,一旦 SDK 升级或接入新的 SDK ,就得重新梳理和适配,影响开发效率。

    我们更倾向于类似代理转发方案,这样:
    • 能集中发现和整理 SDK 中访问的外部域名;
    • 和甲方的域名映射策略配合更灵活;
    • 后续不需要动业务代码,部署也更可控。
    z44z8kDw76Vt3Pz1
    z44z8kDw76Vt3Pz1
    May 28, 2025
    41
    在外网编译好做成系统镜像在安装到内网不就行了。
    iguess
    iguess
    May 28, 2025
    42
    显然不让你自行出公网,所以自己配代理是行不通的。 还是开发一个小工具来自动批处理你的 SDK 源码吧
    name1991
    name1991
    May 28, 2025
    43
    @shannn #40 这个听上去就很合理。。。
    partner666
    partner666
    May 28, 2025
    44
    @Augix #26 测试了一下 这可行,关键是信任根证书
    shannn
    shannn
    OP
    May 28, 2025
    45
    @Augix 刚才和公司擅长网络的同学聊了下,也是这个思路。服务埋自签证书,通过改 host 或 iptables 去转发到代理服务,代理服务再卸载和转发
    lolico
    lolico
    May 28, 2025
    46
    透明网关+dns 劫持,完全透明无侵入的做法,不需要自签名证书
    lolico
    lolico
    May 28, 2025
    47
    @lolico 可以不需要 dns 劫持,直接服务器使用的 dns 服务器也可以,类似家庭网络里单独搞一个网关出口走代理的做法
    loushizan
    loushizan
    May 28, 2025
    48
    感觉可以参考 sing-box ,http Inbound 和 http Outbound
    只是一个思路
    edisonwong
    edisonwong
    May 28, 2025
    49
    GO_PROXY 到固定的(能访问外网的机器)
    edisonwong
    edisonwong
    May 28, 2025
    50
    @edisonwong 接上,软路由,网关等都可以
    wanglong167
    wanglong167
    May 28, 2025
    51
    frp
    kinkin666
    kinkin666
    May 28, 2025
    52
    光搞代理没用的,一般还得帮他们把第三方库的合规审计问题处理掉

    得把所有跟互联网第三方相关东西包起来布你们自己服务器上,甲方专线调你们,你们公网往外走

    也可以考虑把这个转发程序包成一个 docker 放他们 dmz 区,这样甲方就只用搞定你们这个镜像的合规审计问题了
    BeGoood
    BeGoood
    May 28, 2025
    53
    @lolico 只是透明网关+DNS 劫持不行吧,这个场景中涉及到 HTTPS -> HTTP, SSL 卸载必须做中间人,信任自签证书才能解决吧。
    realpg
    realpg
    May 28, 2025❤️1
    54
    @kekxv #33
    不具备可行性

    我举个不恰当的例子
    假如你是微信支付 sdk
    你的内部写死了 服务器地址是 pay.weixin.qq.com

    然后你提个 pr 允许自己配置服务器地址 为野鸡 URL
    你觉得会是啥结果
    kekxv
    kekxv
    May 29, 2025 via iPhone
    55
    @realpg #54 为啥要把地址写上去呢?读环境变量,或者配置刷新,等都可以
    Phasma
    Phasma
    May 29, 2025
    56
    假如甲方的设备 不知道能不能 https 审计 用 sniproxy
    realpg
    realpg
    May 29, 2025
    57
    @kekxv #55
    我微信支付的 sdk 我不把我自己微信支付的服务器地址写进去?
    我工商银行的 sdk 我不把工商银行的 IP 写进去?
    paragon
    paragon
    May 29, 2025
    58
    在外面搭好项目 go vendor 再从里面把项目 clone 进去~
    chobitssp
    chobitssp
    May 29, 2025
    59
    换支持 endpoint 配置的 sdk
    chobitssp
    chobitssp
    May 29, 2025
    60
    realpg
    realpg
    May 29, 2025
    61
    @chobitssp #60

    这就是举例你懂不懂?

    人家自己 sdk 都把容灾切换都写好了 那是 SDK 不是 API SAMPLE

    你连 sdk 和 api 都没搞明白吧
    realpg
    realpg
    May 29, 2025
    63
    @chobitssp #62
    你是真不看贴 block 了 不用回我了
    lolico
    lolico
    May 29, 2025 via iPhone
    64
    @BeGoood 单纯把流量转到某一个代理机走代理访问是可以的,不需要自签证书。但如果还要审计之类的就另说
    yunpiao111
    yunpiao111
    May 29, 2025
    65
    我之前做的透明代理方案, 把 sdk 的流量全劫持过来, 转发到 clash, 之后再 calsh 里面写匹配规则, 使用不同的 http 代理或者 socks 代理
    Ramoncjs
    Ramoncjs
    May 29, 2025
    66
    @IndexOutOfBounds #28 +1 背景和需求写的非常清楚,当前的进度和难点也一清二白,一次性把事儿说清楚很厉害。
    iuser
    iuser
    May 29, 2025
    67
    安装一个自签证书,做 https 劫持 + 搭一个 nginx ,实现 https 降级+hosts 替换+下一跳指向+把要劫持的域名配 host 指到 nginx 上 可能可行
    PopRain
    PopRain
    May 29, 2025
    68
    都走 Http , 所有的信息都可以被抓包,不知道是为了安全还是为了不安全
    leokun
    leokun
    May 30, 2025
    69
    用站里面大佬写的 whistle 可以很轻松配置这样的代理

    这个工具的思路是在你的(系统)容器中安装一个自签证书,并且开启一个 socks 代理
    有一个 GUI 可以配置转发规则
    按照楼上的想法,你可以把它部署在另一台服务器,然后把当前的系统的代理配过去
    或者直接在当前系统部署
    open9527
    open9527
    May 30, 2025
    70
    op 问题解决了吗 等答案呢
    wwhontheway
    wwhontheway
    May 31, 2025
    71
    op 问题解决了吗 等答案呢
    alsas
    alsas
    Jun 5, 2025
    72
    dns 解析到代理服务器统一出口
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5553 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 105ms · UTC 03:36 · PVG 11:36 · LAX 19:36 · JFK 22:36
    ♥ Do have faith in what you're doing.