服務端如何獲取客戶端請求IP位址

2022-03-26 17:15:09 字數 1948 閱讀 8070

服務端獲取客戶端請求ip位址,常見的包括:x-forwarded-for、client-ip等請求頭,以及remote_addr引數。

remote_addr:指的是當前直接請求的客戶端ip位址,它存在於tcp請求體中,是http協議傳輸的時候自動新增,不受請求頭header的控制。因此,當客戶端與伺服器之間不存在任何**的時候,通過remote_addr獲取客戶端ip位址是最準確,也是最安全的。

x-forwarded-for,即xff,是很多**伺服器在請求**時新增上去的。如果客戶端和伺服器之間存在**伺服器,那麼通過remote_addr獲取的ip就是**伺服器的位址,並不是客戶端真實的ip位址。因此,需要**伺服器(通常是反向**伺服器)將真實客戶端的ip位址**給伺服器,**時客戶端的真實ip位址通常就存在於xff請求頭中。

client-ip同xff,也是**伺服器新增的用於**客戶端請求的真實ip位址,同樣儲存與請求頭中。

重點:1.remote_addr無法偽造。

當伺服器間存在反向**伺服器時,需要在反向**伺服器中**客戶端真實請求ip位址,可以設定x-forwarded-for、client-ip,也可以自定義請求頭名稱,然後在服務端**中獲取請求頭中的該值。需要注意的是,此時必須保證伺服器不會繞過**伺服器直接對外提供服務,否則存在ip偽造的風險。

nginx設定方式:

proxy_set_header x-forward-for $remote_addr;
(1)在最前端的nginx上設定xff:

location  ~  ^/static
$remote_addr是nginx的內建變數,代表了客戶端真實(網路傳輸層)ip。通過此項措施,強行將xff設定為客戶端ip,使客戶端無法通過http header偽造ip。

(2)後端所有機器不作任何設定,直接信任並使用前端機器傳遞過來的xff值即可。

nginx的realip模組配置:

set_real_ip_from 10.1.10.0/24;

real_ip_header x-forwarded-for;

上面的配置是把從 10.1.10這一網段過來的請求全部使用x-forwarded-for裡的頭資訊作為remote_addr。而nginx裡的x_forwarded_for取的就是其中第乙個ip。

haproxy前面先架臺nginx解密,再**到haproxy做負載均衡。這種在web伺服器前面就存在了兩個**,為了能讓它獲取到真實的客戶端ip,需要做以下配置。

(1)nginx的https**規則設定:

proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
這樣會讓nginx的https**增加x_forwarded_for頭資訊,儲存客戶的真實ip。

(2)修改haproxy的配置

option forwarded except 10.1.10.0/24
如果haproxy收到的請求是由內網傳過來的話(https**伺服器),就不會設定x_forwarded_for的值,保證後面的web伺服器拿到的就是前面https**傳過來的。

cdn在回源站時,會先新增x_forwarded_for頭資訊,儲存使用者的真實ip,而反向**也會設定這個值,不過不會覆蓋,而是把cdn伺服器的ip新增到x_forwarded_for的後面,這樣x_forwarded_for就有兩個值。 nginx會使用第乙個值,即客戶的真實ip;而php會使用第二個,即cdn的位址。導致php獲取到錯誤的ip,可以通過如下配置:

把nginx使用的值(即第乙個)傳給php。

Perl服務端通過CGI獲取客戶端ip位址

use cgi my remoteip env 客戶端ip位址 my remoteport env 埠 my http via env via頭部 可以根據下面方式,檢視整個http頭部內容 print response decoded content 將列印下面的內容 可以通過http via 是...

servlet如何獲取請求客戶端的IP位址

但是request.getremoteaddr 這種方法在大部分情況下都是有效的。但是在通過了apache,squid等反向 軟體就不能獲取到客戶端的真實ip位址了。如果使用了反向 軟體,將的url反向 為的url時,用request.getremoteaddr 方法獲取的ip位址是 127.0.0...

服務端和客戶端IP位址

getenv 獲取乙個環境變數的值 gethostbyname 函式說明 用網域名稱或主機名獲取ip位址 server server addr getenv server addr gethostbyname 函式說明 用網域名稱或主機名獲取ip位址 getenv remote addr 瀏覽當前頁...