12

因为没有网关,我的服务器被 DDoS 了

 4 years ago
source link: http://database.51cto.com/art/202003/612373.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是鸭血粉丝,想起来之前生产发生的事故,阿粉我的内心到现在都还很忐忑不安,今天我们来学习一个 Kong 以及跟你们聊聊做好网关限流控制的重要性。

背景

事情是这样的,阿粉记得那是一个阳光明媚的早上,窗外一片祥和,整个世界充满了和谐。谁知九点半的时候突然微信报警消息如狂风暴雨般袭来,让人猝不及防,原来是线上的一个接口流量突然暴增,而且居高不下,导致部分业务瘫痪,无法使用。

6BN7nuv.jpg!web

按照正常的用户量,平常的上班时间不会出现如此大的流量,而且还是在这么短的时间里,对比了下往常的数据,发现访问量飙升几十倍,为了不影响正常的用户,紧急联系运维扩容服务器,稳定业务。然后紧急分析问题,一开始以为是客户端的 APP 升级出现了问题,导致死循环了,但是问了下终端负责人,并没有发布新的 APK。然后事情都这里想必大家都猜到原因了,没错,那就是我们被 DDoS 了。

关于什么是 DDoS,我想大家都是有经验的开发人员,应该都知道,不知道的朋友可以在公众号后台回复【安全】,获取一份 Web 安全相关电子书。

那么遇到这种情况,我们除了扩容服务器还有哪些解决方案呢?

知乎上有一篇问答,里面提到有下面几种方式

  1. 高防服务器
  2. 黑名单
  3. DDoS 清洗
  4. CDN 加速

这几种方案都有相应的特性,不过阿粉我在这里想给大家介绍另一种方案,简单,快速,但是对用户不友好,那就是采用网关限流。当然不同的业务有不同的特性,需要选择适合自己的方式,如果是金融证券企业的话还是请第三方专业的公司去做防护。

API 网关 Kong

介绍

Next-Generation API Platform for Multi-Cloud and Hybrid Organizations. Connect all your microservices and APIs with the industry’s most performant, scalable and flexible API platform.

在 Kong 的官网赫然的写了上面的一句话,翻译起来有点别扭,我就不直译了,大家自己看英文更能理解。简单来说 Kong 就是下一代的 API 网关,用起来就对了。

mqMBniM.jpg!web

Kong 是在客户端和服务端之间的 API 网关,Kong 作为网关可以统一转发请求,并且因为 Kong 是基于 Nginx 的,所以本身支持水平扩展;另外 Kong 可以对请求做统一的限流,认证和授权管理,而且这些功能都是基于插件式,即插即用,根据自身业务的特性,可以选择合适的插件来控制相关业务。如果已有的插件不适合,还可以自己开发相应的插件,不过插件的开发是基于 lua 的。

安装步骤

安装数据库

因为 Kong 的底层存储是采用 PostgreSQL 9.5+ 或者 Cassandra 3.x.x 的,所以我们在安装 Kong 之前需要先安装数据库,阿粉这里采用的是 PostgreSQL 9.5,并且服务器是 CentOS7 的版本。

1.使用 yum 安装依次执行如下命令

~$ yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7-x86_64/pgdg-centos95-9.5-3.noarch.rpm 
~$ yum install postgresql95 
~$ yum install postgresql95-server 

在提示安装y/n 的时候,输入y 即可。

2.安装过程很快,没什么难度,就不赘述,主要是安装过后的配置大家需要注意一下,安装完毕过后,我们初始化一下数据库,输入/usr/pgsql-9.5/bin/postgresql95-setup initdb

3.初始化完毕过后,我们设置一下服务,然后启动即可,输入如下命令。

~$ systemctl enable postgresql-9.5 
~$ systemctl start postgresql-9.5 

4.到这一步我们 PostgreSQL 的安装已经完整了,但是为了后面Kong 能正常的运行起来,我们需要做一些配置,这里的配置比较重要,网上各种文章说的也都不清不楚,阿粉在多次探索之后终于搞清了其中的缘由,来全场跟着我整齐划一,先说下我们要做的操作步骤,然后我们再依次完成。

1) 给超级管理员设置密码:安装完 PostgreSQL 后,会自动帮我们创建一个 Linux 的用户 postgres,而且这个用户默认是 PostgreSQL 的超级管理员。

2) 创建 Kong 的数据存储环境,包括用户,密码和数据库:因为我们后面需要启动Kong ,需要让 Kong 能访问到数据库,所以需要配置数据库,用户和密码。

3) 修改PostgreSQL配置文件

UbErAzA.gif

5.我们首先使用命令 su - postgres , 然后输入 psql,进入 PostgreSQL 的命令行模式,如下图

FfQfueb.png!web

6.进入命令行模式过后,我们先后完成上面 1 和 2 的步骤,先修改密码,输入\password postgres 如下图,连续输入两次你需要设定的密码,例如postgres123 一定要记住,后面需要用到这个密码登录的。

6zmUnyQ.png!web

7.修改完密码过后,我们进行第二步操作,创建用户,密码和数据库,输入语句CREATE USER kong WITH PASSWORD 'kong123'; 我这里因为之前已经创建过这个用户了,所以提示已经存在,正常是显示 CREATE ROLE 的

