[Web] Nginx limit_req 指南 – ngx_http_limit_req_module

Intro Nginx限制訪問速率模組:Nginx http_limit_req 原理 使用leaky bucket原理(可以稱漏桶原理),桶的概念如下: 桶中存放request (令牌的概念) 桶上方由Nginx照設定速率計算補充request 桶下方提供提取request,即一個Request會消耗掉桶中存放的一個request Nginx對於桶的特性如下: 單一IP對應使用一個桶 limit_req_zone中rate是以request數量回推時間做補充的,依照兩次領取的時差補充相應的量 limit_req中burst即定義桶的request最大存放量,在每個新IP(不在Zone中)進入時會拿到全滿request(burst量)的桶 重啟Nginx會清空Zone,意即所有桶的剩餘Quota記憶清除,重新以全滿計算 比照實際設定,limit_req_zone $binary_remote_addr zone=one:10m rate=6r/m;即每間隔10秒可以得到一個request補充量。以rate=100r/s速率來說明,即每0.01秒得一個request補充量,間距0.1秒計算得10個request補充量; 而limit_req zone=one burst=5 nodelay;則表示每個IP桶最大預存的request量為5,有用掉則需等待補充。 Nginx實際上實作leaky bucket補充的方式可能為Trigger回填間隔補充量方式,本篇僅為概念說明,不代表實際Nginx演算法 Reference Nginx下limit_req模块burst参数超详细解析

[Network] Fail2ban 指南 – 搭配Nginx (DDoS、Request Limit)

Outline Nginx防禦設定方針 Access log Error log by llimit_req_zone 架構 Fail2ban是依照設定檔執行過濾,原始設定檔路徑: /etc/fail2ban/jail.conf 如要修改新增可以複製建立成local的設定檔名稱,如有此檔會以此檔優先: /etc/fail2ban/jail.local 設定格式上,[過濾器名稱]會對應到/etc/fail2ban/filter.d/過濾器名稱.conf。 預設已經有ssh過濾器[selinux-ssh],可自行設定添加其他規則實現過濾條件。 參數解析 官方文件 – Options maxretry: 命中規則次數,為觸發動作的門檻次數 findtime: 搜尋指定Log紀錄的範圍秒數 bantime: IP被禁止的秒數 以SSH過濾器為例,預設共用的maxretry為5,SSH規則上帳號與密碼的錯誤Log會分開,意即如果是帳號錯誤又打密碼登入,這樣嘗試三次就會被鎖了(2×3 > 5)。 Nginx防禦設定方針 看想要哪種方式讓Fail2ban判斷: Access log 設定爬Nginx access.log,findtime跟maxretry純對應RPS 建立一個Fail2ban的Filter用於爬Nginx access log,舉例為/etc/fail2ban/filter.d/nginx-access-limit.conf: [Definition] failregex = […]

[Network] 網路架構筆記

Intro 網路架構觀念筆記 Concepts 網路(Gateway)不可平行橋接、必有其parent。全球parent root再彼此同步。 網路與網路橋接需要網卡設IP接點,再利用Route Table去轉發路由,以IP分享器接主網路自己做NAT內網為例,主網路可以透過Route Table將IP分享器內網IP/CIDR轉發給IP分享器的主網路IP閘道,一般來說IP分享器會支援轉發滲透內網。 Router 一般來說,WAN埠支援L3、LAN埠僅支援到L2 WAN/LAN埠橋接模式分為路由模式或NAT Modes AP模式即為Get同網一個IP作為自己,並幫助同網繼續switch及配發DHCP。 Repeater(中繼)模式直接L1轉發,並不會Get同網IP,所以裝置也會隱匿於網路中。 AP-Client(ASUS Media Brige)模式可以理解成用WiFi去接AP模式的網路而變成同網Switch,本身不再提供AP模式(類無線橋接)。 Extended reading [Network] 網路 – 封包傳遞原理 – 來源IP與目標IP路由

[Python] Python 3 Guide – 基礎環境指南

Intro Python官網 各平台依照指示下載安裝即可。Windows環境下指令為py。 py 直接於指令列執行Python程式碼檔案: $ py hellp-world.py pip Pip為Python套件管理器,直接官網下載執行get-pip.py自動安裝,Windows環境要pip指令得Add PATH (pip.exe位於Python安裝目錄./Script下) Is Python in your PATH Pip使用範例: $ sudo pip install requests 直接使用pip Windows若不想額外安裝設定pip,Python 3.4 內建pip support built-in: python3.4 -m pip install {package}

[Web] 後端程式語言指南 – Back-End Application Languages

Intro Programming languages used in most popular websites Web Server進程模型 同步單進程服務器 – QPS=1/每個請求秒數 同步多進程服務器 – QPS=進程數/每個請求秒數 同步單進程多線程服務器 – QPS=線程數/每個請求秒數 同步多進程多線程服務器 – QPS=進程數*每個線程數/每個請求秒數 (Ex. Apache) 同步單進程單線程事件驅動線程池服務器 – QPS依設計決定 (Ex. NodeJS) PHP nginx使用php-fpm介接、或Apcahe使用mod_php Python nginx使用WSGI(多家套件可選)介接、或Apcahe使用mod_python NodeJS Node.js is a single threaded language […]

[Server] Let’s Encrypt with Certbot 指南

Intro Let’s Encrypt – Free SSL/TLS Certificates Certbot – Automatically enable HTTPS on your website with EFF’s Certbot, deploying Let’s Encrypt certificates 近年普遍使用Certbot做Let’s Encrypt憑證申請及自動續約。 快速申請 by Nginx 在單台Web server上使用Certbot快速對已設定的sites做申請,例如:Nginx on Ubuntu 16.04 (xenial) DNS認證申請 (LB佈署架構適用) 考慮Loading Balancing擴充性,如果要多台Nodes同時使用同一個憑證,就會回到單一Node申請佈署至Nodes上,這時使用DNS申請是比較好的選擇。 如不使用DNS Plugins,可以使用手動申請DNS Manual,指令如下: […]

[Yii2][RBAC] 權限項目管理實踐 – Module Items Management

Intro 如果使用Yii2原生RBAC做好多層權限架構管理,例如video類下的program控制器下的create權限,可以讓你在Menu上看到video類跟program控制器選單。 資料結構 3-layer Item Name pattern: {module}.{controller}.{action} 依照上述例子,一個create的權限Item Name應為: video.program.create 那還需要另外兩個權限:video, video.program, 以作為如選單上僅判斷video大類以及video.program選單。 video, video.program,video.program.create三個繼承關係的權限items,並不適合使用Yii2 RBAC中的auth_item_child關係(如透過addChild()建構),因為video不能為最高父層,本身擁有video僅代表至少擁有一個子層,然後auth_item_child架構上有video代表擁有全部子層權限。 所以一個action的權限勢必連帶擁有其父層權限,例如擁有video.program.create items則必須連帶擁有父層: video.program.create video.program video 在管理介面應用上,在下層有選取任一action時往父層繼承(例如選一個action,其controller自動加入權限,再其module自動加入權限) Group結構實現 上述這種需要多層商業邏輯權限,可以使用auth_item中的data欄位做自定義,架構出type及階層關係,在管理介面時就可以透過getItems()取得全部權限items在逐一依照Data做分類資料建構,實現分群。 完成後的資料即可顯示出每個Group下擁有哪些Controllers再以下擁有哪些actions。 在Menu顯示與否的應用上,大分類透過can(‘video’)驗證,再往下如選單透過can(‘video.program’)驗證,action一般控制項在頁面上,就可以再透過can(‘video.program.create’)控制新增按鈕。