mysql环境部署如何防止端口冲突_mysql网络安全设置

来源:这里教程网 时间:2026-02-28 20:48:55 作者:

检查并修改 MySQL 默认端口避免冲突

MySQL 默认监听

3306
端口,若服务器已运行其他 MySQL 实例、MariaDB 或某些数据库代理(如 ProxySQL),就会发生端口占用,启动失败时常见错误是:
Can't start server: Bind on TCP/IP port: Address already in use

实操建议:

先用
sudo lsof -i :3306
sudo netstat -tuln | grep :3306
查看谁占用了该端口
确认无误后,在配置文件
/etc/mysql/my.cnf
(或
/etc/my.cnf
)的
[mysqld]
段下添加:
port = 3307
(或其他未被占用的端口)
注意:修改端口后,所有客户端连接(包括命令行
mysql -P 3307
、应用连接字符串)都必须显式指定新端口,否则会连不上
重启服务前务必执行
sudo mysqld --initialize-insecure --user=mysql
(仅首次初始化)或直接
sudo systemctl restart mysql

限制 MySQL 监听地址增强网络隔离

默认配置中

bind-address
可能为
127.0.0.1
(仅本地)或
0.0.0.0
(监听所有网卡),后者若未配防火墙,等于把数据库裸露在公网,极易被暴力扫描和利用。

实操建议:

生产环境强烈设为
bind-address = 127.0.0.1
,强制只响应本地连接;远程应用应通过跳板机、SSH 隧道或内网服务网格访问
若必须监听内网 IP(如
192.168.1.100
),请确保该 IP 所属网卡不对外暴露,并配合系统防火墙(如
ufw
iptables
)放行指定源 IP:
sudo ufw allow from 192.168.1.50 to any port 3306
禁用
skip-networking
——虽然它能彻底关闭 TCP 连接,但会导致无法使用任何远程管理工具,运维成本陡增,不推荐

禁用 root 远程登录并最小化用户权限

MySQL 安装后常遗留

'root'@'%'
这类通配主机用户,一旦密码弱或泄露,攻击者可直接远程提权。即使端口受限,内部员工误配或应用漏洞也可能触发横向移动。

实操建议:

登录后立即执行:
DROP USER 'root'@'%';
,保留仅
'root'@'localhost'
为应用创建专用账号,限定来源主机(如
'app_user'@'192.168.1.30'
),并只赋予必要库表的
SELECT, INSERT, UPDATE
权限,不用
GRANT ALL
密码必须启用强策略:MySQL 8.0+ 可设
validate_password.policy = STRONG
,并检查
validate_password.length
是否 ≥12
定期审计账号:
SELECT user, host, authentication_string FROM mysql.user;
,重点关注
host
列含
%
或空值的记录

启用 MySQL 原生 SSL 加密连接

明文传输账号密码和敏感数据(如身份证、订单号)在内网也不安全,尤其当交换机被嗅探或存在中间人风险时。

ssl_mode=DISABLED
是很多 ORM 默认行为,容易被忽略。

实操建议:

生成证书(可用 OpenSSL)后,在
my.cnf
中启用:
ssl-ca = /var/lib/mysql/ca.pem
ssl-cert = /var/lib/mysql/server-cert.pem
ssl-key = /var/lib/mysql/server-key.pem
重启后验证:
SHOW VARIABLES LIKE '%ssl%';
应全部为
ON
或显示路径;再查
SHOW STATUS LIKE 'Ssl_cipher';
确认非空
客户端连接必须显式要求加密:
mysql -u app_user -p --ssl-mode=REQUIRED
;应用代码中也要设置对应参数(如 Python PyMySQL 的
ssl={'ssl': {}}
注意:自签名证书会导致客户端报
SSL connection error: SSL is required but the server doesn't support it
,此时需在客户端配置信任 CA,而非禁用 SSL
实际部署中最容易被跳过的,是把
bind-address
和防火墙规则当成“二选一”——其实二者必须叠加生效;还有人以为改了端口就等于隐藏了服务,却忘了
nmap -sV -p 3307 target
依然能精准识别 MySQL 版本并发起针对性攻击。

相关推荐