各位大佬,我们在给甲方部署一个 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 出口问题的?
非常感谢大家宝贵的经验和建议!🙏 如有成熟工具、框架、示例代码或经验文章,也欢迎推荐。
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
这个过程中,你有测试过,具体网关是什么行为嘛,https 降级成 http ,那基本不可能是简单的一个 http/socks 代理那种形式了,因此其他回答里提到的 https_proxy 这种环境变量是白扯的。同样的 DNS 劫持无法实现,因为客户端发起请求时,需要降级到 http ,这一点单纯 DNS 劫持做不到。
相对而言,fork ,改代码可能结果与工期更为可控。非要整花活的话,运行程序的本机,DNS 设置为自己或其他可控的机器,先让原始请求到自己的代理,然后自签证书返回给客户端,你这边的代理,再根据外部域名列表,请求到.my.local 的地址。相当于你自己需要写个代理,先把 https 降级。而且这种情况下,还得原始的 SDK 内没有采用一些证书固定的方案,否则也降级不了。