nginx針對(duì)靜態(tài)頁(yè)面防CC攻擊
nginx 針對(duì)靜態(tài)頁(yè)面防CC 攻擊一、架構(gòu)Nginx 介紹Nginx 是一款由俄羅斯程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā)輕量級(jí)的網(wǎng)頁(yè)服務(wù)器、反向代理服務(wù)器以及電子郵件(IMAP/POP3)代理服務(wù)
nginx 針對(duì)靜態(tài)頁(yè)面防CC 攻擊
一、架構(gòu)
Nginx 介紹
Nginx 是一款由俄羅斯程序設(shè)計(jì)師Igor Sysoev所開(kāi)發(fā)輕量級(jí)的網(wǎng)頁(yè)服務(wù)器、反向代理服務(wù)器以及電子郵件(IMAP/POP3)代理服務(wù)器。
Nginx 的特點(diǎn)
Nginx 相較于Apache 、lighttpd 具有占有內(nèi)存少,穩(wěn)定性高等優(yōu)勢(shì),并且依靠并發(fā)能力強(qiáng),豐富的模塊庫(kù)以及友好靈活的配置而聞名。在Linux 操作系統(tǒng)下,nginx 使用epoll 事件模型,得益于此,nginx 在Linux 操作系統(tǒng)下效率相當(dāng)高。
Nginx 的反向代理功能
nginx proxy 是nginx 的重要功能,利用proxy 基本可以實(shí)現(xiàn)一個(gè)完整的7層負(fù)載均衡,它有這些特色:
1、功能強(qiáng)大,性能超強(qiáng),工作穩(wěn)定。
2、后端轉(zhuǎn)向與業(yè)務(wù)配置分離,非常靈活。
3、可以指定任意IP 和端口進(jìn)行配置,與網(wǎng)絡(luò)環(huán)境是不相干的。
4、可以針對(duì)后端返回的情況判斷,不正常則重新請(qǐng)求另一臺(tái)主機(jī),并自動(dòng)剔除不正常的主機(jī)。
5、可以分配權(quán)重,并且分配均勻。
6、可以實(shí)現(xiàn)多種分配策略。
7、上傳文件使用異步處理方式,nginx 會(huì)先將文件接收下來(lái),然后再轉(zhuǎn)發(fā)到后端,這樣可以減少后端服務(wù)器很多連接。
根據(jù)Nginx 的特點(diǎn)與反向代理的功能,使之成為靜態(tài)頁(yè)面防CC 攻擊絕佳選擇。根據(jù)我們以往的經(jīng)驗(yàn),一臺(tái)Q9300、4GB 內(nèi)存的主機(jī),可以輕松防住7萬(wàn)鏈接的CC 攻擊,此時(shí)服務(wù)器資源占用仍然相當(dāng)?shù)汀?/p>
Nginx 防CC 攻擊的架構(gòu):
,
二、服務(wù)器配置
服務(wù)器環(huán)境:CentOS 6.3 X64
(注:以下文檔,藍(lán)色為配置文件的內(nèi)容,紅色為運(yùn)行的命令)
1、安裝系統(tǒng)、編譯環(huán)境等
最小化安裝CentOS 。因?yàn)榘惭b后我們要升級(jí)系統(tǒng)補(bǔ)丁,再安裝必要組件,所以沒(méi)必要安裝其他組件。
安裝完后,配置iptables ,打開(kāi)80端口,或者直接關(guān)閉iptables 。
用 yum update -y 升級(jí)系統(tǒng)的組件
安裝編譯Nginx 必要的組件:
yum install -y gcc make sendmail pcre pcre-devel openssl openssl-devel nano screen lrzsz wget curl curl-devel sendmail mlocate openssh-clients man patch
添加www 用戶組和用戶,并且指定www 用戶的shell 為/sbin/nologin
groupadd www && useradd -g www -s /sbin/nologin www
創(chuàng)建相關(guān)的目錄
mkdir -p /var/log/nginx /var/proxy_temp_dir /var/proxy_cache_dir
#touch /var/log/nginx/test.com.log
2、編譯nginx
下載nginx
cd ~
wget
tar zxf nginx-1.2.7.tar.gz
下載ngx_cache_purge
wget --no-check-certificate
"https://github.com/FRiCKLE/ngx_cache_purge/archive/master.zip" -O "ngx_cache_purge-master.zip"
unzip -x ngx_cache_purge-master.zip
下載nginx-upstream-jvm-route
wget
"http://nginx-upstream-jvm-route.googlecode.com/files/nginx-upstream-jvm-route-0.1.tar.gz" -O "nginx-upstream-jvm-route-0.1.tar.gz"
tar zxf nginx-upstream-jvm-route-0.1.tar.gz
進(jìn)入nginx 源代碼目錄
cd nginx-1.2.7
打補(bǔ)丁
patch -p0 < ../nginx_upstream_jvm_route/jvm_route.patch
,編譯
./configure --user=www --group=www --add-module=../nginx_upstream_jvm_route --add-module=../ngx_cache_purge-master --prefix=/usr/local/nginx
--with-http_stub_status_module --with-http_ssl_module
make && make install
3、配置nginx
進(jìn)入nginx 的配置目錄
cd /usr/local/nginx/conf/
vi nginx.conf
nginx.conf 的配置
user www www;
worker_processes 8;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
log_format access_log '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
,fastcgi_temp_file_write_size 128k;
##cache_start##
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#注:proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區(qū)
proxy_temp_path /var/proxy_temp_dir;
#設(shè)置Web 緩存區(qū)名稱為cache_one,內(nèi)存緩存空間大小為200MB ,1天清理一次緩存,硬盤緩存空間大小為1GB 。
proxy_cache_path /var/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=1g;
##cache_end##
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
include upstream.conf;
include vhostconf/*.conf;
}
vi upstream.conf
(增加后端服務(wù)器時(shí),需要在此添加后端服務(wù)器。添加或修改的主要內(nèi)容是上游服務(wù)器的訪問(wèn)地址,以及指定upstream 名稱。)
upstream www.test.com {
server 192.168.1.102:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.103:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.105:80 weight=1 max_fails=2 fail_timeout=30s;
jvm_route $cookie_JSESSIONID reverse;
}
創(chuàng)建vhostconf 目錄
mkdir vhostconf
,配置相應(yīng)的主機(jī)
(增加后端服務(wù)器時(shí),需要在此添加后端服務(wù)器。主要修改的有綁定域名、proxy_pass對(duì)應(yīng)upstream.conf 的地址)
vi vhostconf/test.com.conf
server {
listen 80;
server_name www.test.com;
location / {
#root /var/www/test.com;
#index index.jsp index.htm index.html;
#如果后端的服務(wù)器返回502、504、執(zhí)行超時(shí)等錯(cuò)誤,自動(dòng)將請(qǐng)求轉(zhuǎn)發(fā)到upstream 負(fù)載均衡池中的另一臺(tái)服務(wù)器,實(shí)現(xiàn)故障轉(zhuǎn)移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#對(duì)不同的HTTP 狀態(tài)碼設(shè)置不同的緩存時(shí)間
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
#以域名、URI 、參數(shù)組合成Web 緩存的Key 值,Nginx 根據(jù)Key 值哈希,存儲(chǔ)緩存內(nèi)容到二級(jí)緩存目錄內(nèi)
proxy_cache_key $host$uri$is_args$args;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.test.com;
expires 1d;
}
#用于清除緩存,假設(shè)一個(gè)URL 為http://192.168.8.42/test.txt,通過(guò)訪問(wèn)
location ~ /purge(/.*)
{
#設(shè)置只允許指定的IP 或IP 段才可以清除URL 緩存。
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
#擴(kuò)展名以.php 、.jsp 、.cgi 結(jié)尾的動(dòng)態(tài)應(yīng)用程序不緩存。
,location ~ .*.(php|jsp|cgi|asp|aspx)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://www.test.com;
}
location /nginx_status {
stub_status on;
access_log off;
allow 183.63.215.39;
deny all;
}
access_log /var/log/nginx/test.com.log access_log;
}
測(cè)試配置文件是否正確:
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
4、配置nginx 自啟動(dòng)
創(chuàng)建nginx 自啟動(dòng)腳本
vi /etc/init.d/nginx
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
,# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid }
# reload nginx service functions.
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
,stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1
esac
exit $RETVAL
加上x 權(quán)限
chmod x /etc/init.d/nginx
加上自啟動(dòng)
echo /etc/init.d/nginx start >> /etc/rc.local
啟動(dòng)nginx
/etc/init.d/nginx start
,三、優(yōu)化
1、避免后端服務(wù)器出現(xiàn)大文件。通常CC 攻擊會(huì)連接服務(wù)器的大文件,企圖用盡服務(wù)器的帶寬資源,因此,后端服務(wù)器不要放置大文件,對(duì)于大的圖片,應(yīng)對(duì)圖片進(jìn)行切片,切成多塊以減小體積。
2、后端服務(wù)器盡量單獨(dú)開(kāi)一個(gè)非80端口(比如24392)給前端服務(wù)器,如果后端有硬件防火墻,要做直通。
3、如果后端服務(wù)器負(fù)荷仍然大,可以通過(guò)修改緩存時(shí)間等,提高命中率。
4、可以配置nginx 的防攻擊模塊,對(duì)于連接過(guò)于頻繁的client 進(jìn)行屏蔽。
5、可以對(duì)前端服務(wù)器進(jìn)行雙網(wǎng)卡捆綁,提高服務(wù)器帶寬。
6、可以多臺(tái)前端機(jī)器,采用keepalived 負(fù)載均衡