数据库放进私有子网并配合安全组收紧入站,是当前云上数据库防护最有效且成本最低的路径,核心做法只有一句话:让数据库没有公网IP,只对指定来源IP和端口放行。
这套方案几乎所有主流云平台都支持,包括简米云、酷番云、华为云和AWS,数据库实例没有公网地址,意味着攻击者根本无法从互联网直接发起连接,安全组的规则再收紧,相当于给数据库上了双保险,下面从架构原理、配置步骤到常见问题逐一拆开讲。
数据库放私有子网,到底解决了什么问题
很多团队把数据库部署在公有子网,同时开启了公网访问端口,方便本地调试或临时运维,但公网端口每多暴露一分钟,被扫描和爆破的概率就高一分,据国内云安全厂商近年发布的威胁报告,针对数据库的暴力破解攻击中,相当一部分攻击流量来自公网扫描器,而攻击目标恰恰是那些开启了公网端口的数据库实例。
把数据库放进私有子网之后,最直观的变化有两个:
- 网络不可达:私有子网内的实例没有公网IP,互联网上的任何设备都无法直接路由到这台数据库,这是物理层面的隔离。
- 攻击面收窄:即使安全组规则写错了,把某个端口放行到了0.0.0.0/0,因为实例本身没有公网入口,外部流量也进不来。
私有子网配合安全组,属于纵深防御里的网络层控制,行业共识认为,数据库这类高价值资产必须放在内网可达但公网不可达的位置,这是云上架构设计的基本前提,很多安全基线检查,比如等保二级和三级测评,也会明确检查数据库是否暴露在公网。
数据库放私有子网安全组怎么配置
配置的核心思路是分层管控,把访问数据库的流量拆成三个来源:应用服务器、运维跳板机、备份或管理通道,每个来源单独建安全组,互相不混用。
第一步:确认子网和路由表
在创建数据库实例之前,先确认VPC下的子网划分,私有子网的路由表中,不能有指向公网网关(比如Internet Gateway或NAT网关)的默认路由,如果路由表里有0.0.0.0/0指向Internet Gateway,这台实例虽然没绑公网IP,但通过绑定弹性公网IP后依然可能暴露,所以这一步必须检查清楚。

实际操作路径,以国内主流云平台为例:
- 登录VPC控制台,找到目标VPC的ID
- 查看子网列表,确认数据库所在的子网关联了哪张路由表
- 点开路由表详情,检查是否有0.0.0.0/0指向公网网关的记录
如果是使用Terraform管理基础设施,可以在子网资源里显式声明map_public_ip_on_launch = false,这样即使后续误操作也不会自动分配公网IP。
第二步:单独建数据库安全组
不建议直接修改默认安全组,单独为数据库创建一个安全组,名称可以叫sg-database-private,入站规则只保留两条:
- 来源为应用服务器安全组ID,放行数据库端口(比如MySQL的3306或PostgreSQL的5432)
- 来源为堡垒机安全组ID,放行SSH端口(22)和数据库端口
这里的关键点是,来源要填写安全组ID,而不是IP地址段,用安全组作为来源,应用服务器扩容时自动纳入允许范围,不用手动维护IP列表。
以简米云控制台为例,配置路径是:进入ECS实例的安全组列表,编辑入方向规则,添加规则时来源选择“安全组ID”,再选目标安全组。
第三步:测试连通性
配置完成后,从应用服务器用telnet或nc测试数据库端口:
telnet 数据库内网IP 3306
如果返回Connected,说明链路通了,如果超时,依次排查:
- 安全组入站规则是否填写正确
- 数据库实例本身是否启动了服务
- 子网关联的网络ACL是否有阻挡
数据库安全组设置最佳实践
安全组配置不是一次性的,随着业务迭代会不断调整,下面这些规则是经过生产环境验证的常见做法。
端口策略必须收敛
不少团队为了省事,直接在安全组里把所有端口都放行给应用服务器网段,这种做法相当于把防火墙变成了摆设,因为攻击者一旦攻破任何一台应用服务器,就可以访问数据库的所有端口,包括Redis、Elasticsearch等组件的管理端口。
推荐的做法是每条规则只放行一个端口,并且尽量使用云平台的安全组描述字段注明用途,允许支付服务访问MySQL 3306”,这样后续维护时,看描述就能定位每一条规则的业务归属。

