亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nginx中透傳客戶端真實IP的技巧

 更新時間:2024年08月21日 10:52:08   作者:小小工匠  
為了記錄日志、限制訪問或進行其他基于?IP?地址的操作,獲取客戶端的真實?IP?地址非常重要,本文就來詳細的介紹一下Nginx中透傳客戶端真實IP的技巧,感興趣的可以了解一下

概述

1. 為什么需要獲取客戶端的真實 IP 地址?

在使用 Nginx 作為反向代理服務(wù)器時,默認情況下,后端服務(wù)器只能看到 Nginx 的IP地址。為了記錄日志、限制訪問或進行其他基于 IP 地址的操作,獲取客戶端的真實 IP 地址非常重要。

2. Nginx 中用于獲取真實 IP 地址的模塊

Nginx 提供了兩個主要模塊來處理這一需求:

  • HttpRealipModule: 用于從請求頭中提取客戶端的真實 IP 地址。
  • HttpGeoipModule: 用于根據(jù) IP 地址定位地理位置(較少用于獲取真實 IP)。

這里主要介紹 HttpRealipModule。

3. 配置示例和步驟

3.1 安裝和啟用模塊

大多數(shù)情況下,Nginx 已經(jīng)包含了 HttpRealipModule??梢酝ㄟ^以下命令檢查:

nginx -V 2>&1 | grep -o with-http_realip_module

如果沒有啟用該模塊,則需要重新編譯 Nginx 或安裝包含該模塊的 Nginx 版本。

3.2 配置 Nginx

編輯你的 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 中的某個文件),添加以下配置:

http {
    ...
    set_real_ip_from 0.0.0.0/0;  # 允許所有 IP 地址的代理
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    ...
    
    server {
        ...
        location / {
            ...
            # 如果需要日志中記錄真實 IP
            log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
            access_log /var/log/nginx/access.log custom;
            ...
        }
    }
}

3.3 配置說明

  • set_real_ip_from: 允許哪些 IP 地址可以作為可信代理。如果你的代理服務(wù)器在特定的 IP 范圍內(nèi),只允許那些 IP。
  • real_ip_header: 指定哪個頭部字段包含了真實 IP 地址。常用的是 X-Forwarded-For。
  • real_ip_recursive: 遞歸地檢查 X-Forwarded-For 頭部中的所有 IP 地址,直到找到第一個非可信代理的 IP。

4. 潛在的陷阱和調(diào)試方法

4.1 潛在的陷阱

  • 代理鏈中的 IP 地址順序X-Forwarded-For 頭部可能包含多個 IP 地址,代表了一系列代理服務(wù)器。確保配置的 real_ip_recursive on 正確地獲取到第一個客戶端的 IP 地址。
  • 安全問題:配置 set_real_ip_from 時,要小心不要信任不受控制的 IP 地址,否則可能會導(dǎo)致 IP 欺騙。

4.2 調(diào)試方法

  • 檢查日志:通過查看 Nginx 日志,確認是否成功獲取到真實 IP 地址。
  • 測試請求:使用工具如 curl 模擬請求,帶上 X-Forwarded-For 頭部,觀察服務(wù)器的響應(yīng)和日志記錄。
curl -H "X-Forwarded-For: 203.0.113.195" http://your-nginx-server

實操

http 節(jié)點 添加$http_x_forwarded_for日志格式

配置文件中需要添加$http_x_forwarded_for日志格式, 核心內(nèi)容如下

http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  ' $remote_addr |  $http_x_forwarded_for |  $remote_user | $time_local | $request | $http_host |'
                      ' $status | $upstream_status | $body_bytes_sent | $http_referer '
                      ' $http_user_agent | $upstream_addr | $request_time | $upstream_response_time';

http節(jié)點 日志格式中需要添加$http_x_forwarded_for

log_format 指令用于定義 Nginx 的日志格式。它指定了在日志文件中記錄哪些信息以及如何格式化這些信息。每個字段使用一個變量表示,變量之間可以用分隔符分開,如空格、豎線(|)等。定義的日志格式可以應(yīng)用于 access_log 指令,以便記錄客戶端請求的詳細信息。

以下是 log_format 指令中各個變量的含義:

log_format  main  ' $remote_addr |  $http_x_forwarded_for |  $remote_user | $time_local | $request | $http_host |'
                  ' $status | $upstream_status | $body_bytes_sent | $http_referer '
                  ' $http_user_agent | $upstream_addr | $request_time | $upstream_response_time';
  • $remote_addr: 客戶端的 IP 地址。這是直接連接到 Nginx 的客戶端的 IP 地址。
  • $http_x_forwarded_for: 客戶端的真實 IP 地址。通常用于記錄經(jīng)過代理服務(wù)器或負載均衡器的客戶端 IP 地址,X-Forwarded-For 頭部中包含了這些 IP。
  • $remote_user: 客戶端的用戶名,如果請求需要 HTTP 基本認證時會記錄用戶名。如果沒有認證信息則為 -。
  • $time_local: 本地時間和日期,格式為 day/month/year:hour:minute:second。
  • $request: 請求的完整 URI,包括參數(shù)。格式為 METHOD URI PROTOCOL,例如 GET /index.html HTTP/1.1。
  • $http_host: 請求中的 Host 頭部內(nèi)容,即訪問的主機名。
  • $status: 響應(yīng)的 HTTP 狀態(tài)碼,例如 200 表示成功,404 表示未找到,500 表示服務(wù)器內(nèi)部錯誤等。
  • $upstream_status: 上游服務(wù)器返回的狀態(tài)碼。當(dāng) Nginx 作為反向代理時,此變量記錄上游服務(wù)器的響應(yīng)狀態(tài)碼。
  • $body_bytes_sent: 傳送給客戶端的響應(yīng)主體內(nèi)容的字節(jié)數(shù),不包括響應(yīng)頭的大小。
  • $http_referer: 請求的引用頁面,即從哪個頁面鏈接過來的(Referer 頭部內(nèi)容)。如果沒有引用頁面則為 -。
  • $http_user_agent: 客戶端使用的瀏覽器或其他客戶端的信息(User-Agent 頭部內(nèi)容)。
  • $upstream_addr: 上游服務(wù)器的地址。當(dāng) Nginx 作為反向代理時,此變量記錄上游服務(wù)器的 IP 地址和端口。
  • $request_time: 處理請求的總時間,從接收到客戶端請求到完整發(fā)送響應(yīng)的時間,單位為秒。
  • $upstream_response_time: 從上游服務(wù)器讀取響應(yīng)的時間,單位為秒。

