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

112 天前
 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 出口问题的?

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

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

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

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

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

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

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

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

© 2021 V2EX