核心是明确访问主体、来源与方式:生产环境需公网入口收敛与私网纵深隔离,研发测试环境默认全私网、公网仅按需临时开通,并通过隧道、代理或加密通道实现跨环境安全通信。

研发测试环境与生产环境的公网/私网规划,核心不是“要不要用公网”,而是“谁需要被访问、从哪里访问、以什么方式访问”。生产环境必须对外提供服务,公网暴露不可避免;研发测试环境则应默认不暴露公网,只在必要时按需、可控、临时开放。
生产环境:公网入口收敛 + 私网纵深隔离
生产环境面向用户,公网是刚需,但必须严格控制暴露面:
- 统一入口网关:所有公网流量必须经过API网关或WAF(如Nginx+OpenResty、Cloudflare、阿里云ALB),禁止后端服务(如Spring Boot应用、Redis、MySQL)直接绑定0.0.0.0:8080或监听公网IP
- 私网分层划分:在VPC/VLAN内划分至少三类子网——接入层(仅部署网关)、应用层(业务服务,仅允许来自接入层的入向流量)、数据层(数据库、缓存,仅允许来自应用层的入向流量),各层间用安全组或网络ACL强制隔离
- 关键组件禁公网:Redis、Elasticsearch、RabbitMQ等中间件必须绑定内网地址(如10.10.20.5),配置bind 10.10.20.5且protected-mode yes;数据库主库严禁开放任何公网端口,从库如需同步可走内网专线或VPC对等连接
- 出向流量管控:生产服务器默认禁止主动访问公网(如curl外部API、pip install),确需调用第三方服务时,统一经代理出口或白名单域名+端口放行,防止恶意外连或凭证泄露
研发测试环境:默认全私网 + 公网按需临时开通
测试环境不服务真实用户,公网暴露是例外而非常态,目标是“最小必要暴露”:
- 默认无公网IP:云上测试环境建议部署在无公网IP的私有子网中,所有服务仅通过内网通信;本地Docker Compose或K8s Minikube环境天然无公网,无需额外处理
- 调试需公网时走隧道或反向代理:前端联调、移动端测试等场景,不给测试服务器配EIP,而是用SSH隧道(ssh -R 8080:localhost:8080 user@jump-host)或内网穿透工具(如frp、ngrok),将本地服务临时映射到可访问域名
- CI/CD构建机不连公网:Jenkins/GitLab Runner应部署在隔离私网中,通过私有镜像仓库(Harbor)拉取基础镜像,依赖包提前缓存或使用离线安装包,避免构建过程触发意外外网请求
- 测试数据库不暴露端口:测试用MySQL/PostgreSQL容器默认不publish端口(-p不写),仅通过docker network或K8s Service内部解析访问;如需本地Navicat连接,临时加-p 3307:3306并配合防火墙限制源IP(如只允192.168.1.100)
跨环境通信:用加密通道替代直连
当测试环境确实需要访问生产环境某些只读接口(如配置中心、日志查询API),绝不能开放生产防火墙白名单,而应走受控通道:
- 双向TLS网关代理:在生产侧部署一个专用反向代理(如Envoy),仅暴露特定路径(/api/v1/config),要求客户端提供有效mTLS证书;测试环境服务启动时加载该证书,通过内网域名调用
- 跳板机+端口转发:运维人员登录跳板机(Jump Server),再从跳板机SSH到生产数据库或Redis,全程审计留痕;禁止开发直接保存生产密钥到本地配置文件
- 服务网格Sidecar拦截:若已用Istio等服务网格,可在测试命名空间启用egress gateway,所有出向流量经统一出口,并配置策略限制目标域名和HTTP方法(如只允许GET /health)
配置落地要点:自动化校验不可少
光靠文档约定容易失效,必须嵌入自动化检查:
- CI流水线中加入网络合规扫描:用nmap或cloudquery检测测试环境ECS是否绑定了公网IP、安全组是否开放了22/3306/6379等高危端口,失败则阻断发布
- Ansible Playbook部署时,自动注入network_mode: "host"或custom network,并校验容器network字段是否为bridge或自定义网络,拒绝default网络
- Git提交钩子检查.env文件:禁止出现PUBLIC_IP=、ALLOWED_ORIGINS=*、CORS_ENABLED=true等危险配置出现在test分支

















