本篇文章是我的 Smooth Jazz 網站(已關站)所使用的 Linode VPS 虛擬主機遭受到惡意攻擊的紀錄。

這個禮拜日放假在家,突然收到來自於 Linode 的 Email 警告通知訊息,告知我的 VPS 虛擬主機網路流量有異常,檢查之後發現是有無聊人士故意從網站上重複下載大檔案,似乎想灌爆伺服器的流量或頻寬,以下是整個處理過程的記錄。

以下是來自於 Linode 主機商的 Email 原文,信中告知我的 VPS 主機網路流量已經超過門檻值長達 2 個小時,在過去的兩小時中網路的平均流量是 12.93 Mb/s:

Your Linode, linode01, has exceeded the notification threshold (10) for outbound traffic rate by averaging 12.93 Mb/s for the last 2 hours. The dashboard for this specific Linode is located at: https://manager.linode.com/linodes/dashboard/linode01

This is an automated message, please do not respond to this email. If you have questions, please open a support ticket.

You can view or change your alert thresholds under the “Settings” tab of the Linode Manager.

This is not meant as a warning or a representation that you are misusing your resources. We encourage you to modify the thresholds based on your own individual needs.

You may access the members’ site at https://manager.linode.com/.

Linode: linode1392812

一開始以為只是普通砍站的流量暴增,應該過一陣子就好了,結果過了八小時之後,又收到第二封 Linode 寄來的 Email,內容還是一樣,也就是說這個無聊的駭客連續用將近 13 Mb/s 的流量在灌我的伺服器,而我目前使用的是 Linode 最低階的 VPS 方案,一個月的流量是 2TB,若是放著長期讓他灌下去也是會破表的,所以還是要處理一下。

檢查網路流量

檢查 Linode 的網路流量圖,看起來流量真的是暴增,不處理不行。

Linode 網路流量圖

首先用 SSH 連上自己的主機,用 iftop 指令查看目前主要的大流量到底是從哪裡來的:

sudo iftop

結果查出來主要的流量都是從 162.158.58.216 這個 IP 位址來的。

whois 查看 162.158.58.216 這個 IP 位址是屬於哪一個單位:

whois 162.158.58.216

發現這是 CloudFlare 的 IP 位址,而我的 Smooth Jazz 網站剛有使用 CloudFlare 的 CDN,所以這個 IP 位址並不是真正攻擊者的 IP 位址。

檢查一下 Nginx 網頁伺服器的紀錄檔,找出 162.158.58.216 這個 IP 位址最近的記錄:

grep 162.158.58.216 /var/log/nginx/access.log

結果發現攻擊者都只下載 mp3 與 mp4 這類的音樂與影片檔,完全沒有 html 的網頁紀錄,而且決大部分都是重複的檔案,下載的時間間隔也都差不多,看起來就是用程式跑出來的:

Nginx 紀錄檔

檢查 Google Analytics 的線上人數,發現線上的人數非常少,與記錄檔的紀錄相差甚遠,所以可以肯定這一定是故意的攻擊流量。

檢查一下 CloudFlare 的網路流量圖,由於 mp3 與 mp4 這類的影音檔預設不在 CloudFlare 快取的檔案類型之內,所以這些流量就會直接轉送至我們的 Linode 伺服器,造成 Uncached 的流量激增。

CloudFlare 網路流量圖

設定 CloudFlare 快取

若想要讓 CloudFlare 可以幫我們快取 mp3 與 mp4 這類的影音檔,可以從 Page Rules 頁面來新增 Page Rule,點選「Create Page Rule」。

CloudFlare Page Rules

在網址的部分(If the URL matches)填入想要被快取的檔案網址,可以配合星號 * 這個萬用字原來指定,假設我的 mp4 影片檔都放在 http://jazz.gtwang.org/video/ 這個路徑之下,我就可以使用 http://jazz.gtwang.org/video/* 的方式,指定這個路徑之下的所有檔案。

接著在下方的處理方式的地方(Then the settings are),新增一條「Cache Level」設定,然後選擇「Cache Everything」,讓 CloudFlare 將所有的檔案都快取。

CloudFlare 新增 Page Rule

設定好 CloudFlare 的快取 Page Rule 之後,我們的 Linode 主機流量馬上就恢復正常了。

Linode 網路流量圖

而這個攻擊的流量轉嫁至 CloudFlare 之後,好像馬上又消失了,我猜是被 CloudFlare 直接擋掉了。

CloudFlare 網路流量圖

這裡我們沒有看到攻擊者真實的 IP 位址,如果想看的話,可以把 CloudFlare 的 CDN 關掉,或是參考 Cloudflare Support 的說明,使用 CF-Connecting-IP 表頭將攻擊者的 IP 寫入 Nginx 紀錄檔。

參考資料