在閱讀本文前,你們要有一個概念,因爲TCP須要三次握手鍊接,在實現正常的TCP/IP 雙方通訊狀況下,是沒法僞造來源 IP 的,也就是說,在 TCP/IP 協議中,能夠僞造數據包來源 IP ,但這會讓發送出去的數據包有去無回,沒法實現正常的通訊。php
一些DDoS 攻擊,它們只須要不斷髮送數據包,而不須要正常通訊,它們就會採起這種「發射出去就無論」的行爲來進行攻擊。html
那麼在HTTP 中, 「 僞造來源 IP」, 又是如何形成的?如何防護之?
先搞明白後端應用IP獲取來源
1.’REMOTE_ADDR’是遠端IP,默認來自tcp鏈接客戶端的Ip。能夠說,它最準確,肯定是,只會獲得直接連服務器客戶端IP。若是對方經過代理服務器上網,就發現。獲取到的是代理服務器IP了。
如:a→b(proxy)→c ,若是c 經過’REMOTE_ADDR’ ,只能獲取到b的IP,獲取不到a的IP了。
這個值是沒法修改的。前端
2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 爲了能在大型網絡中,獲取到最原始用戶IP,或者代理IP地址。對HTTp協議進行擴展。定義了實體頭。
HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2其中的值經過一個 逗號+空格 把多個IP地址區分開, 最左邊(client1)是最原始客戶端的IP地址, 代理服務器每成功收到一個請求,就把請求來源IP地址添加到右邊。
HTTP_CLIENT_IP 在高級匿名代理中,這個表明了代理服務器IP。
其實這些變量,來自http請求的:X-Forwarded-For字段,以及client-ip字段。 正常代理服務器,固然會按rfc規範來傳入這些值。
可是,攻擊者也能夠直接構造該x-forword-for值來「僞造源IP」,而且能夠傳入任意格式IP.
這樣結果會帶來2大問題,其一,若是你設置某個頁面,作IP限制。 對方能夠容易修改IP不斷請求該頁面。 其二,這類數據你若是直接使用,將帶來SQL註冊,跨站攻擊等漏洞。nginx
這類問題,其實很容易出現,好比不少時候利用這個騙取大量假裝投票。那麼該如何修復呢?
在代理轉發及反向代理中常常使用X-Forwarded-For 字段。
X-Forwarded-For(XFF)的有效性依賴於代理服務器提供的鏈接原始IP地址的真實性,所以, XFF的有效使用應該保證代理服務器是可信的.
好比Nginx代理服務器,咱們能夠在其轉發/反向代理的時候主動配置X-Forwarded-For爲正確的值。後端
location / { proxy_pass ....; proxy_set_header X-Forwarded-For $remote_addr ; }
$remote_addr 是 nginx 的內置變量,表明了客戶端真實(網絡傳輸層) IP 。經過此項措施,強行將 X-Forwarded-For 設置爲客戶端 ip, 使客戶端沒法經過本文所述方式「僞造 IP 」。服務器
若是最前端(與用戶直接通訊)代理服務器是與php fastcgi 直接通訊,則須要在其上設定:網絡
location ~ \.php$ { fastcgi_pass localhost:9000; fastcgi_param HTTP_X_FORWARD_FOR $remote_addr; }
可是更經常使用的配置以下:tcp
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
後臺代碼,經過X-Real-IP頭來獲取客戶真實IP.net
參考:
http://www.cnblogs.com/chengm...
http://zhangxugg-163-com.itey...
http://blog.csdn.net/lemon_tr...代理