BRBJF32.png!web

8.然后再输入 CREATE DATABASE kong OWNER kong; 创建数据库,并且把这个数据库授权给 kong 用户,输入 GRANT ALL PRIVILEGES ON DATABASE kong to kong; 同样的,我这边已经创建 kong 数据库了,所以显示错误,正常是可以创建成功的。

beEzyeY.png!web

9.到这里,我们在检查一下是否都创建成功,通过输入命令 \du 和 \l 来看下

jeI7bqe.jpg!web

10.如果能看到用户和数据库都有的话,那就说明创建成功了,如果没有说明没有设置成功,按照上面的操作再仔细来一遍。

11.现在我们再来修改配置文件,我们先退出命令模式,使用命令 \q 然后再输入exit 即可推到 Linux 的正常模式。我们输入命令 vim /var/lib/pgsql/9.5/data/pg_hba.conf 来编辑 pg_hba.conf 文件,将最后的几行设置成如图所示,也就是将默认的 peer 修改成 md5 。

Zfuiyii.jpg!web

12.保存退出,使用 systemctl restart postgresql-9.5 重启服务,这时我们在使用postgres 用户去登录一下看看

mMj22qq.png!web

13.这里需要我们输入密码了,这里的密码就是我们上面步骤 1 设定了 postgres123,输入即可,如果提示psql: FATAL: password authentication failed for user "postgres" 说明密码不对,如果正常进去,那我们再退出来用设置的 kong用户再去登录看看。输入 psql -U kong -W 再输入之前 kong 的密码,如何能正常的如下图进去说明整个配置都正确。

3MrAvyz.png!web

如果提示 psql: FATAL: Peer authentication failed for user "kong" 可能检查你的配置文件是否修改,以及修改后是否重启。

14.最后我们修改一下 postgresql.conf 文件,设置支持远程访问,vim /var/lib/pgsql/9.5/data/postgresql.conf ,将 listen_addresses 修改为下图一致,然后保存退出,重启即可。

zyaeayJ.png!web

到这里,数据库的部分就已经完成了,总结一个小点,peer 模式的 postgres 用户不用密码可以登入,md5 模式下需要密码才能登入。因为Kong 是有密码的远程登录,所以我们要配置密码以及支持远程访问。

下面就可以安装 Kong 了。

安装 Kong

1.下载 rpm 文件:wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-2.0.2.el7.amd64.rpm

2.执行命令

~$ sudo yum install epel-release 
~$ sudo yum install kong-2.0.2.el7.amd64.rpm --nogpgcheck 

有提示输入 y 就好了

3.修改 kong 配置文件,先拷贝一份配置文件 cp kong.conf.default kong.conf 然后编辑一下对应的数据库,用户名和密码,这里的用户名和密码就是上面配置的 kong 和 kong123

miIf2yn.jpg!web

4.调整一下 kong admin api 的访问地址,后面会用到

3AJf2yQ.jpg!web

5.输入 kong start 启动 kong

6.如果出现下面提示,则输入 kong migrations bootstrap 然后再次启动 kong

Error: /usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16: Database needs bootstrapping or is older than Kong 1.0. 
 
To start a new installation from scratch, run 'kong migrations bootstrap'. 
 
To migrate from a version older than 1.0, migrated to Kong 1.5.0 first. 
If you still have 'apis' entities, you can convert them to Routes and Services 
using the 'kong migrations migrate-apis' command in Kong 1.5.0. 
 
  Run with --v (verbose) or --vv (debug) for more details 

7.检验是否安装成功,输入curl http://127.0.0.1:8001 如有下面的信息输出表示安装成功

JbQz6zq.jpg!web

至此我们Kong 也安装好了,下面为了日后使用方便,我们还需要安装一个管理页面,Kong 的管理页面工具网上有好几个,比如 Konga,Kong admin ui 等,阿粉这里也大家介绍的是Kong admin ui。

安装 Kong Admin UI

我们打开 GitHub 地址 https://github.com/pocketdigi/kong-admin-ui,可以看到提供四种部署方式,

BjUZBva.jpg!web

第一种是可以直接使用不用部分,第二种和第三种都是下载使用 Nginx 部署,第四种是采用 docker 进行部署。作为有经验的开发人员,阿粉还是采用 docker 进行安装。直接一行命令搞定即可。Docker 的安装不是本文的重点,感兴趣的可以自行 Google。

安装完成后打开 8899 端口可以看到如下界面,在 Api url 里面填入 Kong 的 Api 信息即可,如http://127.0.0.1:8001 然后点击进入。

uqyeA3q.png!web

进入界面如下:

NNJnIvq.jpg!web

至此,整个Kong 环境的搭建就已经完成了,剩下的就是使用了,流量控制,授权访问等更多特性,大家可以自行去尝试,想想如果当时阿粉就知道了 Kong 是不是就可以避免那一次的事故。

写在最后

其实这个世界上天才真的很少,大部分人都还没有到拼智商的地步;作为普通人我们拼的是努力,拼的是圈子,拼的是对这个世界的认知,接触更多更厉害的人,你迟早也会厉害起来。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK