likes
comments
collection
share

愤怒,mysql被疯狂攻击,我做了这几件事!

作者站长头像
站长
· 阅读数 16

前言

  • 在线音乐戳我呀!
  • 音乐博客源码上线啦!
  • 之前专栏奔向Linux、Docker前几篇讲了Docker的安装部署,操作算是比较简单。
  • 早上六点起床准备想写点干货文章,登录在线音乐想听着歌曲,结果发现系统登录不上,mysql也异常,看来今天的干货文章得缓一缓了,这下有得我忙活了,开始我的排查之路。
  • 接下来将分享系统为什么登录不上、以及我如何解决问题,一五一十盘出。
  • Are you ready ?

多幸运,我有个我们。

愤怒,mysql被疯狂攻击,我做了这几件事!

mysql被疯狂攻击

  • 描述问题

    • 系统登录不上,因为数据库的原因
  • 分析问题

    • mysql数据库被攻击了
  • 思考如何解决问题

    • 启动mysql,并改密码

    • 修改mysql默认端口

    • mysql不对外连接

  • 开启防火墙

环境

  • 数据库:Mysql

  • 服务器:Mysql数据库是在Docker中运行

一、描述问题

系统登录不上,首先先看一下f12调试工具,发现登录接口返回“登录失败”。

得知,node后端服务并没有挂,因为接口可正常返回信息,那么登录失败有两种情况:

  • ❌ node服务本身出现bug,但之前登录一直用得好好的,可排除。

  • ✔️ node服务连接的mysql数据库出现异常,导致登录失败。

二、分析问题

于是,我们前往服务器查看node服务,究竟是什么情况?

果然,是mysql数据库出现异常。

用navicat连接一下mysql,发现也连接不上。

愤怒,mysql被疯狂攻击,我做了这几件事!

我们赶紧查看mysql日志。

愤怒,mysql被疯狂攻击,我做了这几件事!

愤怒,mysql被疯狂攻击,我做了这几件事!

mysql数据库被攻击了,好小子,还用不同ip来攻击。

我成功不用写文章了,一大早来解决问题,还好我那不到10位用户还没有起床,干活吧!

三、思考如何解决问题?

3.1 启动mysql,并改密码

我想第一步,肯定是先让mysql数据库先正常启动,并且修改密码。以此让程序可正常访问。

🍅 密码最好包含:大小写字母、数字、特殊字符,长度长点。

3.2 修改mysql默认端口

正常mysql端口都是3306,把默认端口给改了,让别人去猜去,要计算到底是哪个端口,也是需要时间,起码可以增加一点点安全性。

3.3 mysql不对外连接

像我的mysql数据库,都是外网是可以直接用工具可以连接的,但其实这样子很不安全,一般公司是不会直接对外开放数据库,一般都是内网才可连接。

于是我们不对外开放数据库的端口。

🙋 那问题来了,我想查数据,怎么查?

🙋🏻‍♂️ 你可以在服务器上查数据呀,但我想说,太麻烦了,而且可视化效果很不友好。

那怎么办呢?

这个时候,“隧道”就派上用场了。

愤怒,mysql被疯狂攻击,我做了这几件事!

相信大家看了图片,应该不难猜到“隧道”的作用。

上面我们说把数据库对应的端口不对外开放,但面临一个问题,我们自己想通过navicat连接查数据,就用隧道的方式,用我本地的端口去映射服务器的端口,这样子我们自己的电脑就可以连接服务器里任意端口服务。

如上图,服务器3306端口和我本地的3305端口做映射,这样子,我在navicat用localhost的3305连接,实则是访问我服务器的3306端口。

还不错吧,今天又✔️GET到一个技能点了吧。

这招下去,有心人想搞你,又多了一层防护安全罩,别人就算在厉害能拿到你的密码,也无法远程连接你的数据库了,更别想疯狂攻击你的数据库了,因为他,根本连接不了。

魔高一尺,道高一丈。

愤怒,mysql被疯狂攻击,我做了这几件事!

四、开启防火墙

曾想起,公司的防火墙也一直都是关闭状态的。这可是比较危险的事情。但因为公司做了内网才可连接服务器、服务,那防火墙开不开倒是无所谓了。

那我们的,可基本都是外网的,所以建议还是开启防火墙,毕竟又多了一层安全保护罩。

友情提示:以下对没接触的朋友,可能理解起来稍微费劲一点,因为用到Linux和Docker,所以稍微复杂一丢丢,小泽已经很大白话给大家讲解了,先大概看下去,把流程走通,再理解。建议先收藏,以后用到,想必就很自然的理解了。💖看到这里的朋友,本身就很棒棒啦!

4.1 Linux开启防火墙

查看防火墙状态:

systemctl status firewalld

