您好,登錄后才能下訂單哦!
說起網絡***,可能很多人只知道大名鼎鼎的DDOS***,這種***廉價且效果出眾,直接通過第四層網絡協議用他的帶寬把你的帶寬頂掉,造成網路阻塞,防不勝防,就連騰訊這種大鱷公司也被大流量DDOS搞過焦頭爛額。暫時的解決方法只有三種,第一種就是你要夠有錢,買強大的高級防火墻,或者使用的帶寬足夠大,無視這些網絡流量。第二種是技術足夠強,例如個別有技術的大牛公司(阿里),用類如DPDK的高效數據包處理驅動,開發出流量清洗服務,把垃圾網絡包過濾掉,不過同時也會影響正常的網絡包,增加延時。第三種就是錢不多的公司多數使用的方案,換ip(廢話)。不過,現在有很多公司推出自己的流量清洗服務,細化到按小時收費,也是相當靈活了,按需購買。
不過還有一種網絡***其實比起DDOS更頻繁出現,就是CC(Challenge Collapsar)***,一般來說是利用網站代碼漏洞,不停地發大量數據包請求,造成對方服務器回應這些請求導致資源耗盡,一直到宕機崩潰。這種***屬于第七層的網絡協議,一方面在服務器層面是正常的請求,所以這種情況想根本解決問題,只能從代碼入手。但是另一方面,也就可以用其他來限制他訪問,例如nginx的配置上也是能稍微防一下。
nginx基本安全配置
先說一些基本安全設置,由開始發展到現在,其實nginx的安全做得比以前已經好不少,不過有些還是要強調一下。
Nginx默認是不允許列出整個目錄的,不過,我們為了安全,最好還是確認這個真的關閉了,不然代碼被拉走了就悲劇了。
http { autoindex off; }
nginx默認是會在返回的數據包中顯示版本號,原本這個并不是大問題,但是被別有用心的人專門***這個版本的話,那就不好了,所以,我們還是隱藏好一點。
http { server_tokens off; }
其他限制訪問請求參數
http { #設置客戶端請求頭讀取超時時間,超過這個時間還沒有發送任何數據,Nginx將返回“Request time out(408)”錯誤 client_header_timeout 15; #設置客戶端請求主體讀取超時時間,超過這個時間還沒有發送任何數據,Nginx將返回“Request time out(408)”錯誤 client_body_timeout 15; #上傳文件大小限制 client_max_body_size 100m; #指定響應客戶端的超時時間。這個超過僅限于兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連接。 send_timeout 600; #設置客戶端連接保持會話的超時時間,超過這個時間,服務器會關閉該連接。 keepalive_timeout 60; }
毫無疑問,nginx是可以做訪問限制的,allow就是允許訪問的ip和ip段,deny就是禁止訪問的ip和ip段,不過這個需要看你網站的需求,現在滿天飛的家用寬帶IP,誰敢說IP一直是那一個。
#設置網站根目錄的訪問權限 location / { allow 192.168.1.1/24; allow 120.76.147.159; deny 119.23.19.240; deny 192.168.3.1/24; deny all; }
所以,我們再細化一點,限制訪問個別目錄或文件后綴名。
#在訪問uploads、p_w_picpaths目錄時,訪問php|php5|jsp后綴的文件會返回403代碼,也就是不給執行代碼了 location ~ ^/(uploads|p_w_picpaths)/.*\.(php|php5|jsp)$ { allow 192.168.1.1/24; return 403; } #禁止訪問所有目錄下的sql|log|txt|jar|war|sh|py后綴的文件,這些是什么文件就不詳細說了。 location ~.*\.(sql|log|txt|jar|war|sh|py) { deny all; } #有時候,有些訪問記錄不想保存到日志里面,例如靜態圖片 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ { access_log off; } #如果想用戶體驗好一點,可以建立一個報錯頁面,然后讓這個頁面跳轉到其他頁面 error_page 403 http://www.example.com/errorfile/404.html;
再高級一點,判斷特定條件,然后拒絕服務
#判斷當http_user_agent返回的結果中包含UNAVAILABLE關鍵字,則返回403錯誤。 location / { if ($http_user_agent ~ UNAVAILABLE) { return 403; } }
再次強調,這些要跟網站實際情況相結合,要不然影響范圍被擴大,造成一些莫名其妙的事,那可不是好事,不過一般403都是自己控制,比較好判斷,所以最好別直接deny all。
nginx高級安全配置
訪問權限控制:
想更精準控制訪問權限,其實還有auth_basic指令,用戶必須輸入有效的用戶名和密碼才能訪問站點。而用戶名和密碼應該列在 auth_basic_user_file指令設置的文件中。
server { ... auth_basic "closed website"; auth_basic_user_file conf/htpasswd; }
auth_basic的off參數可以取消驗證,比如對于一些公共資源,則可以取消驗證。
server { ... auth_basic "closed website"; auth_basic_user_file conf/htpasswd; location /public/ { auth_basic off; } }
我們還需使用satisfy指令來組合來使用IP訪問和Http驗證。 其默認設置為all,即IP訪問和HTTP驗證同時通過時才允許用戶訪問,若設置為any,即IP訪問和HTTP驗證其一通過就允許用戶訪問
location / { satisfy any; allow 192.168.1.0/24; deny all; auth_basic "closed site"; auth_basic_user_file conf/htpasswd; }
這樣弄好像變得有點復雜,所以還是得看需求。
---------------------------------------------------------------------------------
連接權限控制:
實際上nginx的最大連接數是worker_processes乘以worker_connections的總數。
也就是說,下面的這個配置,就是4X65535,一般來說,我們會強調worker_processes設置成和核數相等,worker_connections并沒有要求。但是同時這個設置其實給了***者空間,***者是可以同時發起這么多個連接,把你服務器搞跨。所以,我們應該更合理的配置這兩個參數。
user www; worker_processes 4; error_log /data/logs/nginx_error.log crit; pid /usr/local/nginx/nginx.pid; events { use epoll; worker_connections 65535; }
不過,也不是完全沒有辦法限制,在nginx0.7開始,出了兩個新的模塊:
HttpLimitReqModul: 限制單個 IP 每秒請求數
HttpLimitZoneModule: 限制單個 IP 的連接數
這兩個模塊,要先在http層定義,然后在 location, server, http上下文中作限制,他們用的是限制單ip訪問的漏桶算法,也就是說超過定義的限制會報503錯誤,這樣爆發的cc***就全部被限制住了。當然,有些時候可能是某個公司同一個ip有幾十人一起訪問網站,這是有可能被誤傷的,做好503報錯回調是很有必要的。
先看HttpLimitReqModul:
http { limit_req_zone $binary_remote_addr zone=test_req:10m rate=20r/s; … server { … location /download/ { limit_req zone=test_req burst=5 nodelay; } } }
上面http層的就是定義,這是一個名為test_req的limit_req_zone空間,用來存儲session數據,大小是10M內存,1M大約可以存16000個ip回話,看你訪問量有多少就設多少。以$binary_remote_addr 為key,這個定義是客戶端IP,可以改成$server_name等其他,限制平均每秒的請求為20個,寫成20r/m就是每分鐘了,也是看你訪問量。
下面location層就是應用這個限制了,對應上面的定義,對訪問download文件夾的請求,限制每個ip每秒不超過20個請求,漏桶數burst為5,brust的意思就是,如果第1,2,3,4秒請求為19個,第5秒的請求為25個是被允許的。但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤。nodelay,如果不設置該選項,第1秒25個請求時,5個請求放到第2秒執行,設置nodelay,25個請求將在第1秒執行。
就這個限制定義而言,把每個IP限制了請求數,對于海量的cc請求***,效果明顯,例如限制到1r/s每秒一次請求,那就更明顯了,不過也正如開頭所說,對于大公司多人統一IP同時訪問,難免出現誤傷,所以還是得多考慮。
然后再看HttpLimitZoneModule:
http { limit_conn_zone test_zone $binary_remote_addr 10m; server { location /download/ { limit_conn test_zone 10; limit_rate 500k; } } }
和上面的類似,上面http層就是總定義,這是一個名為test_zone的limit_conn_zone空間,大小也是10M,key還是客戶端IP地址,不過這個沒有限制次數,改下面定義去了。
下面location層就是真正定義了,因為key定義是客戶端ip,所以limit_conn就是一個IP限制了10個連接,如果是$server_name,那就是一個域名10個連接。然后下面limit_rate就是限制一個連接的帶寬,如果一個ip兩個連接,就是500x2k,這里是10,那就是最多可以有5000K速度給到這個ip了。
-----------------------------------------------------------------------
嫌棄503用戶體驗不好,也可以加個返回頁面:
error_page 503 /errpage/503.html;
503頁面的源代碼:
<html> <head> <title>頁面即將載入….</title> <meta http-equiv=content-type c> <META NAME=”ROBOTS” C> </head> <body bgcolor=”#FFFFFF”> <table cellpadding=”0″ cellspacing=”0″ border=”0″ width=”700″ align=”center” height=”85%”> <tr align=”center” valign=”middle”> <td> <table cellpadding=”10″ cellspacing=”0″ border=”0″ width=”80%” align=”center” style=”font-family: Verdana, Tahoma; color: #666666; font-size: 11px”> <tr> <td valign=”middle” align=”center” bgcolor=”#EBEBEB”> <br /><b style=”font-size: 16px”>頁面即將載入</b> <br /><br />你刷新頁面的速度過快。請少安毋躁,頁面即將載入… <br /><br />[<a href="JavaScript:window.location.reload();"><font color=#666666>立即重新載入</font></a>] <br /><br /> </td> </tr> </table> </td> </tr> </table> </body> </html> <SCRIPT language=javascript> function update() { window.location.reload(); } setTimeout(“update()”,2000); </script>
-----------------------------------------------------------------------
上述的配置,是全網通用得,有時候難免有誤傷,那怎么辦呢,可以設置白名單制度。
#geo指令定義了一個白名單$whiteiplist變量,默認值為1, #如果客戶端ip在上面的范圍內,$whiteiplist的值為0。 geo $whiteiplist { default 1; 10.11.15.161 0; 127.0.0.1/32 0; } #使用map指令映射上面geo匹配的客戶端的ip為空串,如果不是就顯示本身真實的ip, #這樣匹配的ip就不能存到limit_req_zone內存session中,所以不會被限制訪問 map $whiteiplist $limit { 1 $binary_remote_addr; 0 ""; } #然后再制定這個$limit變量來設置規則,白名單制度就建立起來了 limit_req_zone $limit zone=one:10m rate=10r/s; limit_conn_zone $limit zone=addr:10m;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。