由於網站使用了cdn所以$remote_addr獲取的ip是cdn的ip,我現在先禁止某些ip訪問發現無法禁止cdn傳遞過來的客戶端的ip也就是$http_x_forwarded_for這個參數。
比如我的日志格式這樣的:
log_format main '$http_x_forwarded_for $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr" up:$upstream_response_time-$request_time $upstream_http_content_length';
記錄的日志:
140.207.197.63 10.1.60.250 - - [20/Aug/2015:17:18:39 +0800] "HEAD / HTTP/1.1" 403 0 "-" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322) 360JK yunjiankong 329117" "10.1.60.151:8080" up:0.006-0.231 14393
我想拒絕所有只允許140.207.197.63這個ip訪問
allow 10.1.60.0/24;
allow 140.207.197.63;
deny all;
但是140.207.197.63訪問卻是403,10.1.60.0/24這個內網里面的ip訪問卻是正常的,於是乎發現nginx默認禁止的是$remote_addr參數而不是$http_x_forwarded_for。
那就想辦法把cdn傳遞過來的真是ip變量$http_x_forwarded_for傳遞給$remote_addr,那就用到了這個模塊--with-http_realip_module,編譯安裝的時候要啟用。加上下面兩個參數:
set_real_ip_from 10.1.60.250;
real_ip_header X-Forwarded-For;
意思就是所有來自10.1.60.250請求的header字段都改成X-Forwarded-For。這樣就把真實ip傳遞給$remote_addr變量了。
它就是把x_forwarded_for設為remote_addr,而nginx里的x_forwarded_for取的就是其中第一個IP。
使用這些設置就能保證你的remote_addr里設定的一直都是客戶端的真實IP。
然后再次訪問:
140.207.197.63 10.1.60.250 - - [20/Aug/2015:17:18:39 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322) 360JK yunjiankong 329117" "10.1.60.151:8080" up:0.006-0.231 14393
