我想在python代码中获取其他IP地址的mysql数据库的信息,直接这么写:db = torndb.Connection("IP地址","数据库名","root","密码"),等了好久,发现连不上。通过在阿里云网站上修改防火墙配置、更改ubuntu的iptables,最后能连上了。以下是我的步骤(Ubuntu 14.04, mysql 5.5):
首先ping, telnet 你访问的IP地址
例如:ping XXX.X.X.X 以及 telnet XXX.X.X.X 3306
ping失败,那问题就和3306端口以及mysql无关了,不讨论了。
ping可以,但 telnet 失败,是3306端口没打开的原因。我就是telent失败,下面介绍我的解决方法:
1. 添加阿里云安全组规则的MySQL 3306端口
注:阿里云和ubuntu命令行的iptables必须都打开的,只要有一个没开那这个端口就是没开。
2. 在MySQL用户表添加用户并将host设置未所有IP都能访问
如果mysql用户表不允许的话,就算把防火墙关了也telent 3306失败,报这个错:'XX.XX.XX.XX' is not allowed to connect to this MySQL serverConnection closed by foreign host.
前两点参照 MySQL5.7开启远程访问及Ubuntu18.04防火墙3306端口
3.修改ubuntu下的 iptables 防火墙
1. 查看当前防火墙的所有规则 iptables -L -n
看看有没有3306的,如果没有则添加规则:
vi etc/iptables.rules #注意:ubuntu不同版本的iptables文件路径可能不一样
在最后增加一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
:wq #保存退出
如果有3306的话,那大概是长这个样子了:
上图是我的iptables文件,里面3306有很多行,不懂为啥这么多重复的。
如果3306那行是DROP的话,就通过vi /etc/iptables.rules 改成 ACCEPT。
2. 保存iptables.rules文件并生效
这个网上很多博客说的方法都不一样,ubuntu版本不同命令也不同吧,我是14.04。我试验成功的命令是 iptables-restore < /etc/iptables.rules,只要这一行就可以,在这之前不要sudo sh -c "iptables-save > /etc/iptables.rules"!!!否则刚修改好的iptables.rules就又变成原来的了。
最后再telnet就发现连通了,成功的图如下: