前⾔
最近开发中遇到⼀个问题,mysql在服务器本地可以登录,但是远程通过3306端⼝却不可以。这个问题困扰了我⼀周之久,终于在今天解决了。在解决的过程中试了很多的⽅法,遂记录下来,希望能给⼤家⼀些提⽰。
排查错误位置
客户端⽅⾯
⾸先通过ping命令对服务器进⾏测试,如果ping不通,则是⽹络的问题,本⽂中没有涉及这类问题的解决。
如果能ping通,再测试端⼝有没有问题。⾸先安装telnet, telnet是windows系统⾃带的,搜索\"启动或关闭Windows功能\", 找telnet客户端,勾选即可启动。在cmd中输⼊telnet {服务器IP} 3306, 如果不能正确连接,说明是端⼝设置的问题, 再试试22端⼝有没有问题,如果也有问题,就是服务器整体的端⼝设置有问题,如果只有3306有问题,那么就是3306端⼝、mysql的设置问题,继续往下测试。
服务器⽅⾯
针对只有3306端⼝不能连接的情况,有以下⼏种解决⽅法:
1. 修改配置⽂件,开启对其他ip地址的监听
输⼊命令netstat -ntpl |grep 3306 和 netstat -ntpl |grep 22, 查看端⼝的绑定情况正确情况下应为以下输出:
如果3306只绑定的本地端⼝,就会出现和上图不⼀致的输出。需要对其配置⽂件进⾏修改:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
打开配置⽂件, 找到bind-address开头的⼀⾏,如果后⾯的ip地址是127.0.0.1,也就是服务器只会接收本地的连接请求,那么就需要改变此地址来指向外部的IP地址。例如,可以改为:
lc-messages-dir = /usr/share/mysqlskip-external-locking#
# Instead of skip-networking the default is now to listen only on# localhost which is more compatible and is not less secure.bind-address = 0.0.0.0
如果你的mysql版本是MySQL 8+,那么mysqld.cnf中可能不会包含bind-address这⼀⾏,应该像下⾯所⽰⽅法进⾏添加:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysql
log-error = /var/log/mysql/error.logbind-address = 0.0.0.0
修改完成后,保存并退出。重启mysql服务sudo systemctl restart mysql,使得配置⽂件的修改得以⽣效。
接下来再次回到客户端进⾏验证,如果能够telnet连接3306端⼝,说明配置成功,如果还是不能连接,进⼊下⼀步骤。
2. 关闭防⽕墙
Ubuntu默认的防⽕墙为ufw。防⽕墙的作⽤是管理⽹络规则,默认情况下打开防⽕墙是更好的选择, 但是这⾥为了排除debug时的影响,就先关闭⼀下。
查看防⽕墙状态sudo ufw status, 如果显⽰active, 就运⾏sudo ufw disable关闭。
3. 修改 iptables
iptables定义了⽹络访问规则,它⼯作在内核中,是⼀个⽹络过滤器。运⾏
sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
表⽰添加接收3306端⼝的规则。
-I INPUT将当前命令插⼊在filter链的第⼀位置。-p tcp表⽰添加tcp协议的扩展。--dport XX-XX:指定⽬标端⼝。
-j ACCEPT: 规定的动作,这⾥为接收。完成后,保存修改的配置sudo iptables-save。
然后再次在客户端⽤telnet进⾏测试,得到结果:说明连接3306端⼝成功了。(忽略这⾥的乱码)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务