愤怒,mysql被疯狂攻击,我做了这几件事!

inactive表示防火墙为关闭状态。

开启防火墙:

systemctl start firewalld

愤怒,mysql被疯狂攻击,我做了这几件事!

启动后无任何提示,再次查看防火墙状态,可以看到变成active,成功启动。

关闭防火墙:

systemctl stop firewalld

愤怒,mysql被疯狂攻击,我做了这几件事!

关闭防火墙也无提示,查看状态变成inactive表示成功关闭。

4.2 重启防火墙

我们的防火墙已经成功开启。

愤怒,mysql被疯狂攻击,我做了这几件事!

防火墙开启之后,需要重启防火墙才可生效。

我们对指定端口服务进行开启防火墙。

添加:

# --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

愤怒,mysql被疯狂攻击,我做了这几件事!

同理,我们服务上需要开放的端口,都添加进去哦。

firewall-cmd --zone=public --add-port=3306/tcp --permanent
8088
8087
9052
9000
...

🍅 切记:需重新载入才可生效哦~

4.3 docker容器与linux建立连接失败

现在,我们的数据库已经开启防火墙了,来连接一下测试一下。

Node服务,连接不上mysql了。

愤怒,mysql被疯狂攻击,我做了这几件事!

4.3.1 Docker容器与目标主机之间因为防火墙的阻拦不能建立连接

于是百度了一下报错,说是:Docker容器与目标主机之间因为防火墙的阻拦不能建立连接。

愤怒,mysql被疯狂攻击,我做了这几件事!

我的mysql是运行在docker上的,所以我们要先让docker容器与linux建立连接。

配置 docker 容器内允许访问外部网络(需重启 firewalld、docker 以生效)

firewall-cmd --permanent --zone=trusted --change-interface=docker0

但运行该语句后,docker容器内无法重启。

愤怒,mysql被疯狂攻击,我做了这几件事!

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  

愤怒,mysql被疯狂攻击,我做了这几件事!

查询是否安装成功

yum list installed | grep iptables*

确认这两个安装包均已成功安装。

愤怒,mysql被疯狂攻击,我做了这几件事!

启动iptables服务并设置开机自启。

systemctl start iptables && systemctl enable iptables

愤怒,mysql被疯狂攻击,我做了这几件事!

查看状态

愤怒,mysql被疯狂攻击,我做了这几件事!

重新启动服务器,检查设置开机自启是否生效

service iptables status

愤怒,mysql被疯狂攻击,我做了这几件事!

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端口

愤怒,mysql被疯狂攻击,我做了这几件事!

这行文字实际是从上一行拷贝修改而来,在VI中拷贝一行用yy,拷贝多行用yyn,粘贴用p。

  • 将iptables服务重启

愤怒,mysql被疯狂攻击,我做了这几件事!

如若不想修改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,明天就好了?

我带着侥幸的心理、一脸懵逼的心态继续开放我的服务。

愤怒,mysql被疯狂攻击,我做了这几件事!

同理啊,像还有前端的nginx、oracle数据库、java服务等等,这些端口也要做下相应的开启防火墙端口。

于是我们继续开放9052。

iptables -A INPUT -p tcp --dport 9052 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 9052 -j ACCEPT

发现开放了,但访问不了,这不就是和3000端口现象一样吗?

愤怒,mysql被疯狂攻击,我做了这几件事!

为什么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端口方法:

愤怒,mysql被疯狂攻击,我做了这几件事!

关闭所有端口的访问

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被攻击事件,我学到了程序的安全性一定一定要做好,也让大家放心听歌,只要我还在,这个在线音乐就不会死!!!

共勉:打击我的,只会让我变得更强。

👍 如果对您有帮助,你的点赞是我前进的润滑剂,支持一下呗,谢谢啦!

以往推荐

三面:请设计一个虚拟DOM算法吧!

Vue3的响应式到底比Vue2优雅在哪

开局面试官就让我设计一个路由

靓仔,说一下keep-alive缓存组件后怎么更新及原理?

多图详解,一次性啃懂原型链(上万字)

Vue-Cli3搭建组件库

Vue实现动态路由(和面试官吹项目亮点)

VuePress搭建项目组件文档

优化了三年经验者的Echarts卡顿,荣获掘力计划周榜|11月29日-12月05日

前端仔,快把dist部署到Nginx上,荣获小知识优秀奖

相关文献

Linux开启/关闭防火墙

centos 中,启用了 firewalld 防火墙,docker 内的容器无法访问外网

centos 7系统 iptables替换自带firewalld防火墙

linux中用iptables开启指定端口 

nginx在配置iptables注意问题

Linux下iptables 禁止端口和开放端口

linux防火墙放行了端口,但是仍然访问不到

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“

原文链接

juejin.cn/post/720300…