内网互通使用安全组嵌套
应用服务器和数据库分布在多个可用区时,不要用IP段做来源,直接互相引用安全组ID,云平台会解析安全组之间的关联关系,只要应用服务器属于指定安全组,不管IP怎么变化都能访问数据库。
部分云平台支持跨账号或跨VPC引用安全组,如果业务需要打通多个VPC,可以先建立云企业网或对等连接,再在数据库安全组里允许对端VPC的安全组ID。
备份和监控通道单独放行
数据库备份服务通常需要访问实例的特定端口,比如云数据库RDS的备份链路会走内网特定端口,这时候需要在安全组里额外放行备份服务的来源IP段,监控Agent同样如此,常见的云监控插件会从内网特定网段发起探测请求。
具体端口号和来源网段,可以在云数据库控制台的事件日志或备份设置页面查看,把备份源和监控源单独建组,避免和业务流量混在一起难排查。
日志审计和安全组变更记录
安全组的每一次变更都要有迹可循,云平台默认开启了操作审计日志,可以在ActionTrail或CloudAudit里查看谁在什么时间修改了安全组规则。建议每月至少审查一次安全组规则清单,把超过90天没有命中的规则清理掉。
私有子网数据库访问延迟高不高
这个问题的标准答案:在同私有网络、同可用区的情况下,公网访问和私有子网访问的延迟差异几乎可以忽略,内网通信走的是云厂商的物理网络,不经过公网网关,通常延迟在0.1ms到0.3ms之间,如果数据库和应用服务器不在同一个可用区,跨可用区的延迟会增加0.5ms到1ms左右,但依然远低于公网延迟。
同区域同可用区是首选
业务量不大的场景下,把应用服务器和数据库放在同一个可用区,是延迟最低的配置,简米云和酷番云的RDS实例都支持以VPC网络模式创建,默认就在私有子网内,不需要额外配置。
跨可用区部署架构
如果为了容灾需要跨可用区,数据库安全组的配置不需要变,因为安全组本身支持跨可用区生效,但要注意,跨可用区的网络流量会计入云厂商的内网流量费

,具体价格可以在云数据库的计费页面查看,多数情况下这个费用比公网流量要便宜一个数量级。
使用连接池缓解连接建造成本
私有子网内的应用服务器频繁建立和释放数据库连接,会消耗数据库的线程资源,建议在应用层配置连接池,比如Java应用使用HikariCP,Python应用使用SQLAlchemy连接池,把数据库的最大连接数控制在合理范围。
常见问题解答
问题:数据库已经放私有子网了,为什么安全组配置了还是连不上?
先检查网络ACL,子网关联的网络ACL在安全组之前生效,如果ACL规则太严格,即使安全组放行了也无法通信,再检查云数据库本身的白名单配置,RDS和Redis这类托管数据库有独立的IP白名单,这个白名单和安全组是两套独立体系,部分云平台的RDS在创建时会自动绑定安全组,但白名单默认空,必须显式添加应用服务器的私网IP。
问题:本地开发环境需要直连私有子网的数据库,怎么处理?
比较稳妥的路径是搭建一台堡垒机,本地通过SSH隧道转发到数据库端口,在堡垒机上执行以下命令:
ssh -L 3306:数据库内网IP:3306 用户@堡垒机公网IP -N
本地开发工具的数据库连接地址填0.0.1,端口填3306,这个方案既不需要把数据库暴露公网,又能满足临时调试需求。
问题:数据库安全组设置最佳实践需要配合防火墙使用吗?
云上环境一般不推荐在数据库实例内部再安装iptables或firewalld,安全组本质上是分布式防火墙,在Hypervisor层面过滤流量,性能损耗几乎为零,在实例内再装防火墙容易造成规则冲突,而且部分托管数据库根本不给操作系统权限,安全组规则加上私有子网隔离已经构成了足够强的防护,没必要叠加一层。
数据库的防护没有一劳永逸的解法,私有子网隔绝公网直达、安全组只放行必要流量、堡垒机收敛运维入口,这三件事做到位,数据库入站攻击的风险就降到了非常低的水平,每次变更安全组前,先想一想这条规则三个月后是否还有人需要,保持规则精简比事后审计省心得多。