一、場景
????????產品想要增加一個操作日志的模塊,重點記錄增刪改的操作ip。
二、問題描述
????????這塊業(yè)務其實需要按【是否代理】來分邏輯。首次開發(fā)時,并未考慮?測試生產環(huán)境有統(tǒng)一代理?,導致傳統(tǒng)的獲取ip方式取到了容器網(wǎng)關ip?!@然這樣是無法滿足產品想要區(qū)分操作ip。
三、調研過程
????????解決問題首先要明確一些基礎內容。參考如下:
express文檔:在代理后面運行Express
Express.js req.ip正在返回:: ffff:127.0.0.1
HTTP 請求頭中的 X-Forwarded-For
X-Forwarded-For
3.1?什么是req.ip?
????????當?trust proxy?為false時,req.ip的取值與req.connection.remoteAddress一致;
????????當?trust proxy?為true時,req.ip的取值與X-Forwarded-For的首個IP一致。
? ? ? ? 而?trust proxy?默認為false,因此?req.ip?默認為remoteAddress。
注意:這里引出兩個概念:remoteAddress和X-Forwarded-For。
3.2 什么是remoteAddress?
? ? ? ? 如果使用了代理,如nginx,客戶端發(fā)出的請求會先通過代理,由代理轉發(fā)給服務器。remoteAddress就是代理ip。
? ? ? ? 如果不使用代理,客戶端發(fā)出的請求會直接給服務器,remoteAddress就是真實ip。
3.3 什么是X-Forwarded-For?
????????同樣的道理,假設真實ip為Proxy0:
? ? ? ? 如果使用了代理,如Proxy1,那么客戶端發(fā)出的請求是以Proxy0,Proxy1的過程到達服務器,X-Forwarded-For就用英文逗號+空格記錄代理過程,參考上圖。
? ? ? ? 如果不使用代理,客戶端發(fā)出的HTTP請求默認沒有X-Forwarded-For頭部,又因為不經(jīng)過代理服務器,所以到達目標服務器時,依然沒有X-Forwarded-For。
3.4 什么是X-Real-Ip?
? ? ? ? X-Real-Ip的使用環(huán)境多為nginx配置,在配置中通過Set Header方法把轉發(fā)前的Proxy0,也就是remoteAddress值賦給X-Real-Ip頭部,避免在代理過程中丟失真實ip。
四、實踐
綜上內容,進行調試。我們依次在debug環(huán)境、production環(huán)境進行驗證:
4.1 客戶端ip不經(jīng)過代理,直接訪問??
結論:能獲取真實ip。
客戶端ip:127.xx.xx.49? ===>? 服務器ip:172.xx.xx.20
?4.2 客戶端ip不經(jīng)過代理,訪問容器 ?
結論:不能獲取真實ip。
客戶端ip:127.xx.xx.49? ===>? 容器ip:172.xx.xx.246(服務器ip:172.xx.xx.250)
?4.3 客戶端ip經(jīng)過1次代理,訪問容器??
結論:能獲取真實ip。
客戶端ip:127.xx.xx.49? ===>?代理ip:172.xx.xx.20? ===>?容器ip:172.xx.xx.246(服務器ip:172.xx.xx.250)
五、總結?
? ? ? ? 以上僅為我個人的粗淺理解,實際還有偽造請求頭的場景存在。
? ? ? ? 包括這也只是web端在電腦上的ip記錄,另外還有外網(wǎng)環(huán)境下移動端的ip記錄等。
? ? ? ? 路過還請指正。文章來源:http://www.zghlxwxcb.cn/news/detail-773173.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-773173.html
到了這里,關于學習NodeJs之【如何獲取客戶端真實IP】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!