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

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

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

6708 次点击
所在节点    Go 编程语言
72 条回复
realpg
113 天前
@chobitssp #60

这就是举例你懂不懂?

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

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

这个工具的思路是在你的(系统)容器中安装一个自签证书,并且开启一个 socks 代理
有一个 GUI 可以配置转发规则
按照楼上的想法,你可以把它部署在另一台服务器,然后把当前的系统的代理配过去
或者直接在当前系统部署
open9527
112 天前
op 问题解决了吗 等答案呢
wwhontheway
111 天前
op 问题解决了吗 等答案呢
alsas
106 天前
dns 解析到代理服务器统一出口

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

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

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

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

© 2021 V2EX