F5 Http profile 的 insert x-forward-for


場景:當使用F5進行http proxy時,我們希望node服務器能正確獲取來源IP地址。

試驗:

  • 使用開啟了insert x-forward-for選項的http profile。
  • 客戶端地址:192.168.200.1,F5 VIP: 192.168.200.70 , F5 internel IP: 172.30.16.12,node IP: 172.30.10.100
  • 從客戶端發送一個http request。發現發送到后台node的http header的最后一行會包括一個X-Forwarded-For :192.168.200.1的頭信息。

使用Java servlet API - request.getHeader("X-Forwarded-For")獲得的值為:192.168.200.1

(如果在后台服務器中間架個squid,則squid默認會開啟X-Forwarded-For,此時squid會在該值后面附加一個, 172.30.16.12。此時使用Java servlet API - request.getHeader("X-Forwarded-For")獲得的值為:192.168.200.1, 172.30.16.12)

  • 在客戶端使用jmeter發送一個包含X-Forwarded-For:221.221.221.3的request。用tcpdump發現發送到node的header中有2個Forward頭,即X-Forwarded-For:221.221.221.3和X-Forwarded-For :192.168.200.1。

使用Java servlet API - request.getHeader("X-Forwarded-For")獲得的值為:221.221.221.3。

(如果在后台服務器中間架個squid,則squid默認會開啟X-Forwarded-For,此時squid會把2個forward頭變成1個,並且在該值后面附加一個, 172.30.16.12。此時使用Java servlet API - request.getHeader("X-Forwarded-For")獲得的值為:221.221.221.3, 192.168.200.1, 172.30.16.12)

    • 這說明forward頭時可以偽造的,如果不信任客戶端發送到F5的X-Forwarded-For頭,則可以使用F5的irule刪除客戶端的XFF,如下所示:

      when HTTP_REQUEST {
      HTTP::header remove X-Forwarded-For
      HTTP::header insert X-Forwarded-For [IP::client_addr]
      }

    • 或者

      when HTTP_REQUEST {
      if {[HTTP::header exists X-Forwarded-For]}{
      set old_xff [HTTP::header values X-Forwarded-For]
      HTTP::header remove X-Forwarded-For
      HTTP::header insert X-Forwarded-For_Org "[IP::client_addr], $old_xff"
      } else { 
      HTTP::header insert X-Forwarded-For [IP::client_addr]
      }
      }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM