MySQL安装完成后,仅完成基础的服务部署还不够,网络层面的安全防护是避免数据库被恶意访问的关键。做好防火墙配置和网络访问控制策略,能从源头减少数据库被攻击的风险。

防火墙基础配置
Windows系统防火墙设置
Windows系统自带防火墙是保护MySQL服务的第一道屏障,默认情况下防火墙会拦截外部对MySQL端口的访问,需要手动添加放行规则。
首先确认MySQL的默认端口,默认是3306,若自定义过端口需对应调整。打开Windows Defender 防火墙,选择高级设置,在入站规则中新建规则,选择端口类型,输入MySQL对应的端口号,允许连接,然后选择适用的网络类型,最后给规则命名即可完成配置。
对应的PowerShell命令也可以快速完成配置,示例如下:
# 放行MySQL默认3306端口的入站规则 New-NetFirewallRule -DisplayName "MySQL_3306" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow
Linux系统防火墙设置
Linux系统常用的防火墙工具包括iptables和ufw,不同发行版默认使用的工具不同,配置方式也有差异。
使用ufw配置(Ubuntu/Debian常用)
ufw是简化版的防火墙工具,操作更便捷,首先确认ufw状态,若未启用可先开启:
# 查看ufw状态 sudo ufw status # 启用ufw sudo ufw enable # 放行MySQL默认3306端口 sudo ufw allow 3306/tcp # 重载规则使配置生效 sudo ufw reload
使用iptables配置(CentOS/RHEL常用)
iptables是更底层的防火墙工具,配置规则如下:
# 放行3306端口的TCP入站请求 sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # 保存iptables规则,不同系统保存命令有差异 # CentOS 6及以下 sudo service iptables save # CentOS 7及以上 sudo iptables-save > /etc/sysconfig/iptables
MySQL自身网络访问控制策略
防火墙是网络层的防护,MySQL自身的访问控制能实现更细粒度的权限管理,两者结合能提升安全等级。
限制MySQL绑定地址
默认情况下MySQL可能绑定所有网卡地址,需要修改配置文件限制绑定的IP,避免对外暴露服务。
打开MySQL配置文件,Linux系统一般在/etc/mysql/my.cnf或者/etc/my.cnf,Windows系统在MySQL安装目录的my.ini,找到[mysqld]段,添加或修改bind-address参数:
[mysqld] # 仅绑定本地回环地址,仅允许本机访问 bind-address = 127.0.0.1 # 若需要允许指定IP段访问,可绑定对应网卡IP,比如内网IP 192.168.0.1 # bind-address = 192.168.0.1
修改完成后重启MySQL服务使配置生效。
精细化用户权限控制
MySQL的用户权限可以限制访问来源IP、可操作的数据库和表,避免使用root用户做日常操作。
创建仅允许指定IP访问的用户示例:
-- 创建用户,仅允许192.168.0.100这个IP访问所有数据库 CREATE USER 'db_user'@'192.168.0.100' IDENTIFIED BY 'strong_password'; -- 授予该用户所有数据库的所有权限,实际场景可按需缩小权限范围 GRANT ALL ON *.* TO 'db_user'@'192.168.0.100'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
若需要允许某个IP段访问,可使用通配符,比如'db_user'@'192.168.0.%'表示允许192.168.0.0/24网段的所有IP访问。
禁用不必要的网络功能
可以关闭MySQL的一些不必要的网络相关功能,减少攻击面:
- 禁用skip-networking参数,若仅需要本机访问可开启该参数,让MySQL不监听TCP/IP端口,仅通过本地socket连接
- 避免使用默认的3306端口,可修改为其他高位端口,减少被扫描的概率
- 定期清理无用的用户权限,删除来源IP不明确、权限过高的用户
配置验证方法
完成配置后需要验证规则是否生效,避免配置错误导致无法访问或者防护失效。
本地验证MySQL服务是否正常:
# 本地连接MySQL测试 mysql -u db_user -p -h 127.0.0.1
从外部机器测试端口是否可访问:
# 测试目标IP的3306端口是否开放,替换为实际MySQL服务器IP telnet 192.168.0.1 3306 # 或者使用nc命令测试 nc -zv 192.168.0.1 3306
如果外部测试无法连接,说明防火墙规则生效,若可以连接则需要检查防火墙配置是否正确。