讓 Nginx 具有防止 DDoS 攻擊的外掛

前言

上一篇文章 我們提到了 OpenResty,是 Nginx 與 Lua 語言的結合。因此今天推薦的這款插件,就是安裝於 OpenResty 上的。他叫做 Nginx-Lua-Anti-DDoS,功能就像是 Cloudflare 的 5 秒盾,會在你訪問網頁的前 5 秒鐘計算流量是否合法,在重新導向回原本的網站。

先前準備

你必須先完成 上一篇文章 所提到的,所以你若尚未安裝 OpenResty,請先操作完後再回來吧!

安裝方式

前往目錄 /usr/local/openresty/nginx/conf,這底下建立一個資料夾 lua 並進入他。

cd /usr/local/openresty/nginx/conf && sudo mkdir lua && cd lua

將 Nginx-Lua-Anti-DDoS 的主要程式碼下載到這個資料夾中。

sudo wget https://raw.githubusercontent.com/C0nw0nk/Nginx-Lua-Anti-DDoS/master/lua/anti_ddos_challenge.lua

回到目錄 /usr/local/openresty/nginx/conf,我們要來編輯 nginx.conf

cd /usr/local/openresty/nginx/conf && sudo vim nginx.conf

在 HTTP 的範圍裡,將你需要的站點添加上 access_by_lua_file conf/lua/anti_ddos_challenge.lua;,範例如下:

server  {
    listen 80;
    listen [::]:80;
    server_name www.example.com;
    access_by_lua_file conf/lua/anti_ddos_challenge.lua;
    location / {
        try_files $uri $uri/ =404;
    }
}

接著重啟 OpenResty 即可。

sudo systemctl restart openresty

細項設定

anti_ddos_challenge.lua 裡面,你可以調整一些細項設定,來讓他更符合你的需求。

尋找 secret,你會找到一個預設值為 enigma 的字串,你可以隨意改變他,他是用來加密用的。

local secret = " enigma"

尋找 expire_time,這是用來設定驗證的過期時間,預設為 86400,也就是一天。

local expire_time = 86400

尋找 javascript_REQUEST_TYPE,他是用來回傳用戶解出來答案的方式,1 代表 GET2 代表 POST3 代表 Dynamic

local javascript_REQUEST_TYPE = 2

尋找 refresh_auth,這是驗證所需要花的時間,預設是 5 秒,也就是祖傳 5 秒盾的意思。

local refresh_auth = 5

尋找 encrypt_javascript_output,他有提供多種 JavaScript 的加密方式,預設 0 就是代表隨機,我是建議保持不動就好,真的想動可以去看原檔案設定。

local encrypt_javascript_output = 0

尋找 credits,他是用來在網頁上顯示原作者的訊息,預設是 1 顯示,依照需求可以改成 2 不顯示。

local credits = 1

上方的改動結束請都使用 sudo systemctl restart openresty 來讓配置生效。

成果展示

現在,當你進入網頁,就會顯示這樣子的 5 秒盾來進行驗證。當然如果你希望讓網頁版型自訂義,你也可以自己動手編輯 anti_ddos_challenge.lua 最下方的 html 程式碼來達成。

001.jpg

結語

這就是這款 Nginx-Lua-Anti-DDoS 的安裝及使用方式啦!根據官方的說法,他可以用來抵擋 L7 的洪水功能等攻擊,所以對於某些常被攻擊的族群確實挺好用的。