Nginx 內置變量,細化規則,真實IP獲取及限制連接請求


很多時候,我們的網站不是簡單的  普通用戶IE瀏覽器  ——->  你的服務器  的結構, 考慮到網絡訪問速度問題,我們中間可能會有各種 網絡加速(CDN)。以本網站  www.bzfshop.net 為例,考慮到網站的安全性和訪問加速,我們的架構是:

普通用戶瀏覽器  —–>  360網站衛士加速(CDN,360防 CC,DOS攻擊) ——>  阿里雲加速服務器(我們自己建的CDN,阿里雲盾) —-> 源服務器(PHP 程序部署在這里,iptables, nginx 安全配置)

可以看到,我們的網站中間經歷了好幾層的透明加速和安全過濾, 這種情況下,我們就不能用上面的“普通配置”。因為上面基於  源IP的限制 結果就是,我們把 360網站衛士  或者  阿里雲盾 給限制了,因為這里“源IP”地址不再是  普通用戶的IP,而是中間  網絡加速服務器 的IP地址。我們需要限制的是 最前面的普通用戶,而不是中間為我們做加速的 加速服務器。

 

1.1 現在我們面對的最直接的問題就是, 經過這么多層加速,我怎么得到“最前面普通用戶的 IP 地址”呢?

(這里只說明結果,不了解 Http 協議的人請自行 Google 或者 Wikipedia  http://zh.wikipedia.org/zh-cn/X-Forwarded-For  )

當一個 CDN 或者透明代理服務器把用戶的請求轉到后面服務器的時候,這個 CDN 服務器會在 Http 的頭中加入 一個記錄

X-Forwarded-For :  用戶IP, 代理服務器IP

如果中間經歷了不止一個 代理服務器,像 www.bzfshop.net 中間建立多層代理之后,這個 記錄會是這樣

X-Forwarded-For :  用戶IP, 代理服務器1-IP, 代理服務器2-IP, 代理服務器3-IP, ….

可以看到經過好多層代理之后, 用戶的真實IP 在第一個位置, 后面會跟一串 中間代理服務器的IP地址,從這里取到用戶真實的IP地址,針對這個 IP 地址做限制就可以了,

 

1.2 經過多層CDN之后取得原始用戶的IP地址,nginx 配置

 

 

1.3 測試、測試

很多時候,你在網上搜到一堆配置,你照着做了,但是你怎么知道這個配置真的正確 ?是的,我們需要自己做一個有效的真實的測試,驗證它是正確的之后才真的采用它

Nginx 這種配置怎么測試呢? 用 Echo 模塊,如果你知道 Nginx 這個模塊的話。

以 www.bzfshop.net 網站為例, 我們首先測試這個 $clientRealIp 是否真的是我們客戶機的 IP 地址,在網站上增加一個訪問地址,比如  www.bzfshop.net/nginx-test,配置如下:

接下來,用你的瀏覽器訪問  www.bzfshop.net/nginx-test,這個時候會彈出框下載一個文件 nginx-test,下載完成用 notepad++ 打開,里面就是一個 IP 地址

訪問 www.ip138.com ,看看這個里面記錄的IP地址是否和 ip138 偵測的IP 一致?

通過這種方式,你就可以對 Nginx 的一些復雜配置做有效的測試。

經過測試,我們確認 通過多層CDN 之后,$clientRealIp 仍然是有效的原始用戶IP地址

 

 1.4 根據用戶的真實 IP 做連接限制

下面是修改之后的 Nginx 配置:

 原博客地址:https://yq.aliyun.com/articles/44945


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM