6.2.7 远程访问与防火墙放行

远程访问需同时满足数据库账号权限与系统网络策略,遵循“最小权限、最小暴露”原则。默认仅允许本地访问,需显式开放并限制来源网段。

远程访问原理草图(账号权限 + 网络放行双重约束):

文章图片

关键配置与命令(含解释):

1)绑定地址与端口(限制监听范围)

# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
bind-address = 10.10.0.10   # 仅监听内网IP,避免 0.0.0.0 全网暴露
port = 3306                 # 默认端口,修改需同步防火墙与客户端
# 重启服务使配置生效(systemd)
systemctl restart mysqld
systemctl status mysqld
# 预期:Active: active (running)

2)创建远程账号并限制来源网段(最小权限)

-- 仅允许 10.10.0.0/16 网段访问
CREATE USER 'app'@'10.10.%.%' IDENTIFIED BY 'StrongPass!';

-- 授权应用必需权限
GRANT SELECT,INSERT,UPDATE,DELETE ON dbname.* TO 'app'@'10.10.%.%';

-- 刷新权限并核验
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'10.10.%.%';

命令解释:
- CREATE USER 'user'@'host':限定来源主机/网段
- GRANT:仅授予业务所需权限
- SHOW GRANTS:验证权限是否生效

3)防火墙放行(按发行版选择一种)

# firewalld:允许 10.10.0.0/16 访问 3306
firewall-cmd --permanent \
  --add-rich-rule='rule family=ipv4 source address=10.10.0.0/16 port protocol=tcp port=3306 accept'
firewall-cmd --reload
firewall-cmd --list-all | grep 3306
# ufw:允许特定网段
ufw allow from 10.10.0.0/16 to any port 3306 proto tcp
ufw status verbose
# iptables:先放行再拒绝其他访问
iptables -A INPUT -p tcp -s 10.10.0.0/16 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
# 注意:持久化需根据发行版使用 iptables-save/iptables-persistent

4)连接加密(简要示例)

-- 强制账号使用 SSL(证书需提前配置)
ALTER USER 'app'@'10.10.%.%' REQUIRE SSL;

验证与排错(含命令解释):

  • 端口监听与绑定地址检查
ss -lntp | grep 3306
# 预期:LISTEN 0 80 10.10.0.10:3306 ...
  • 远程连通性
# 客户端主机执行
nc -zv 10.10.0.10 3306
# 预期:succeeded
  • 账号主机匹配检查
SELECT user, host FROM mysql.user WHERE user='app';
# 预期:host 列包含 10.10.%.%
  • 错误日志定位连接拒绝原因
# 常见路径示例
tail -n 50 /var/log/mysqld.log
# 关注 Access denied / Host is not allowed / SSL connection error

常见故障与排错思路(示例):
- 现象:ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect
- 排查:账号 host 匹配范围是否正确;是否存在更严格的同名账号规则
- 现象:ERROR 1045 (28000): Access denied
- 排查:密码错误/权限不足;SHOW GRANTS 验证授权
- 现象:端口不通
- 排查:ss 监听地址、系统防火墙与云安全组双重策略

小练习(可操作):
1. 在内网创建 app 账号并限制来源 10.10.0.0/24,仅授予 SELECT 权限。
2. 修改 bind-address127.0.0.1,观察远程连接失败并用日志验证原因。
3. 使用 firewalld 只放行 3306 给一台应用服务器(如 10.10.0.20),验证其他主机无法连接。