要點:
- sourceip獲取方式有幾種,getRemoteAddr獲取的是公網(wǎng)ip
- apache+tomcat時,通過proxy-http模塊+getRemoteAddr獲取ip存在問題
- 手機開啟了移動數(shù)據(jù)且連接wifi時,本機ip取的是運營商分配的ip,而不是wifi路由器給的
應(yīng)用獲取客戶端ip是一個常見的需求,像投票系統(tǒng)是比較典型的。ip是投票規(guī)則的重要組成部分。下面分兩個部分來討論這個話題。
source ip 能否偽造
http請求當(dāng)中,ip理論上是無法偽造的。因為建立 TCP 連接需要三次握手,如果偽造了源 IP,無法建立 TCP 連接,更不會有后面的 HTTP 請求。但以下情況例外:
- MITM攻擊
- 惡意程序控制了server的網(wǎng)絡(luò)
- 惡意程序偽造它所在網(wǎng)段的另一ip地址
- BGP攻擊
通過以上描述,偽造源ip是一件比較困難的事情。
apache+tomcat 如何獲取source ip
在java應(yīng)用中,獲取source ip一般通過request.getRemoteAddr()完成,這個一般沒什么疑問,但有時,你會遇到問題。
以apache+tomcat部署場景為例。apache做反向代理,tomcat為backend server。經(jīng)測試發(fā)現(xiàn):
- 若通過proxy-http模塊連接,則取出的ip為apache的ip;
- 若通過proxy-ajp模塊連接,則取出的ip為實際的遠(yuǎn)程ip;
當(dāng)你獲取source ip發(fā)現(xiàn)有問題時,需要考慮下web server與中間件是否通過http方式連接。
如果部署方式是基于http模塊,又要獲取source ip,此時應(yīng)對web server做配置。參見 X-Forwarded-For