自定義行為 ( Custom Action )
匹配器 (Matcher)
匹配器
VeryNginx 會收到各種各樣的Http請求,當我們定義一條規則(Action)的時候,我們可能會需要限定,這條規則只對一部分請求起作用,Matcher 就是匹配器,用來描述哪一部分 Http 請求是規則的目標。
一個 Matcher 可以包含一個或者多個約束條件,當某個請求沒有違背 Matcher 中任何一條約束時,就認為這個請求匹配上了這個Matcher。
如果Matcher是空的,即沒有包含任何條件,那么這個Matcher會匹配上所有的請求
目前支持以下幾種約束:
Client IP
客戶端IP,對應Nginx變量 remote_addr
支持的匹配方式:
- 等於某個IP
- 不等於某個IP
Host
客戶訪問時使用的域名,對應Nginx變量 host
支持的匹配方式:
- 等於某個字符串
- 不等於某個字符串
- 符合某個正則表達式
- 不符合某個正則表達式
UserAgent
用戶瀏覽器的UserAgent字段,對應Nginx變量 http_user_agent
一些通過工具發起的請求可能會有特別的UserAgent,或者沒有這個字段,也可能偽造成普通的瀏覽器
支持的匹配方式:
- 等於某個字符串
- 不等於某個字符串
- 符合某個正則表達式
- 不符合某個正則表達式
- 為空,即Http頭中沒有這個字段
URI
請求路徑,對應Nginx中的變量 uri
,表示訪問地址中域名之后的部分
例如訪問 http://www.abc.com/test/book.html 時,uri值為 /test/book.html
支持的匹配方式:
- 等於某個字符串
- 不等於某個字符串
- 符合某個正則表達式
- 不符合某個正則表達式
Referer
請求來源網頁,對應Nginx中的變量 http_referer
,表示訪問者的來源頁面。
支持的匹配方式:
- 等於某個字符串
- 不等於某個字符串
- 符合某個正則表達式
- 不符合某個正則表達式
- 為空,即Http頭中沒有這個字段
Request Args
請求參數匹配
VeryNginx可以智能的從uri字符串后面,以及請求體(body)內提取參數的值
注:目前只支持在請求的content-type為application/x-www-form-urlencoded時,從請求體內提取參數
這個條件可以輸入兩個字段,name 和 value。name是可選的,如果輸入name,則只把符合name條件的參數值和value作匹配;如果不輸入name,就會把所有的參數值拿來和value進行匹配
支持的匹配方式:
- 等於某個字符串
- 不等於某個字符串
- 符合某個正則表達式
- 不符合某個正則表達式
行為 (Action)
協議鎖定 CustomAction: Scheme Lock
功能介紹
協議鎖定功能可以確保用戶訪問時使用正確的協議 ( Http
/ Https
)
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- Scheme
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
當Http請求使用的訪問協議和規則中的 scheme 項不一致時,將自動返回一個302重定向,將瀏覽器重定向到正確的協議 + 當前的地址上。如果使用和規則一致的協議來訪問,則不會有任何動作
注意事項
- 注意規則的順序,防止一個嚴格的 Matcher 被排名更前的寬松 Matcher 覆蓋,導致規則不起作用
- 如果服務器有向外提供Api的話,需要特別注意和Api的兼容性,通常來說Api的調用方不是真正的瀏覽器,很可能不支持302重定向
重定向 CustomAction: Redirect
功能介紹
Redirect可以將一個請求重定向到另外一個地址
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- RegEx
- Redirect to
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
當 Regex 項為空時, 請求將被重定向到Redirect to 項填寫的地址。 當 Regex 項不為空時,新地址由gsub算法生成:
new_address = gsub( uri, re,redirect_to )
其中 re 為規則中定義的Regex,redirect_to 為規則中定義的 Redirect to 項目
注意事項
- Redirect to 項可以是以下兩種形式
- 帶有協議以及域名 (http/https)😕/www.abc.com/test/aaa/bbb
- 不帶有域名 /test/aaa/bbb
- 重定向時url后的查詢字符串參數將會被保留
- 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用
URI重寫 CustomAction: URI Rewrite
功能介紹
URI Rewrite 可以將請求的URI進行內部改寫,而用戶瀏覽器地址欄顯示的地址並不會發生變化
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- RegEx
- Redirect to
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
當 Regex 項為空時, 請求將被重定向到Redirect to 項填寫的地址。 當 Regex 項不為空時,新地址由gsub算法生成:
new_address = gsub( uri, re,redirect_to )
其中 re 為規則中定義的Regex,redirect_to 為規則中定義的 Redirect to 項目
示例1 :
VeryNginx默認訪問路徑是 /veryngingx/dashboard/index.html, 我們想縮短到 /vn/index.html, 可以作以下配置:
Matcher: URI ≈ ^/vn
Regex: ^/vn/(.*)
Redirect to: /verynginx/dashboard/$1
添加規則之后,通過 /vn/index.html 即可訪問配置面板
注意事項
- Redirect to 項只可以是 / 開頭的地址
- 重定向時url后的查詢字符串參數將會被保留
- 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用
瀏覽器驗證 CustomAction: Browser Verify
功能介紹
Browser Verify可以驗證發起請求的客戶端是否為瀏覽器,並攔截來自非瀏覽器客戶端的請求
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- Verify Type
- Cookie
- JavaScript
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
當收到一個請求時,VeryNginx 會通過算法得到一個Token
- 當配置Verify Type為Cookie時:
用戶的Cookie中沒有帶有這個Token時,將會返回一個302重定向,將用戶重定向到當前地址,並在http響應頭中設置cookies。如果客戶端是瀏覽器,將自動帶上這個Token再繼續訪問,此時將被放行。如果客戶端是其他工具,並且該工具不支持302以及http響應頭中的set cookies字段,將無法繼續訪問
- 當配置Verify Type為JavaScript時:
和 Type 為 Cookie 時原理類似,不同之處在於沒有Token時,返回一個網頁,並通過內嵌在網頁中的JavaScript來設置Cookies並發起重定向。需要瀏覽器支持JavaScript才可以驗證通過
Token生成算法原型
Token = hash( client_ip + UserAgent + key )
其中Key為VeryNginx第一次運行時產生的隨機數
這樣可以為每個用戶和瀏覽器產生不同的Token,並且無法偽造
注意事項
- 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用
- 本功能可能會影響搜索引擎抓取信息,建議只針對部分頁面開啟,或者僅在被攻擊時開啟
訪問頻率限制 CustomAction: Frequency Limit
功能介紹
Frequency Limit 可以限制訪問特定時間內請求的次數,超出限制時將截斷並返回指定的狀態碼
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- Time(s)
- Max Request Times
- Count Alone
- Return Code
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
每條規則會對命中的請求進行計數,單位時間( Time ) 內最多放行指定次數( Max Request Times ) 的請求,單位時間內超過次數的請求將返還指定的狀態碼。
- 未設置單獨統計( Count Alone )的情況下,匹配這條規則的所有請求最多為 Max Request Times 次。
- 通過設置單獨統計( Count Alone )選項,可以根據 IP (或 URI)分別進行計數,即命中 Matcher 情況下,相同 IP (或 URI)單位時間內請求不超過指定次數。
注意事項
無
過濾器 CustomAction: Filter
功能介紹
Filter可以阻止訪問請求,並返回指定的狀態碼
背景知識
配置說明
可以定義多條規則,每條規則包含以下參數
- Enable
- Matcher
- Action
- Return Code
執行過程
尋找規則
每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配
應用規則
當 Action 項為 accept 時, 不進行任何動作,繼續按照正常流程處理
當 Action 項為 block 時,攔截請求,並返回 Return code 項指定的狀態碼
注意事項
- 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用
自定義動作執行順序 Action Execute Order
Action 將會按照以下順序來執行
- Scheme Lock
- Redirect
- URI Rewrite
- Browser Verify
- Frequency Limit
- Filter
統計Summary
統計
功能介紹
統計不同URI的訪問情況
背景知識
None
配置說明
當配置為Enable狀態時,本功能對每一次訪問進行統計。如果Enable不勾選,則不記錄任何數據
統計數據有兩組:
- All Nginx啟動后所有的數據
- Temporary 每分鍾清空的統計數據
統計結果如下:
- Count 請求總次數
- Success rate 請求成功率,狀態碼在400以下都認為是成功
- Time 請求總耗費時間
- Avg time 請求平均耗費時間
- Size 總響應大小
- Avg Size 平均響應大小
執行過程
在Log階段根據不同的URI進行統計
注意事項
目前使用了10M大小的共享內存來存儲訪問統計信息,據實際測試大約可存儲10000條URI的統計數據。當共享內存存儲滿之后,最早的數據將會被丟失(LRU算法)
安裝
故障排錯 Trouble Shooting
在安裝和使用 VeryNginx 的過程中可能會遇到一些問題,下面列舉了常見的問題及對應的解決方案,供參考。
Q: run "python instal.py install all" failed ?
1, 因為缺少 gcc 所以無法編譯
yum install gcc
2, 缺少一些必要的庫,如 openssl, PCRE,導致編譯不成功
fedora / centos 下可以執行以下命令
yum install pcre pcre-devel
yum install openssl openssl-devel
如果你使用的是 ubuntu,那么需要
apt-get install libssl libssl-dev
apt-get install libpcre3 libpcre3-dev
3, 復制文件失敗
使用 sudo 來運行安裝腳本
Q: 啟動失敗 ?
1,nginx.conf 中指定了使用 nginx 用戶來執行程序,而系統里缺少 nginx 用戶,所以無法運行
adduser nginx
2,如果是使用自己的配置無法啟動,那么為了排除配置問題,可以先使用 VeryNginx 自帶的 nginx.conf 來運行 nginx。如果可以運行,那么說明是配置的原因。
仔細對比能工作和不能工作的配置,找到出問題的地方進行修正即可。
3,為了排除權限問題,可以使用 root 用戶來運行 nginx 試試。方法是在 nginx.conf 中:
將
user nginx;
修改成user root;
Q: 無法訪問控制面板 / 控制面板工作不正常?
1, 可以先使用 chrome 或 safari 瀏覽器,排除瀏覽器不兼容的可能
2, VeryNginx 控制面板頁面中的一些 css 和 js 庫是引用了公網上的地址,如果不能訪問公網,將不能正常工作。如果遇到頁面顯示不正常之類的問題,請打開網頁調試工具,確認靜態文件有沒有載入成功
Q: 無法保存配置 ?
VeryNginx 的前端面版是一個單頁面應用( SPA ),首先為了確定配置是否被保存,可以刷新頁面重新登入控制面版,查看修改配置過的配置是否存在,如果存在,那么表示配置已經被保存了,此時配置應該被已經被保存到了 /opt/verynginx/verynginx/config/config.json
中。如果保存失敗,可能有以下原因:
1,未點擊保存按鈕
修改配置后,頁面底部會出現一個浮動條,提示保存,在點擊浮動條上的保存按鈕之后,配置才會進行寫入
2, nginx 進程對 /opt/verynginx/verynginx/configs/ 無寫權限
執行 chmod -R 777 /opt/verynginx/verynginx/configs
3, nginx 設置的 client body 太小,導致請求體被緩存到文件,導致 lua 代碼沒有獲取到請求體,保存時會提示請求失敗
在 nginx.conf 中 http 部分增加一句,client_body_buffer_size 128k;
4,nginx 以 nobody 方式運行
如果 nginx.conf 中定義了 user nobody; 將可能導致無法保存配置,去掉這項配置,或者指定成正常的用戶即可