說(shuō)起網(wǎng)絡(luò)***,可能很多人只知道大名鼎鼎的DDOS***,這種***廉價(jià)且效果出眾,直接通過(guò)第四層網(wǎng)絡(luò)協(xié)議用他的帶寬把你的帶寬頂?shù)?,造成網(wǎng)路阻塞,防不勝防,就連騰訊這種大鱷公司也被大流量DDOS搞過(guò)焦頭爛額。暫時(shí)的解決方法只有三種,第一種就是你要夠有錢(qián),買(mǎi)強(qiáng)大的高級(jí)防火墻,或者使用的帶寬足夠大,無(wú)視這些網(wǎng)絡(luò)流量。第二種是技術(shù)足夠強(qiáng),例如個(gè)別有技術(shù)的大牛公司(阿里),用類(lèi)如DPDK的高效數(shù)據(jù)包處理驅(qū)動(dòng),開(kāi)發(fā)出流量清洗服務(wù),把垃圾網(wǎng)絡(luò)包過(guò)濾掉,不過(guò)同時(shí)也會(huì)影響正常的網(wǎng)絡(luò)包,增加延時(shí)。第三種就是錢(qián)不多的公司多數(shù)使用的方案,換ip(廢話)。不過(guò),現(xiàn)在有很多公司推出自己的流量清洗服務(wù),細(xì)化到按小時(shí)收費(fèi),也是相當(dāng)靈活了,按需購(gòu)買(mǎi)。
創(chuàng)新互聯(lián)公司專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站制作、福清網(wǎng)絡(luò)推廣、微信小程序、福清網(wǎng)絡(luò)營(yíng)銷(xiāo)、福清企業(yè)策劃、福清品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供福清建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
不過(guò)還有一種網(wǎng)絡(luò)***其實(shí)比起DDOS更頻繁出現(xiàn),就是CC(Challenge Collapsar)***,一般來(lái)說(shuō)是利用網(wǎng)站代碼漏洞,不停地發(fā)大量數(shù)據(jù)包請(qǐng)求,造成對(duì)方服務(wù)器回應(yīng)這些請(qǐng)求導(dǎo)致資源耗盡,一直到宕機(jī)崩潰。這種***屬于第七層的網(wǎng)絡(luò)協(xié)議,一方面在服務(wù)器層面是正常的請(qǐng)求,所以這種情況想根本解決問(wèn)題,只能從代碼入手。但是另一方面,也就可以用其他來(lái)限制他訪問(wèn),例如nginx的配置上也是能稍微防一下。
nginx基本安全配置
先說(shuō)一些基本安全設(shè)置,由開(kāi)始發(fā)展到現(xiàn)在,其實(shí)nginx的安全做得比以前已經(jīng)好不少,不過(guò)有些還是要強(qiáng)調(diào)一下。
Nginx默認(rèn)是不允許列出整個(gè)目錄的,不過(guò),我們?yōu)榱税踩詈眠€是確認(rèn)這個(gè)真的關(guān)閉了,不然代碼被拉走了就悲劇了。
http { autoindex off; }
nginx默認(rèn)是會(huì)在返回的數(shù)據(jù)包中顯示版本號(hào),原本這個(gè)并不是大問(wèn)題,但是被別有用心的人專(zhuān)門(mén)***這個(gè)版本的話,那就不好了,所以,我們還是隱藏好一點(diǎn)。
http { server_tokens off; }
其他限制訪問(wèn)請(qǐng)求參數(shù)
http { #設(shè)置客戶(hù)端請(qǐng)求頭讀取超時(shí)時(shí)間,超過(guò)這個(gè)時(shí)間還沒(méi)有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤 client_header_timeout 15; #設(shè)置客戶(hù)端請(qǐng)求主體讀取超時(shí)時(shí)間,超過(guò)這個(gè)時(shí)間還沒(méi)有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤 client_body_timeout 15; #上傳文件大小限制 client_max_body_size 100m; #指定響應(yīng)客戶(hù)端的超時(shí)時(shí)間。這個(gè)超過(guò)僅限于兩個(gè)連接活動(dòng)之間的時(shí)間,如果超過(guò)這個(gè)時(shí)間,客戶(hù)端沒(méi)有任何活動(dòng),Nginx將會(huì)關(guān)閉連接。 send_timeout 600; #設(shè)置客戶(hù)端連接保持會(huì)話的超時(shí)時(shí)間,超過(guò)這個(gè)時(shí)間,服務(wù)器會(huì)關(guān)閉該連接。 keepalive_timeout 60; }
毫無(wú)疑問(wèn),nginx是可以做訪問(wèn)限制的,allow就是允許訪問(wèn)的ip和ip段,deny就是禁止訪問(wèn)的ip和ip段,不過(guò)這個(gè)需要看你網(wǎng)站的需求,現(xiàn)在滿天飛的家用寬帶IP,誰(shuí)敢說(shuō)IP一直是那一個(gè)。
#設(shè)置網(wǎng)站根目錄的訪問(wèn)權(quán)限 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; }
所以,我們?cè)偌?xì)化一點(diǎn),限制訪問(wèn)個(gè)別目錄或文件后綴名。
#在訪問(wèn)uploads、p_w_picpaths目錄時(shí),訪問(wèn)php|php5|jsp后綴的文件會(huì)返回403代碼,也就是不給執(zhí)行代碼了 location ~ ^/(uploads|p_w_picpaths)/.*\.(php|php5|jsp)$ { allow 192.168.1.1/24; return 403; } #禁止訪問(wèn)所有目錄下的sql|log|txt|jar|war|sh|py后綴的文件,這些是什么文件就不詳細(xì)說(shuō)了。 location ~.*\.(sql|log|txt|jar|war|sh|py) { deny all; } #有時(shí)候,有些訪問(wèn)記錄不想保存到日志里面,例如靜態(tài)圖片 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ { access_log off; } #如果想用戶(hù)體驗(yàn)好一點(diǎn),可以建立一個(gè)報(bào)錯(cuò)頁(yè)面,然后讓這個(gè)頁(yè)面跳轉(zhuǎn)到其他頁(yè)面 error_page 403 http://www.example.com/errorfile/404.html;
再高級(jí)一點(diǎn),判斷特定條件,然后拒絕服務(wù)
#判斷當(dāng)http_user_agent返回的結(jié)果中包含UNAVAILABLE關(guān)鍵字,則返回403錯(cuò)誤。 location / { if ($http_user_agent ~ UNAVAILABLE) { return 403; } }
再次強(qiáng)調(diào),這些要跟網(wǎng)站實(shí)際情況相結(jié)合,要不然影響范圍被擴(kuò)大,造成一些莫名其妙的事,那可不是好事,不過(guò)一般403都是自己控制,比較好判斷,所以最好別直接deny all。
nginx高級(jí)安全配置
訪問(wèn)權(quán)限控制:
想更精準(zhǔn)控制訪問(wèn)權(quán)限,其實(shí)還有auth_basic指令,用戶(hù)必須輸入有效的用戶(hù)名和密碼才能訪問(wèn)站點(diǎn)。而用戶(hù)名和密碼應(yīng)該列在 auth_basic_user_file指令設(shè)置的文件中。
server { ... auth_basic "closed website"; auth_basic_user_file conf/htpasswd; }
auth_basic的off參數(shù)可以取消驗(yàn)證,比如對(duì)于一些公共資源,則可以取消驗(yàn)證。
server { ... auth_basic "closed website"; auth_basic_user_file conf/htpasswd; location /public/ { auth_basic off; } }
我們還需使用satisfy指令來(lái)組合來(lái)使用IP訪問(wèn)和Http驗(yàn)證。 其默認(rèn)設(shè)置為all,即IP訪問(wèn)和HTTP驗(yàn)證同時(shí)通過(guò)時(shí)才允許用戶(hù)訪問(wèn),若設(shè)置為any,即IP訪問(wèn)和HTTP驗(yàn)證其一通過(guò)就允許用戶(hù)訪問(wèn)
location / { satisfy any; allow 192.168.1.0/24; deny all; auth_basic "closed site"; auth_basic_user_file conf/htpasswd; }
這樣弄好像變得有點(diǎn)復(fù)雜,所以還是得看需求。
---------------------------------------------------------------------------------
連接權(quán)限控制:
實(shí)際上nginx的最大連接數(shù)是worker_processes乘以worker_connections的總數(shù)。
也就是說(shuō),下面的這個(gè)配置,就是4X65535,一般來(lái)說(shuō),我們會(huì)強(qiáng)調(diào)worker_processes設(shè)置成和核數(shù)相等,worker_connections并沒(méi)有要求。但是同時(shí)這個(gè)設(shè)置其實(shí)給了***者空間,***者是可以同時(shí)發(fā)起這么多個(gè)連接,把你服務(wù)器搞跨。所以,我們應(yīng)該更合理的配置這兩個(gè)參數(shù)。
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; }
不過(guò),也不是完全沒(méi)有辦法限制,在nginx0.7開(kāi)始,出了兩個(gè)新的模塊:
HttpLimitReqModul: 限制單個(gè) IP 每秒請(qǐng)求數(shù)
HttpLimitZoneModule: 限制單個(gè) IP 的連接數(shù)
這兩個(gè)模塊,要先在http層定義,然后在 location, server, http上下文中作限制,他們用的是限制單ip訪問(wèn)的漏桶算法,也就是說(shuō)超過(guò)定義的限制會(huì)報(bào)503錯(cuò)誤,這樣爆發(fā)的cc***就全部被限制住了。當(dāng)然,有些時(shí)候可能是某個(gè)公司同一個(gè)ip有幾十人一起訪問(wèn)網(wǎng)站,這是有可能被誤傷的,做好503報(bào)錯(cuò)回調(diào)是很有必要的。
先看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層的就是定義,這是一個(gè)名為test_req的limit_req_zone空間,用來(lái)存儲(chǔ)session數(shù)據(jù),大小是10M內(nèi)存,1M大約可以存16000個(gè)ip回話,看你訪問(wèn)量有多少就設(shè)多少。以$binary_remote_addr 為key,這個(gè)定義是客戶(hù)端IP,可以改成$server_name等其他,限制平均每秒的請(qǐng)求為20個(gè),寫(xiě)成20r/m就是每分鐘了,也是看你訪問(wèn)量。
下面location層就是應(yīng)用這個(gè)限制了,對(duì)應(yīng)上面的定義,對(duì)訪問(wèn)download文件夾的請(qǐng)求,限制每個(gè)ip每秒不超過(guò)20個(gè)請(qǐng)求,漏桶數(shù)burst為5,brust的意思就是,如果第1,2,3,4秒請(qǐng)求為19個(gè),第5秒的請(qǐng)求為25個(gè)是被允許的。但是如果你第1秒就25個(gè)請(qǐng)求,第2秒超過(guò)20的請(qǐng)求返回503錯(cuò)誤。nodelay,如果不設(shè)置該選項(xiàng),第1秒25個(gè)請(qǐng)求時(shí),5個(gè)請(qǐng)求放到第2秒執(zhí)行,設(shè)置nodelay,25個(gè)請(qǐng)求將在第1秒執(zhí)行。
就這個(gè)限制定義而言,把每個(gè)IP限制了請(qǐng)求數(shù),對(duì)于海量的cc請(qǐng)求***,效果明顯,例如限制到1r/s每秒一次請(qǐng)求,那就更明顯了,不過(guò)也正如開(kāi)頭所說(shuō),對(duì)于大公司多人統(tǒng)一IP同時(shí)訪問(wèn),難免出現(xiàn)誤傷,所以還是得多考慮。
然后再看HttpLimitZoneModule:
http { limit_conn_zone test_zone $binary_remote_addr 10m; server { location /download/ { limit_conn test_zone 10; limit_rate 500k; } } }
和上面的類(lèi)似,上面http層就是總定義,這是一個(gè)名為test_zone的limit_conn_zone空間,大小也是10M,key還是客戶(hù)端IP地址,不過(guò)這個(gè)沒(méi)有限制次數(shù),改下面定義去了。
下面location層就是真正定義了,因?yàn)閗ey定義是客戶(hù)端ip,所以limit_conn就是一個(gè)IP限制了10個(gè)連接,如果是$server_name,那就是一個(gè)域名10個(gè)連接。然后下面limit_rate就是限制一個(gè)連接的帶寬,如果一個(gè)ip兩個(gè)連接,就是500x2k,這里是10,那就是最多可以有5000K速度給到這個(gè)ip了。
-----------------------------------------------------------------------
嫌棄503用戶(hù)體驗(yàn)不好,也可以加個(gè)返回頁(yè)面:
error_page 503 /errpage/503.html;
503頁(yè)面的源代碼:
頁(yè)面即將載入….
|
-----------------------------------------------------------------------
上述的配置,是全網(wǎng)通用得,有時(shí)候難免有誤傷,那怎么辦呢,可以設(shè)置白名單制度。
#geo指令定義了一個(gè)白名單$whiteiplist變量,默認(rèn)值為1, #如果客戶(hù)端ip在上面的范圍內(nèi),$whiteiplist的值為0。 geo $whiteiplist { default 1; 10.11.15.161 0; 127.0.0.1/32 0; } #使用map指令映射上面geo匹配的客戶(hù)端的ip為空串,如果不是就顯示本身真實(shí)的ip, #這樣匹配的ip就不能存到limit_req_zone內(nèi)存session中,所以不會(huì)被限制訪問(wèn) map $whiteiplist $limit { 1 $binary_remote_addr; 0 ""; } #然后再制定這個(gè)$limit變量來(lái)設(shè)置規(guī)則,白名單制度就建立起來(lái)了 limit_req_zone $limit zone=one:10m rate=10r/s; limit_conn_zone $limit zone=addr:10m;