日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx在多层代理下获取真实客户端IP地址

發(fā)布時間:2024/2/28 Nginx 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx在多层代理下获取真实客户端IP地址 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在研究nginx中如何獲取真實客戶端IP的方法。眾所周知,在編譯Nginx時,可通過添加http_realip_module模塊來獲取真實客戶端IP地址。何為真實IP地址呢?請看下圖,既獲取到的真實客戶端IP是101,既不是正向代理服的104,也不是反向代理的105。

?

我們以PHP為例來說明整個過程吧。

前期準備:

在/home/apps/realip.com/下新建index.php:

<?php

foreach($_SERVER as $k=>$v)

echo $k . '=' . $v . '<br />';

?

修改104, 105, 106的nginx.conf的log格式為:

log_format? main? 'remote_addr=$remote_addr:$remote_port, http_x_forwarded_for=$http_x_forwarded_for, proxy_add_x_forwarded_for=$proxy_add_x_forwarded_for ';

?

場景一(最簡單的場景):

?

在106上的/etc/nginx/conf.d目錄里,新建realip.com.conf,內容如下。

upstream realip {

??? server 127.0.0.1:9100;

}?

server {

??? listen?????? 80;

??? server_name? realip.com;

?? ?access_log? /var/log/nginx/realip.com.access.log main;

??? error_log? /var/log/nginx/realip.com.error.log error;

? ? location / {

??????? root?? /home/apps/realip.com/;

??????? index? index.php;

??? }

? ? error_page?? 500 502 503 504? /50x.html;

??? location = /50x.html {

??????? root?? /usr/share/nginx/html;

??? }

? ? location ~ \.php$ {

??????? root?????????? /home/apps/realip.com/;

??????? fastcgi_pass?? realip;

??????? fastcgi_index? index.php;

??????? fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

??????? include??????? fastcgi_params;

??? }

? ? location ~ /\.ht {

??????? deny? all;

??? }

}

?

同時修改fastcgi_params文件確保有以下兩行:

fastcgi_param? REMOTE_ADDR??????? $remote_addr;

fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for;

?

在客戶機101上做host:

192.168.1.106 realip.com

?

在客戶機上打開瀏覽器訪問http://realip.com,看到的結果是:

REMOTE_ADDR=192.168.1.101

HTTP_X_FORWARDED_FOR=192.168.1.101

?

106上的Nginx log是:

remote_addr=192.168.1.101:23350, http_x_forwarded_for=-, proxy_add_x_forwarded_for=192.168.1.101

?

結果描述:

  • REMOTE_ADDR和HTTP_X_FORWARDED_FOR都是真實客戶端IP地址101。
  • ?

    場景二(增加一臺Nginx反向代理):

    ?

    在105上的/etc/nginx/conf.d目錄里,新建realip.com.conf,內容如下。

    ?

    upstream realip {

    ???????? #反向代理到106的80端口

    ??? server 192.168.1.106:80;

    }

    server {

    ??? listen?????? 80;

    ??? server_name? realip.com;

    ? ? access_log? /var/log/nginx/realip.com.access.log main;

    ??? error_log? /var/log/nginx/realip.com.error.log error;

    ?

    ??? location / {

    ??????? proxy_pass? http://realip;

    ? ? ? ? proxy_set_header?? Host???????????? $host;

    ??????? proxy_set_header?? X-Real-IP??????? $remote_addr;

    ??????? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    ? ? ? ? include??????? fastcgi_params;

    ??? }

    }

    ?

    同時修改fastcgi_params文件確保有以下一行:

    fastcgi_param? REMOTE_ADDR??????? $remote_addr;

    ?

    在客戶機101上修改host:

    192.168.1.105 realip.com

    ?

    在客戶機上打開瀏覽器訪問http://realip.com,看到的結果是:

    REMOTE_ADDR=192.168.1.105

    HTTP_X_FORWARDED_FOR=192.168.1.101, 192.168.1.105

    HTTP_X_REAL_IP=192.168.1.101

    ?

    106上的Nginx log是:

    remote_addr=192.168.1.105:34686, http_x_forwarded_for=192.168.1.101, proxy_add_x_forwarded_for=192.168.1.101, 192.168.1.105

    ?

    105上的Nginx log是:

    remote_addr=192.168.1.101:23417, http_x_forwarded_for=-, proxy_add_x_forwarded_for=192.168.1.101

    ?

    結果描述

  • REMOTE_ADDR變成了反向代理105的IP地址
  • HTTP_X_FORWARDED_FOR記錄了真實客戶端IP和反向代理IP,以逗號分隔。
  • 新出現(xiàn)的HTTP_X_REAL_IP也是真實客戶端IP地址,是由105的realip.com.conf配置寫入的
  • ?

    場景三(再增加一臺Nginx正向代理):

    ?

    Nginx是可以做正向代理的,但是必須指定resolver(既DNS)。但是我沒有搭建內網DNS,所以就把104又搭建成了一臺反向代理來模擬正向代理。我認為正向、反向代理原理都是差不多的,取得的結果也應該差不多的(如果誰能用真正的正向代理測試出了不同結果,請告知一下)。

    ?

    同時修改fastcgi_params文件確保有以下一行:

    fastcgi_param? REMOTE_ADDR??????? $remote_addr;

    ?

    在客戶機101上修改host:

    192.168.1.104 realip.com

    ?

    我們在客戶機上打開瀏覽器訪問http://realip.com,看到的結果是:

    REMOTE_ADDR=192.168.1.105

    HTTP_X_FORWARDED_FOR=192.168.1.101, 192.168.1.104, 192.168.1.105

    HTTP_X_REAL_IP=192.168.1.104

    ?

    106上的Nginx log是:

    remote_addr=192.168.1.105:34780, http_x_forwarded_for=192.168.1.101, 192.168.1.104, proxy_add_x_forwarded_for=192.168.1.101, 192.168.1.104, 192.168.1.105

    ?

    105上的Nginx log是:

    remote_addr=192.168.1.104:60142, http_x_forwarded_for=192.168.1.101, proxy_add_x_forwarded_for=192.168.1.101, 192.168.1.104

    ?

    104上的Nginx log是:

    remote_addr=192.168.1.101:23470, http_x_forwarded_for=-, proxy_add_x_forwarded_for=192.168.1.101

    ?

    結果描述

  • REMOTE_ADDR還是反向代理105的IP地址
  • HTTP_X_FORWARDED_FOR記錄了真實客戶端IP和兩臺反向代理IP,以逗號分隔。
  • HTTP_X_REAL_IP變成了104
  • ?

    結論:

    在默認配置情況下,如果要取得客戶端真實IP地址的話,只有取HTTP_X_FORWARDED_FOR的第一個逗號前的IP地址最靠譜,其他的地址都有可能被重寫。當然,如果連HTTP_X_FORWARDED_FOR都被重寫的話就另當別論了

    總結

    以上是生活随笔為你收集整理的Nginx在多层代理下获取真实客户端IP地址的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。