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

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

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

6701 次点击
所在节点    Go 编程语言
72 条回复
z44z8kDw76Vt3Pz1
113 天前
在外网编译好做成系统镜像在安装到内网不就行了。
iguess
113 天前
显然不让你自行出公网,所以自己配代理是行不通的。 还是开发一个小工具来自动批处理你的 SDK 源码吧
name1991
113 天前
@shannn #40 这个听上去就很合理。。。
partner666
113 天前
@Augix #26 测试了一下 这可行,关键是信任根证书
shannn
113 天前
@Augix 刚才和公司擅长网络的同学聊了下,也是这个思路。服务埋自签证书,通过改 host 或 iptables 去转发到代理服务,代理服务再卸载和转发
lolico
113 天前
透明网关+dns 劫持,完全透明无侵入的做法,不需要自签名证书
lolico
113 天前
@lolico 可以不需要 dns 劫持,直接服务器使用的 dns 服务器也可以,类似家庭网络里单独搞一个网关出口走代理的做法
loushizan
113 天前
感觉可以参考 sing-box ,http Inbound 和 http Outbound
只是一个思路
edisonwong
113 天前
GO_PROXY 到固定的(能访问外网的机器)
edisonwong
113 天前
@edisonwong 接上,软路由,网关等都可以
wanglong167
113 天前
frp
kinkin666
113 天前
光搞代理没用的,一般还得帮他们把第三方库的合规审计问题处理掉

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

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

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

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

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

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

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

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

© 2021 V2EX