因為沒有網(wǎng)關(guān),我的服務(wù)器被DDoS了
大家好,我是鴨血粉絲,想起來之前生產(chǎn)發(fā)生的事故,阿粉我的內(nèi)心到現(xiàn)在都還很忐忑不安,今天我們來學(xué)習(xí)一個 Kong 以及跟你們聊聊做好網(wǎng)關(guān)限流控制的重要性。
背景
事情是這樣的,阿粉記得那是一個陽光明媚的早上,窗外一片祥和,整個世界充滿了和諧。誰知九點半的時候突然微信報警消息如狂風(fēng)暴雨般襲來,讓人猝不及防,原來是線上的一個接口流量突然暴增,而且居高不下,導(dǎo)致部分業(yè)務(wù)癱瘓,無法使用。
按照正常的用戶量,平常的上班時間不會出現(xiàn)如此大的流量,而且還是在這么短的時間里,對比了下往常的數(shù)據(jù),發(fā)現(xiàn)訪問量飆升幾十倍,為了不影響正常的用戶,緊急聯(lián)系運維擴容服務(wù)器,穩(wěn)定業(yè)務(wù)。然后緊急分析問題,一開始以為是客戶端的 APP 升級出現(xiàn)了問題,導(dǎo)致死循環(huán)了,但是問了下終端負(fù)責(zé)人,并沒有發(fā)布新的 APK。然后事情都這里想必大家都猜到原因了,沒錯,那就是我們被 DDoS 了。
關(guān)于什么是 DDoS,我想大家都是有經(jīng)驗的開發(fā)人員,應(yīng)該都知道,不知道的朋友可以在公眾號后臺回復(fù)【安全】,獲取一份 Web 安全相關(guān)電子書。
那么遇到這種情況,我們除了擴容服務(wù)器還有哪些解決方案呢?
知乎上有一篇問答,里面提到有下面幾種方式
- 高防服務(wù)器
- 黑名單
- DDoS 清洗
- CDN 加速
這幾種方案都有相應(yīng)的特性,不過阿粉我在這里想給大家介紹另一種方案,簡單,快速,但是對用戶不友好,那就是采用網(wǎng)關(guān)限流。當(dāng)然不同的業(yè)務(wù)有不同的特性,需要選擇適合自己的方式,如果是金融證券企業(yè)的話還是請第三方專業(yè)的公司去做防護。
API 網(wǎng)關(guān) 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 的官網(wǎng)赫然的寫了上面的一句話,翻譯起來有點別扭,我就不直譯了,大家自己看英文更能理解。簡單來說 Kong 就是下一代的 API 網(wǎng)關(guān),用起來就對了。
Kong 是在客戶端和服務(wù)端之間的 API 網(wǎng)關(guān),Kong 作為網(wǎng)關(guān)可以統(tǒng)一轉(zhuǎn)發(fā)請求,并且因為 Kong 是基于 Nginx 的,所以本身支持水平擴展;另外 Kong 可以對請求做統(tǒng)一的限流,認(rèn)證和授權(quán)管理,而且這些功能都是基于插件式,即插即用,根據(jù)自身業(yè)務(wù)的特性,可以選擇合適的插件來控制相關(guān)業(yè)務(wù)。如果已有的插件不適合,還可以自己開發(fā)相應(yīng)的插件,不過插件的開發(fā)是基于 lua 的。
安裝步驟
安裝數(shù)據(jù)庫
因為 Kong 的底層存儲是采用 PostgreSQL 9.5+ 或者 Cassandra 3.x.x 的,所以我們在安裝 Kong 之前需要先安裝數(shù)據(jù)庫,阿粉這里采用的是 PostgreSQL 9.5,并且服務(wù)器是 CentOS7 的版本。
1.使用 yum 安裝依次執(zhí)行如下命令
- ~$ 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.安裝過程很快,沒什么難度,就不贅述,主要是安裝過后的配置大家需要注意一下,安裝完畢過后,我們初始化一下數(shù)據(jù)庫,輸入/usr/pgsql-9.5/bin/postgresql95-setup initdb
3.初始化完畢過后,我們設(shè)置一下服務(wù),然后啟動即可,輸入如下命令。
- ~$ systemctl enable postgresql-9.5
- ~$ systemctl start postgresql-9.5
4.到這一步我們 PostgreSQL 的安裝已經(jīng)完整了,但是為了后面Kong 能正常的運行起來,我們需要做一些配置,這里的配置比較重要,網(wǎng)上各種文章說的也都不清不楚,阿粉在多次探索之后終于搞清了其中的緣由,來全場跟著我整齊劃一,先說下我們要做的操作步驟,然后我們再依次完成。
1) 給超級管理員設(shè)置密碼:安裝完 PostgreSQL 后,會自動幫我們創(chuàng)建一個 Linux 的用戶 postgres,而且這個用戶默認(rèn)是 PostgreSQL 的超級管理員。
2) 創(chuàng)建 Kong 的數(shù)據(jù)存儲環(huán)境,包括用戶,密碼和數(shù)據(jù)庫:因為我們后面需要啟動Kong ,需要讓 Kong 能訪問到數(shù)據(jù)庫,所以需要配置數(shù)據(jù)庫,用戶和密碼。
3) 修改PostgreSQL配置文件
5.我們首先使用命令 su - postgres , 然后輸入 psql,進入 PostgreSQL 的命令行模式,如下圖
6.進入命令行模式過后,我們先后完成上面 1 和 2 的步驟,先修改密碼,輸入\password postgres 如下圖,連續(xù)輸入兩次你需要設(shè)定的密碼,例如postgres123 一定要記住,后面需要用到這個密碼登錄的。
7.修改完密碼過后,我們進行第二步操作,創(chuàng)建用戶,密碼和數(shù)據(jù)庫,輸入語句CREATE USER kong WITH PASSWORD 'kong123'; 我這里因為之前已經(jīng)創(chuàng)建過這個用戶了,所以提示已經(jīng)存在,正常是顯示 CREATE ROLE 的
8.然后再輸入 CREATE DATABASE kong OWNER kong; 創(chuàng)建數(shù)據(jù)庫,并且把這個數(shù)據(jù)庫授權(quán)給 kong 用戶,輸入 GRANT ALL PRIVILEGES ON DATABASE kong to kong; 同樣的,我這邊已經(jīng)創(chuàng)建 kong 數(shù)據(jù)庫了,所以顯示錯誤,正常是可以創(chuàng)建成功的。
9.到這里,我們在檢查一下是否都創(chuàng)建成功,通過輸入命令 \du 和 \l 來看下
10.如果能看到用戶和數(shù)據(jù)庫都有的話,那就說明創(chuàng)建成功了,如果沒有說明沒有設(shè)置成功,按照上面的操作再仔細(xì)來一遍。
11.現(xiàn)在我們再來修改配置文件,我們先退出命令模式,使用命令 \q 然后再輸入exit 即可推到 Linux 的正常模式。我們輸入命令 vim /var/lib/pgsql/9.5/data/pg_hba.conf 來編輯 pg_hba.conf 文件,將最后的幾行設(shè)置成如圖所示,也就是將默認(rèn)的 peer 修改成 md5 。
12.保存退出,使用 systemctl restart postgresql-9.5 重啟服務(wù),這時我們在使用postgres 用戶去登錄一下看看
13.這里需要我們輸入密碼了,這里的密碼就是我們上面步驟 1 設(shè)定了 postgres123,輸入即可,如果提示psql: FATAL: password authentication failed for user "postgres" 說明密碼不對,如果正常進去,那我們再退出來用設(shè)置的 kong用戶再去登錄看看。輸入 psql -U kong -W 再輸入之前 kong 的密碼,如何能正常的如下圖進去說明整個配置都正確。
如果提示 psql: FATAL: Peer authentication failed for user "kong" 可能檢查你的配置文件是否修改,以及修改后是否重啟。
14.最后我們修改一下 postgresql.conf 文件,設(shè)置支持遠(yuǎn)程訪問,vim /var/lib/pgsql/9.5/data/postgresql.conf ,將 listen_addresses 修改為下圖一致,然后保存退出,重啟即可。
到這里,數(shù)據(jù)庫的部分就已經(jīng)完成了,總結(jié)一個小點,peer 模式的 postgres 用戶不用密碼可以登入,md5 模式下需要密碼才能登入。因為Kong 是有密碼的遠(yuǎn)程登錄,所以我們要配置密碼以及支持遠(yuǎn)程訪問。
下面就可以安裝 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.執(zhí)行命令
- ~$ 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 然后編輯一下對應(yīng)的數(shù)據(jù)庫,用戶名和密碼,這里的用戶名和密碼就是上面配置的 kong 和 kong123
4.調(diào)整一下 kong admin api 的訪問地址,后面會用到
5.輸入 kong start 啟動 kong
6.如果出現(xiàn)下面提示,則輸入 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 如有下面的信息輸出表示安裝成功
至此我們Kong 也安裝好了,下面為了日后使用方便,我們還需要安裝一個管理頁面,Kong 的管理頁面工具網(wǎng)上有好幾個,比如 Konga,Kong admin ui 等,阿粉這里也大家介紹的是Kong admin ui。
安裝 Kong Admin UI
我們打開 GitHub 地址 https://github.com/pocketdigi/kong-admin-ui,可以看到提供四種部署方式,
第一種是可以直接使用不用部分,第二種和第三種都是下載使用 Nginx 部署,第四種是采用 docker 進行部署。作為有經(jīng)驗的開發(fā)人員,阿粉還是采用 docker 進行安裝。直接一行命令搞定即可。Docker 的安裝不是本文的重點,感興趣的可以自行 Google。
安裝完成后打開 8899 端口可以看到如下界面,在 Api url 里面填入 Kong 的 Api 信息即可,如http://127.0.0.1:8001 然后點擊進入。
進入界面如下:
至此,整個Kong 環(huán)境的搭建就已經(jīng)完成了,剩下的就是使用了,流量控制,授權(quán)訪問等更多特性,大家可以自行去嘗試,想想如果當(dāng)時阿粉就知道了 Kong 是不是就可以避免那一次的事故。
寫在最后
其實這個世界上天才真的很少,大部分人都還沒有到拼智商的地步;作為普通人我們拼的是努力,拼的是圈子,拼的是對這個世界的認(rèn)知,接觸更多更厲害的人,你遲早也會厲害起來。