愤怒,mysql被疯狂攻击,我做了这几件事!
前言
- 在线音乐戳我呀!
- 音乐博客源码上线啦!
- 之前专栏奔向Linux、Docker前几篇讲了Docker的安装部署,操作算是比较简单。
- 早上六点起床准备想写点干货文章,登录在线音乐想听着歌曲,结果发现系统登录不上,mysql也异常,看来今天的干货文章得缓一缓了,这下有得我忙活了,开始我的排查之路。
- 接下来将分享系统为什么登录不上、以及我如何解决问题,一五一十盘出。
- Are you ready ?
多幸运,我有个我们。
mysql被疯狂攻击
-
描述问题
- 系统登录不上,因为数据库的原因
-
分析问题
- mysql数据库被攻击了
-
思考如何解决问题
-
启动mysql,并改密码
-
修改mysql默认端口
-
mysql不对外连接
-
-
开启防火墙
环境
-
数据库:Mysql
-
服务器:Mysql数据库是在Docker中运行
一、描述问题
系统登录不上,首先先看一下f12调试工具,发现登录接口返回“登录失败”。
得知,node后端服务并没有挂,因为接口可正常返回信息,那么登录失败有两种情况:
-
❌ node服务本身出现bug,但之前登录一直用得好好的,可排除。
-
✔️ node服务连接的mysql数据库出现异常,导致登录失败。
二、分析问题
于是,我们前往服务器查看node服务,究竟是什么情况?
果然,是mysql数据库出现异常。
用navicat连接一下mysql,发现也连接不上。
我们赶紧查看mysql日志。
mysql数据库被攻击了,好小子,还用不同ip来攻击。
我成功不用写文章了,一大早来解决问题,还好我那不到10位用户还没有起床,干活吧!
三、思考如何解决问题?
3.1 启动mysql,并改密码
我想第一步,肯定是先让mysql数据库先正常启动,并且修改密码。以此让程序可正常访问。
🍅 密码最好包含:大小写字母、数字、特殊字符,长度长点。
3.2 修改mysql默认端口
正常mysql端口都是3306,把默认端口给改了,让别人去猜去,要计算到底是哪个端口,也是需要时间,起码可以增加一点点安全性。
3.3 mysql不对外连接
像我的mysql数据库,都是外网是可以直接用工具可以连接的,但其实这样子很不安全,一般公司是不会直接对外开放数据库,一般都是内网才可连接。
于是我们不对外开放数据库的端口。
🙋 那问题来了,我想查数据,怎么查?
🙋🏻♂️ 你可以在服务器上查数据呀,但我想说,太麻烦了,而且可视化效果很不友好。
那怎么办呢?
这个时候,“隧道”就派上用场了。
相信大家看了图片,应该不难猜到“隧道”的作用。
上面我们说把数据库对应的端口不对外开放,但面临一个问题,我们自己想通过navicat连接查数据,就用隧道的方式,用我本地的端口去映射服务器的端口,这样子我们自己的电脑就可以连接服务器里任意端口服务。
如上图,服务器3306端口和我本地的3305端口做映射,这样子,我在navicat用localhost的3305连接,实则是访问我服务器的3306端口。
还不错吧,今天又✔️GET到一个技能点了吧。
这招下去,有心人想搞你,又多了一层防护安全罩,别人就算在厉害能拿到你的密码,也无法远程连接你的数据库了,更别想疯狂攻击你的数据库了,因为他,根本连接不了。
魔高一尺,道高一丈。
四、开启防火墙
曾想起,公司的防火墙也一直都是关闭状态的。这可是比较危险的事情。但因为公司做了内网才可连接服务器、服务,那防火墙开不开倒是无所谓了。
那我们的,可基本都是外网的,所以建议还是开启防火墙,毕竟又多了一层安全保护罩。
友情提示:以下对没接触的朋友,可能理解起来稍微费劲一点,因为用到Linux和Docker,所以稍微复杂一丢丢,小泽已经很大白话给大家讲解了,先大概看下去,把流程走通,再理解。建议先收藏,以后用到,想必就很自然的理解了。💖看到这里的朋友,本身就很棒棒啦!
4.1 Linux开启防火墙
查看防火墙状态:
systemctl status firewalld
inactive表示防火墙为关闭状态。
开启防火墙:
systemctl start firewalld
启动后无任何提示,再次查看防火墙状态,可以看到变成active,成功启动。
关闭防火墙:
systemctl stop firewalld
关闭防火墙也无提示,查看状态变成inactive表示成功关闭。
4.2 重启防火墙
我们的防火墙已经成功开启。
防火墙开启之后,需要重启防火墙才可生效。
我们对指定端口服务进行开启防火墙。
添加:
# --permanent永久生效,没有此参数重启后失效
firewall-cmd --zone=public --add-port=80/tcp --permanent
查看:
firewall-cmd --zone=public --query-port=80/tcp
删除:
firewall-cmd --zone=public --remove-port=80/tcp --permanent
重新载入:
firewall-cmd --reload
同理,我们服务上需要开放的端口,都添加进去哦。
firewall-cmd --zone=public --add-port=3306/tcp --permanent
8088
8087
9052
9000
...
🍅 切记:需重新载入才可生效哦~
4.3 docker容器与linux建立连接失败
现在,我们的数据库已经开启防火墙了,来连接一下测试一下。
Node服务,连接不上mysql了。
4.3.1 Docker容器与目标主机之间因为防火墙的阻拦不能建立连接
于是百度了一下报错,说是:Docker容器与目标主机之间因为防火墙的阻拦不能建立连接。
我的mysql是运行在docker上的,所以我们要先让docker容器与linux建立连接。
配置 docker 容器内允许访问外部网络(需重启 firewalld、docker 以生效)
firewall-cmd --permanent --zone=trusted --change-interface=docker0
但运行该语句后,docker容器内无法重启。
4.3.2 centos 中,启用了 firewalld 防火墙,docker 内的容器无法访问外网
docker服务'启动之后'会自动在'防火墙中添加一些规则',但是'防火墙重启之后'经常会导致docker容器重启失败,需要在'重启下docker 服务'就好了。
-
❌ 关闭防火墙(就是为了开启防火墙,才有这么多故事,现在让我关了???)
-
✔️ 将firewalld换成iptables
我们docker重启用的是firewalld,结果导致docker重启失败,于是我们换做iptables来。
安装iptables-services服务:
#此处可以使用 yum install -y iptables-s* 来查询以“iptables-s”开头的安装包
yum install iptables-services
查询是否安装成功
yum list installed | grep iptables*
确认这两个安装包均已成功安装。
启动iptables服务并设置开机自启。
systemctl start iptables && systemctl enable iptables
查看状态
重新启动服务器,检查设置开机自启是否生效
service iptables status
4.3.3 linux中用iptables开启指定端口
centos默认开启的端口只有22端口,专供于SSH服务,其他端口都需要自行开启。
- 修改/etc/sysconfig/iptables文件,增加如下一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT
重启 iptables
service iptables restart
重启防火墙,这里有两种方式重启防火墙
service iptables start
或者用menu-system-administration-firewall ,去添加用户需要的端口。
- netstat -tanp 去显示端口状态
/usr/sbin/lsof -i
- telnet ipaddr port
to check if ip and port is available before making connection.
LINUX通过下面的命令可以开启允许对外访问的网络端口:
/sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT #开启8000端口
/etc/rc.d/init.d/iptables save #保存配置
/etc/rc.d/init.d/iptables restart #重启服务
/etc/init.d/iptables status # 查看端口是否已经开放
Linux中如何开启8080端口供外界访问。
- 修改文件/etc/sysconfig/iptables
[root@bogon ~]# cd /etc/sysconfig
[root@bogon sysconfig]# vi iptables
文件内容如下,倒数第三行是新加的,目的是对外界开放8080端口
这行文字实际是从上一行拷贝修改而来,在VI中拷贝一行用yy,拷贝多行用yyn,粘贴用p。
- 将iptables服务重启
如若不想修改iptables表,可以直接输入下面命令:
# linux iptables开放端口命令
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
🍅 这方法在后面,经常使用!
✔️ 使用之后,重启docker,成功!
4.4 访问linux nginx失败
因为我们使用了iptables开启指定端口,并没有开启linux端口,所以我们要对其他家端口权限。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
service iptables save
Linux访问成功了。
接着我们继续对3000端口进行开放。
iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000 -j ACCEPT
发现外网并不能访问3000端口,怎么回事,上面开放22端口都成功了的呀!步骤一模一样的。
Nginx上的80端口也访问不了,于是想先试一下80端口先开放出来。
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
80端口成功开放了,也可以访问,神奇的是:3000端口也可访问了。
这就是蝴蝶效应?代码出bug,明天就好了?
我带着侥幸的心理、一脸懵逼的心态继续开放我的服务。
同理啊,像还有前端的nginx、oracle数据库、java服务等等,这些端口也要做下相应的开启防火墙端口。
于是我们继续开放9052。
iptables -A INPUT -p tcp --dport 9052 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 9052 -j ACCEPT
发现开放了,但访问不了,这不就是和3000端口现象一样吗?
为什么3000一开始不行,80开放好了之后,就3000可以了?
细心的我们,想必发现了,因为3000用的是-A,而80是-I(忘记了的朋友,可以往上看看)
遇到drop 后面是不生效的。
所以一开始3000可能是在drop后面,然后80-I插入在前面就改变了他们的排列顺序,所以3000可以访问。
所以我9052用-A,不能访问,是因为他插入在后面的,我用-I就可以访问,插在前面才可以。
🍅 记得添加端口后,要save保存一下哦~
4.5 nginx在配置iptables注意问题
通常我们的服务器为了安全,都不会打开太多端口,只要需要的时候,才开放端口。
iptables可以很好解决我们的问题,一般步骤:
先保存我们ssh端口的访问权限,不然会让我们ssh链接不上。
#我们常用的ssh端口是22,大家要根据实际情况处理。
iptables -I INPUT -p TCP --dport 22 -j ACCEPT
Xshell上查看ssh端口方法:
关闭所有端口的访问
iptables -P INPUT DROP
打开80端口的访问权限
iptables -I INPUT -p TCP --dport 80 -j ACCEPT
如果ngnix和web服务器是同一台机器,配置规则ip白名单的转发,不然会导致ngnix转发不成功。
# 192.168.3.24就是本机的ip地址
iptables -A INPUT -p tcp -s 192.168.3.24 -j ACCEPT
这是因为ngnix跟web服务器同一台机器的iptables默认DROP策略导致。
小插话:我用的是centos7,然后iptables是版本6的,而firewalld是版本7的。
后记
还好,今天起得早,赶上我那不到10个用户睡醒之前,把在线音乐可正常访问,让他们能安心听歌是我最大的满足。
经过这件mysql被攻击事件,我学到了程序的安全性一定一定要做好,也让大家放心听歌,只要我还在,这个在线音乐就不会死!!!
共勉:打击我的,只会让我变得更强。
👍 如果对您有帮助,你的点赞是我前进的润滑剂,支持一下呗,谢谢啦!
以往推荐
优化了三年经验者的Echarts卡顿,荣获掘力计划周榜|11月29日-12月05日
前端仔,快把dist部署到Nginx上,荣获小知识优秀奖
相关文献
centos 中,启用了 firewalld 防火墙,docker 内的容器无法访问外网
centos 7系统 iptables替换自带firewalld防火墙
CentOS的iptables中添加端口,解决不能访问nginx问题
docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp
Docker(十三)重启firewalld导致docker无法启动
Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
原文链接
转载自:https://juejin.cn/post/7203009064719335461