记一次有意思的MySQL问题排查过程
引言
回顾一下问题产生的背景:这几天我准备学习一下Django,遇到了要连MySQL,发现只支持8以上的版本,而我服务器MySQL版本是5.7,于是要升级,在我lsof看数据库的时候发现有一个陌生的IP在跟我的数据库建立连接(ESTABLISHED)
一、问题排查
我很好奇,没见过这个IP啊,此时心中最先想到的是:难道被攻击了?因为之前我的数据库密码是123456,导致数据库被人清空了。然后我去访问这个IP,发现能进去,是一个叫H3C的后台管理登录页,我又去搜H3C,是一家做路由器交换机的公司,这个时候我以为是人家公司来测试我的服务器?(想的比较天真),然后我又进到数据库里看information_schema.processlist
表发现那个IP连接的持续时间跟我本地Navicat的连接时间差不多,这时有我点怀疑是不是路由器的问题,但是没往深处想,先考虑解决的办法。
二、尝试解决
如何解决,我最先想到的是要不换个数据库的端口?说干就干,网上找了个教程,不一会换好了。再看连接的状态只有我自己的IP,但是!过了一会,刚才那个陌生的IP又出现了,这时候人已经有点麻了。但是问题还没解决,还得接着干。
我又尝试新的办法,限制IP访问,添加白名单。首先查看了本地Windows的IP,然后设置为白名单,只添加了这一个IP,其他的都删了。设置好了,刷新生效。这时候再用Windows上的Navicat连接,您猜怎么着?报错183.xx.xx.xx not allowed connect to ...
好家伙,这个IP不就是我最开始发现连我数据库的陌生IP吗。又回到了最开始的地方。这时候我几乎肯定就是路由器的问题了,但是现在我在服务器上都不能进数据库了,因为之前限制IP的时候localhost
也删了……(后面打算重装吧)
三、水落石出
又回到了那个路由器的问题,我重新访问了那个IP,网上搜了一下H3C的后台管理系统的密码,一下就进入了后台,果然,在基本信息页面我看到了自己的IP,也就是路由器分给我的内网IP。
四、底层原理
问题:“为什么Navicat连接数据库用的是路由器的IP而不是本地电脑的IP?”
这个问题我一开始以为是Navicat的底层实现就是这样的,我去翻了他的官方文档,并没有对于这方面的解释,看着看着看到了一篇的关于外网和内网的帖子,到这里终于明白了。
这个背后其实就是外网IP和内网IP的问题。
外网IP:
类比学校,校园网的主IP就是外网IP,是运营商分出来的,在校园内所有连接校园网的用户都相当于的是外网IP的内网用户。
内网IP:
就是学校内连接了校园网的用户会有自己的IP,这个IP是校园网外网IP分给你的,只属于你自己这台设备。
从访问过程上来看,外网IP可以被外界访问,内网IP不能被外界访问。个人用户的IP其实都是内网IP(个人如果用外网IP就太浪费了),通常我们在访问外网的时候都是通过路由器或者交换机来访问外网,Navicat连接服务器应该也是这个道理,用的是路由器来访问我阿里云的公网IP。
五、总结
整个过程大概花了一天的时间,感觉很充实,再次感受到自己知识的匮乏,趁着没毕业多学点吧。