Vultr VPS 安全组规则怎么设置只允许特定 IP 访问数据库?

文章导读
在 Vultr 控制台创建防火墙规则时,需将协议设为 TCP、端口设为数据库端口(如 3306)、源 IP 设为特定地址,并在数据库软件内限制用户登录 host。仅配置云平台防火墙不足以完成访问控制,必须结合数据库自身的权限设置。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

在 Vultr 控制台创建防火墙规则时,需将协议设为 TCP、端口设为数据库端口(如 3306)、源 IP 设为特定地址,并在数据库软件内限制用户登录 host。仅配置云平台防火墙不足以完成访问控制,必须结合数据库自身的权限设置。

先说结论:Vultr 云防火墙默认拒绝所有入站连接,必须手动添加允许特定 IP 访问数据库端口的规则,并同步修改数据库用户权限。

  • 先判断:确认 Vultr 实例是否启用了防火墙功能,默认策略是否为 DROP。
  • 优先做:在 Vultr 控制台防火墙页面添加 TCP 规则,源 IP 填写办公网或可信 IP。
  • 再验证:使用 telnet 或数据库客户端从允许 IP 测试连接,从其他 IP 确认被拒。

命令速用版

Vultr 云防火墙主要通过控制台配置,数据库权限需通过 SQL 命令设置。以下是核心配置动作:

# 1. Vultr 控制台防火墙规则设置(GUI 操作)
协议:TCP
端口:3306 (MySQL 示例)
源 IP:192.168.1.100/32 (特定 IP)

# 2. MySQL 内部权限限制(命令行操作)
mysql -u root -p
CREATE USER 'dbuser'@'192.168.1.100' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'192.168.1.100';
FLUSH PRIVILEGES;

为什么会这样

Vultr 的防火墙规则默认策略为 DROP,即使未配置任何规则,所有入站流量也会被拦截。这与本地 iptables 的默认拒绝策略一致,但新手容易误以为“没规则等于全放行”。根据技术排查资料,Vultr 控制台的防火墙页面没有“默认策略”显式提示,UI 设计暗示“没规则=全放行”,这恰恰是反直觉的陷阱。你必须主动添加规则,否则数据库端口永远无法建立连接。此外,数据库软件本身也有独立的访问控制列表,云平台放行后,若数据库用户 host 权限未匹配,连接仍会失败。

分步处理

按照云平台网络层到应用层的顺序,依次完成防火墙规则添加和数据库用户配置。

步骤 1:配置 Vultr 云防火墙规则

登录 Vultr 控制台,进入实例详情页,点击左侧菜单栏的 Firewall。检查右侧规则列表,若为空或没有包含 TCP 协议、数据库端口、源 IP 的规则,需手动添加。点击添加规则,协议选择 TCP,端口填写数据库端口(MySQL 默认 3306,PostgreSQL 默认 5432),源 IP 填写允许访问的具体 IP 地址或 CIDR 网段(如 192.168.1.0/24)。保存后规则立即生效,无需重启实例。

步骤 2:配置数据库用户权限

登录数据库服务器,使用管理员账号进入数据库。查看当前用户权限配置,确认用户 host 字段是否匹配特定 IP。若需限制特定 IP 访问,创建新用户或修改现有用户 host 字段。例如 MySQL 中执行CREATE USER 'user'@'192.168.1.100',避免使用%通配符。执行FLUSH PRIVILEGES刷新权限使更改生效。

步骤 3:检查数据库监听地址

Vultr VPS 安全组规则怎么设置只允许特定 IP 访问数据库?

确认数据库配置文件(如 my.cnf)中的 bind-address 参数。若设置为 127.0.0.1,则仅允许本地连接,需改为 0.0.0.0 或服务器公网 IP 以允许外部连接。修改后需重启数据库服务。

怎么验证是否生效

通过连通性测试和权限拒绝测试双重验证配置结果。

验证 1:端口连通性测试

在允许访问的 IP 机器上,使用 telnet 或 nc 命令测试数据库端口是否开放。例如telnet your_vps_ip 3306,若显示 Connected 或打开成功,说明 Vultr 防火墙规则已放行。在禁止访问的 IP 机器上执行相同命令,应显示连接超时或被拒绝。

验证 2:数据库登录测试

使用数据库客户端从允许 IP 尝试登录,输入正确的用户名和密码,应能成功进入。尝试使用未授权的 IP 或未授权的用户名登录,应收到 Access denied 错误提示。若端口通但登录失败,检查数据库用户 host 权限设置。

常见坑

配置过程中容易忽略 IPv6 双栈干扰和规则优先级问题。

陷阱 1:IPv6 地址自动启用

Vultr 实例默认可能启用 IPv6 地址,若客户端通过 IPv6 连接,而防火墙仅配置了 IPv4 规则,连接会被拦截。需在防火墙规则中同时添加 IPv6 源地址限制,或在内网通信中禁用 IPv6。

陷阱 2:防火墙规则顺序

Vultr VPS 安全组规则怎么设置只允许特定 IP 访问数据库?

虽然 Vultr 防火墙是无状态的,但若配置了多条规则,需确保允许规则未被后续的拒绝规则覆盖。建议将特定 IP 允许规则置于顶部,默认拒绝规则置于底部。

陷阱 3:数据库用户 host 不匹配

即使云平台防火墙放行,若 MySQL 用户 host 字段为 localhost 或 127.0.0.1,远程 IP 仍无法登录。必须确保用户 host 字段与客户端来源 IP 一致或使用特定网段匹配。

常见问题

为什么添加了防火墙规则还是连不上数据库?

可能数据库软件内部未配置允许该 IP 登录,或 bind-address 限制了监听接口。请检查数据库用户 host 权限及配置文件监听地址。

Vultr 防火墙规则需要重启服务器才生效吗?

不需要。Vultr 云防火墙规则在控制台保存后立即生效,无需重启实例或重启网络服务。

能否直接开放 0.0.0.0/0 允许所有 IP 访问?

不建议。开放所有 IP 会暴露数据库端口到公网,极易遭受暴力破解攻击。生产环境应严格限制为特定可信 IP 或内网访问。

参考来源

1. CSDN 博客 - Vultr SSH 连不上排查:防火墙、Cloud-init 与 IPv6 三大静默断点

2. MySQL 8.0 修改登录 IP 限制的完整配置指南

3. MySQL 配置 IP 地址访问权限的完整指南