server節(jié)點 配置

server {
  listen       80;
  server_name  localhost;
  access_log  logs/access.log  main;       #需要添加日志引用
  proxy_set_header X-Real-IP $remote_addr;    #添加透傳配置
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
  location / {
  root html;
   }
}

http://chabaoo.cn/server/3262802e1.htm

使用 proxy_set_header 指令設(shè)置透傳頭部。確保代理服務(wù)器(如 Nginx)在轉(zhuǎn)發(fā)請求時保留原始客戶端的 IP 地址

驗證

方式一

在這里插入圖片描述

訪問Nginx頁面

在這里插入圖片描述

訪問日志

192.168.0.6 |  168.138.171.206 |  - | 19/May/2024:10:57:24 +0800 | GET / HTTP/1.1 | nginx.frps.fun | 200 | - | 615 | -  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 | - | 0.000 | -
  • 192.168.0.6:

含義:直接連接到 Nginx 服務(wù)器的客戶端的 IP 地址。在這個例子中,這可能是一個內(nèi)網(wǎng)的 IP 地址。

  • 168.138.171.206:

含義:通過 X-Forwarded-For 頭部獲取的客戶端的真實 IP 地址。在經(jīng)過代理或負載均衡器時,這個頭部會記錄原始客戶端的 IP 地址。

  • -:

含義:客戶端的用戶名。在請求需要 HTTP 基本認證時記錄用戶名。這里沒有進行認證,所以顯示為 -。

  • 19/May/2024:10:57:24 +0800:

含義:請求到達服務(wù)器的本地時間,格式為 day/month/year:hour:minute:second timezone。這個例子中表示 2024 年 5 月 19 日上午 10:57:24,時區(qū)為 +0800。

  • GET / HTTP/1.1:

含義:客戶端的請求行,包含請求的方法(GET)、請求的資源路徑(/),以及使用的 HTTP 協(xié)議版本(HTTP/1.1)。

  • nginx.frps.fun:

含義:請求中的 Host 頭部,表示客戶端請求訪問的主機名。

  • 200:

含義:HTTP 響應(yīng)狀態(tài)碼,表示請求成功。200 代表成功。

  • -:

含義:上游服務(wù)器的響應(yīng)狀態(tài)碼。在沒有上游服務(wù)器時,這里顯示為 -。

  • 615:

含義:傳送給客戶端的響應(yīng)主體內(nèi)容的字節(jié)數(shù),不包括響應(yīng)頭的大小。

  • -:

含義:請求的引用頁面(Referer)。如果沒有引用頁面則顯示為 -。

  • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36:

含義:客戶端使用的瀏覽器或其他客戶端的信息(User-Agent)。在這個例子中,表示客戶端使用的是 Chrome 瀏覽器,運行在 macOS 上。

  • -:

含義:上游服務(wù)器的地址。在沒有上游服務(wù)器時,這里顯示為 -。

  • 0.000:

含義:處理請求的總時間,從接收到客戶端請求到完整發(fā)送響應(yīng)的時間,單位為秒。

  • -:

含義:從上游服務(wù)器讀取響應(yīng)的時間。在沒有上游服務(wù)器時,這里顯示為 -。

方式二

如果我們前面沒有apisix或者其它lb,也可以使用curl命令來模擬X-Forwarded-For日志

curl http://127.0.0.1/ -H 'X-Forwarded-For: 1.1.1.1' -v
* About to connect() to 127.0.0.1 port 80 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1
> Accept: */*
> X-Forwarded-For: 1.1.1.1       #-v參數(shù)可以看到這里參數(shù)已經(jīng)傳入
>
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sun, 19 May 2024 03:09:05 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 615
< Last-Modified: Mon, 09 Oct 2023 06:03:57 GMT
< Connection: keep-alive
< ETag: "652397cd-267"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
#http:127.0.0.1 就是Nginx服務(wù)器

  • http://127.0.0.1/: 請求的 URL,127.0.0.1 表示本地服務(wù)器。
  • -H ‘X-Forwarded-For: 1.1.1.1’: 添加 HTTP 請求頭 X-Forwarded-For,其值為 1.1.1.1。這個頭部通常用于表示客戶端的真實 IP 地址。
  • -v: 顯示詳細的請求和響應(yīng)過程,包括頭部信息

日志

127.0.0.1 | 1.1.1.1 | - | 19/May/2024:10:57:24 +0800 | GET / HTTP/1.1 | 127.0.0.1 | 200 | - | 615 | - | curl/7.29.0 | - | 0.000 | -

從日志文件 logs/access.log 中,可以驗證 X-Forwarded-For 頭部信息是否正確記錄, 此日志記錄顯示,X-Forwarded-For 頭部中傳遞的 1.1.1.1 已正確記錄。

到此這篇關(guān)于Nginx中透傳客戶端真實IP的技巧的文章就介紹到這了,更多相關(guān)Nginx 透傳IP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論