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

2025 年 5 月 28 日
 shannn

各位大佬,

我们在给甲方部署一个 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 出口问题的?

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

7514 次点击
所在节点    Go 编程语言
72 条回复
cat
2025 年 5 月 28 日
内部 DNS 不行嘛,解析到有外网访问权限的机器上反代
FrankAdler
2025 年 5 月 28 日
go 的网络库支持指定 proxy ,你可以在 proxy 内分析所有出现的 host ,或者直接代理
lsk569937453
2025 年 5 月 28 日
内网配置 dns 解析,然后解析到代理机上,由代理机统一出口。
minami
2025 年 5 月 28 日
挂透明代理,你这个是 go 项目,不能用 proxychains-ng ,用 graftcp 或者 cgproxy 可以
aladdinding
2025 年 5 月 28 日
搭建一个公网代理服务器,然后让这些 sdk 走代理就行了
lepig
2025 年 5 月 28 日
我觉得分析第三方 SDK 的 host 这个路子就不对,一开始就钻牛角尖了。

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

所有的审计,就审计这一台代理服务就行。
mengzhuo
2025 年 5 月 28 日
HTTPS_PROXY+ NO_PROXY 环境变量就行了啊,当然 SDK 得用的是 DefaultTrans
ohhal
2025 年 5 月 28 日
我们需要先提交所需的“外部域名列表”,然后他们会提供 一一对应的代理地址
yplam
2025 年 5 月 28 日
试试自己实现 net.Resolver , 覆盖掉 net.DefaultResolver
ohhal
2025 年 5 月 28 日
@ohhal 不好意思回车直接回了,直接搞个代理就行啊
dallaslu
2025 年 5 月 28 日
Go 所在主机将所有域名解析到代理机,代理机可自动收集域名并上报给甲方,甲方反馈的代理地址自动应用到代理机规则上。可以使用 Nginx+ETCD+Confd ,加上一个收集上报、写入规则的管理器
vus520
2025 年 5 月 28 日
考虑到有些 SDK 可能会使用自己的 Resolver 和 DefaultTrans ,最简单的方案是 HTTPS_PROXY 环境变量,最复杂和可靠的方案是做流量劫持。
COW
2025 年 5 月 28 日
挂透明代理,第三方 sdk 请求统一走你的代理,代理日志里提取域名列表
macaodoll
2025 年 5 月 28 日
申请域名白名单啊
kidlj
2025 年 5 月 28 日
建议内网搭一个 clash 🐶
zhenlang
2025 年 5 月 28 日
gost 研究一下
sky3hao9
2025 年 5 月 28 日
SDK 都下载下来 , 搭建私有仓库
wwhontheway
2025 年 5 月 28 日
DNS 劫持 + 反向代理
fulln
2025 年 5 月 28 日
申请个内部域名专门走内网代理,用 fasthttp 走设置 http proxy 访问的域名就行。 这个应该很成熟了
name1991
2025 年 5 月 28 日
蹲个答案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1134781

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX