MySQL修改bind-address为私网IP后3306端口显示关闭如何解决
Digital Ocean Droplet与GCE的网络架构逻辑存在差异:DO的公网IP、私网IP分别绑定在两块独立的虚拟网卡上,公网IP对应公网网卡(默认名为eth0),私网IP对应内网网卡(默认名为eth1)。
你之前在GCE环境中绑定私网IP即可同时连通公网、内网,是因为GCE默认配置了公网到私网网卡的DNAT转发规则,公网流入的请求会被自动转发到私网网卡处理;但DO没有这个默认配置,当你将bind-address仅设置为私网IP时,MySQL只会在内网网卡上监听3306端口,公网网卡的3306端口无进程监听,外部端口检测自然会显示端口关闭。而设置为0.0.0.0时MySQL会监听所有网卡的IPv4地址,所以公网、内网都能正常访问。
根据你需要同时满足Workbench访问、跨服务器私网复制的需求,推荐两种配置方式:
方案1:安全优先(推荐)
如果你的Workbench是通过SSH隧道连接数据库(也是官方推荐的访问方式,可避免数据库直接暴露公网),直接在配置中同时绑定本地回环地址和私网IP即可,MySQL 8.0及以上版本支持逗号分隔多绑定地址:
修改my.cnf配置:
port = 3306 bind-address = 127.0.0.1,你的Droplet私网IP # 若需要支持IPv6私网访问可追加::1
保存后重启MySQL服务生效:
systemctl restart mysql
该配置下:
- 本地SSH隧道可通过127.0.0.1正常连接数据库
- 同私域内的其他Droplet可通过私网IP连接,满足主从复制需求
- 公网网卡不监听3306端口,从根源避免公网扫描、爆破数据库的风险
方案2:需要公网直连数据库
如果必须通过公网IP直连(不推荐,存在较高安全风险),可直接将bind-address设置为0.0.0.0,同时做好两层访问控制:
- 权限控制:不要创建
'adam'@'%'这类通配符用户,针对每个访问来源单独创建授权用户:Workbench访问创建来源为你本地公网出口IP的用户,主从复制创建来源为从库私网IP的复制专用用户 - 防火墙控制:在DO云防火墙、ufw中,将3306端口的入站源严格限制为你本地公网IP、所有从库的私网IP,禁止开放
0.0.0.0/0的全网访问权限。
配置完成后执行以下命令确认监听状态是否符合预期:
ss -tulpn | grep mysqld
输出结果中能看到对应IP的3306端口处于LISTEN状态即为配置生效。
注意:你之前在GCE环境中创建的
'adam'@'10.223.0.1'用户,仅允许IP为10.223.0.1的客户端连接,在DO环境中公网访问时MySQL识别到的客户端来源IP是你本地的公网出口IP,该用户无法用于公网连接,需要根据实际访问来源重新创建对应用户。
内容的提问来源于stack exchange,提问作者Dharmeshkumar

