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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反向代理与Real-IP和X-Forwarded-For(转)

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反向代理与Real-IP和X-Forwarded-For(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如下圖所示,客戶端通過Nginx Proxy1 和 Nginx Proxy2 兩層反向代理才訪問到具體服務Nginx Backend(或如Tomcat服務)。那Nginx Backend如何才能拿到真實客戶端IP呢?

接下來我們來看看如何才能獲取到客戶端真實IP。


場景1
  場景1是很簡單的場景,Nginx Proxy直接把請求往后轉發,沒有做任何處理。
  Nginx Proxy
  192.168.107.107 nginx.conf
  location /test {
  proxy_pass http://192.168.107.112:8080;
  }
  192.168.107.112 nginx.conf
  location /test {
  proxy_pass http://192.168.107.114:8080;
  }
  Nginx Proxy就是簡單的把請求往后轉發。
  Nginx Backend
  192.168.107.114 nginx.conf
  location /test {
  default_type text/html;
  charset gbk;
  echo "$remote_addr || $http_x_forwarded_for";
  }
  Nginx Backend輸出客戶端IP($remote_addr)和X-Forwarded-For請求頭($http_x_forwarded_for),當訪問服務時輸出結果如下所示:
  192.168.107.112 ||
  分析
$remote_addr代表客戶端IP,當前配置的輸出結果為最后一個代理服務器的IP,并不是真實客戶端IP;
在沒有特殊配置情況下,X-Forwarded-For請求頭不會自動添加到請求頭中,即Nginx Backend的$http_x_forwarded_for輸出為空。


場景2
  場景2通過添加X-Real-IP和X-Forwarded-For捕獲客戶端真實IP。
  Nginx Proxy
  192.168.107.107 nginx.conf
  location /test {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://192.168.107.112:8080;
  }
  192.168.107.112 nginx.conf
  location /test {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://192.168.107.114:8080;
  }
  Nginx Backend
  192.168.107.114 nginx.conf
  location /test {
  default_type text/html;
  charset gbk;
  echo "$remote_addr ||$http_x_real_ip ||$http_x_forwarded_for";
  }
  當訪問服務時,輸出結果為:
  192.168.107.112 || 192.168.162.16 || 192.168.162.16, 192.168.107.107
  分析

  • 在離用戶最近的反向代理NginxProxy 1,通過“proxy_set_header X-Real-IP $remote_addr”把真實客戶端IP寫入到請求頭X-Real-IP,在NginxBackend輸出$http_x_real_ip獲取到了真實客戶端IP;而Nginx Backend的“$remote_addr”輸出為最后一個反向代理的IP;
  • “proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for”的是把請求頭中的X-Forwarded-For與$remote_addr用逗號合起來,如果請求頭中沒有X-Forwarded-For則$proxy_add_x_forwarded_for為$remote_addr。
  •   X-Forwarded-For代表了客戶端IP,反向代理如Nginx通過$proxy_add_x_forwarded_for添加此項,X-Forwarded-For的格式為X-Forwarded-For:real client ip, proxy ip 1, proxy ip N,每經過一個反向代理就在請求頭X-Forwarded-For后追加反向代理IP。
      到此我們可以使用請求頭X-Real-IP和X-Forwarded-For來獲取客戶端IP及客戶端到服務端經過的反向代理IP了。這種方式還是很麻煩,$remote_addr并不是真實客戶端IP。


    場景3
      為了更方便的獲取真實客戶端IP,可以使用nginx http_realip_module模塊解決,在安裝nginx時通過--with-http_realip_module安裝該模塊。NginxProxy配置和場景2一樣。
      Nginx Backend
      192.168.107.114 nginx.conf
      real_ip_header X-Forwarded-For;
      set_real_ip_from 192.168.0.0/16;
      real_ip_recursive on;
      location /test {
      default_type text/html;
      charset gbk;
      echo "$remote_addr || $http_x_real_ip ||$http_x_forwarded_for";
      }
      當訪問服務時,輸出結果為:
      192.168.162.16 || 192.168.162.16 || 192.168.162.16, 192.168.107.107
      分析

  • X-Real-IP和X-Forwarded-For和場景2一樣;
  • 使用realip模塊后,$remote_addr輸出結果為真實客戶端IP,可以使用$realip_remote_addr獲取最后一個反向代理的IP;
  • real_ip_headerX-Forwarded-For:告知Nginx真實客戶端IP從哪個請求頭獲取,如X-Forwarded-For;
  • set_real_ip_from192.168.0.0/16:告知Nginx哪些是反向代理IP,即排除后剩下的就是真實客戶端IP,支持配置具體IP地址、CIDR地址;
  • real_ip_recursive on:是否遞歸解析,當real_ip_recursive配置為off時,Nginx會把real_ip_header指定的請求頭中的最后一個IP作為真實客戶端IP;當real_ip_recursive配置為on時,Nginx會遞歸解析real_ip_header指定的請求頭,最后一個不匹配set_real_ip_from的IP作為真實客戶端IP。
  •   如果配置“real_ip_recursive off; ”,則輸出結果為:
      192.168.107.107 || 192.168.162.16 ||192.168.162.16, 192.168.107.107


      總結

  • 通過“proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for” 把從真實客戶端IP和反向代理IP通過逗號分隔,添加到請求頭中;
  • 可以在第一個反向代理上配置“proxy_set_header X-Real-IP $remote_addr” 獲取真實客戶端IP;
  • 配合realip模塊從X-Forwarded-For也可以獲取到真實客戶端IP。
  •   在整個反向代理鏈條的第一個反向代理可以不配置“proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for”,否則客戶端可以偽造X-Forwarded-For從而偽造客戶端真實IP,如果服務端使用X-Forwarded-For第一個IP作為真實客戶端IP,則就出問題了。如果通過配置X-Real-IP請求頭或者配合realip模塊也不會出現該問題。如果自己解析X-Forwarded-For的話,記得使用realip算法解析,而不是取第一個。
      當我們進行限流時一定注意限制的是真實客戶端IP,而不是反向代理IP,我遇到過很多同事在這塊出問題的。

    ?

    轉載于:https://www.cnblogs.com/yunweiqiang/p/8488746.html

    總結

    以上是生活随笔為你收集整理的反向代理与Real-IP和X-Forwarded-For(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

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