經過負載均衡後獲得真實客戶IP的6種方法

2020-10-10 AI雲

閱讀目錄

  1. 獲得真實IP的6種方法總述
  2. 一次連接與二次連接
  3. 方法1: L3的一次連接模式
  4. 方法2: L3的二次連接模式
  5. 方法3: L4的toa模式
  6. 方法4: L4的proxy protocol模式
  7. 方法5: L7協議自帶,例如HTTP的X-FORWARD-FOR
  8. 方法6: L7層業務程序自行實現
  9. 總結

除了X-FORWARD-FOR,負載均衡中獲得真實源IP的方法還有很多種,本文拋磚引玉,主要介紹獲得真實源IP的多種方法,而不是具體配置,負載均衡獲得真實IP的方法有很多種,將形成專題文章,本文為第一篇,主要做介紹和優劣對比。

NGINX不僅可以實現http的反向代理,同時也支持TCP的反向代理,使用Nginx 新版的 stream方式,實現TCP/UDP代理轉發。在項目中由於網絡結構複雜,我就使用了NGINX的TCP代理在前,後面是NGINX的HTTP代理在後。後面的需要獲取客戶的真實ip,通過tcp代理後是取不到的。就使用了下面的方法4,實現了NGIXN 4層tcp代理獲取客戶真實IP。



獲得真實IP的6種方法

當數據包從負載均衡器往後端轉發時候,真實源IP可在L3層、L4層、L7層實現,並且每層分別有2種方法可以獲得真實IP,因此共有6種方法:

保持L3層源IP不變,根據連接次數可以分為

  • 一次連接模式,如LVS
  • 二次連接模式,如haproxy的透明模式

在L4層數據裡,添加源IP信息,有2種模式

  • 在4層的option欄位裡增加源IP信息,比如tcp option、udp option
  • 在4層末尾和7層開頭之間,增加proxy protocol信息

在L7層數據裡,增加源IP信息,有2種模式

  • 協議自帶,例如HTTP的X-FORWARD-FOR
  • 業務程序自行實現

一次連接與二次連接

一次連接:負載均衡器對數據包僅做轉發,而不對後端重新發起三次握手

二次連接:和一次連接相對應,在tcp轉發時候,對後端重新進行了三次握手。上面所講的L4和L7方法的負載均衡,都是二次連接

可以通過對比源埠是否有改變來簡單判斷是一次連接還是二次連接,埠沒改變,可以理解為一次連接,有改變就是二次連接

方法1: L3的一次連接模式

介紹:是指在網絡層不對源IP做修改,直接將數據包轉發給後端,當後端接收到數據的時候,源IP就是真實IP。

實現:LVS-DR、LVS-NAT、LVS-TUNNEL模式。其中LVS-TUNNEL比較特別,是在原有數據包的開頭封裝了IP頭,當後端收到數據的時候,將封裝的IP頭進行解封裝,獲得的就是原有數據包。

優點:邏輯簡單,當負載均衡器故障切換的時候,從客戶端到後端的tcp連接不會中斷

缺點:對網絡架構有要求,比如DR模式,要求後端配VIP,並且回包要能直接回到客戶機;NAT模式,要求回包經過負載均衡器;TUNNEL模式要求後端支持IPIP隧道


方法2: L3的二次連接模式

介紹:是指負載均衡器和後端重新進行三次握手,但保持數據包的源IP為真實IP。

實現:haproxy(開啟tproxy透明代理模式)+ iptables(fwmark打標記)+ 策略路由這3者組合才能實現

優點:可以實現L7層(如HTTP/HTTPS)的負載均衡,而一次連接主要實現L4層的負載均衡

缺點:配置最複雜,同時要求回包經過負載均衡器


方法3: L4的toa模式

介紹:在4層的option欄位裡增加源IP信息,比如在tcp option裡增加源IP信息(稱為toa)、udp option裡增加源IP信息(稱為uoa)

實現:負載均衡器配置lvs-fullnat(只支持toa),iqiyi/dpvs(支持toa和uoa);後端要加載toa、uoa模塊,這個模塊的作用是替換了後端應用程式獲取IP的系統接口的鉤子

優點:對網絡架構要求低

缺點:lvs-fullnat需要編譯內核,且只支持rhel/centos 6的內核,另外多年未更新;iqiyi/dpvs功能強大,但需要dpdk的支持;後端都需要加載toa/uoa模塊,且只支持linux系統。


方法4: L4的proxy protocol模式

介紹:在L7層開頭增加proxy protocol數據(該協議是haproxy發明),目前有v1(明文)和v2(二進位)版本

實現:負載均衡器和後端同時開啟proxy protocol,haproxy和nginx均支持,不過haproxy的配置顆粒度更小,另外nginx轉發數據時候只支持v1

優點:對網絡架構要求低,只要程序支持即可,因此理論上沒有作業系統限制

缺點:目前支持proxy protocol的程序較少,且兩端只能都開啟或者都不開啟該協議,不能一端開一端不開

nginx的官方文檔

https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#



方法5: L7協議自帶,例如HTTP的X-FORWARD-FOR

介紹:最常見的方法,協議自帶源IP信息,或者可定製插入

實現:例如HTTP協議有X-FORWARD-FOR,也可以自己將源IP插入到HTTP頭部信息裡

優點:對網絡架構要求低,配置簡便

缺點:容易被偽造


方法6: L7層業務程序自行實現

介紹:最好的方法,就是業務方自行實現

實現:業務自行實現,例如在client端插入源IP信息,帶到server端

優點:對網絡架構無要求,只要網絡可通即可,只要安全做好,不容易被偽造

缺點:業務方要有一定開發能力


總結

如果能做到無狀態,不需要真實源IP,是最好的。因為這樣對底層架構沒有要求,底層架構就可以做的更高級更彈性。

如果一定要獲得真實源IP,推薦方案的順序就是倒推,從L7到L3,即首選方法6,如果不行再選用方法5,以此類推到方法1。

相關焦點

  • Nginx負載均衡詳解
    Nginx 在分層架構裡扮演了一個 7 層應用層負載均衡角色。隨著軟體架構和系統架構的不斷演進變化,我們發現企業開始採用 K8s、Docker 這種輕量化、虛擬化部署;還有很多企業更加傾向於微服務架構,支持 set 化等。在這樣的架構下,傳統的分層負載均衡模式,促使改進去支持服務註冊和發現。這個就是我們要講的第二種 Nginx 負載均衡模式。
  • 伺服器負載均衡詳談
    ,銀行大集中)• 數據中心降低成本,提高效率負載均衡技術在現有網絡結構之上提供了一種廉價、有效、透明的方法,來擴展網絡設備和伺服器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。它有兩方面的含義:首先,大量的並發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應的時間;其次,單個重負載的運算分擔到多臺節點設備上做並行處理,每個節點設備處理結束後,將結果匯總,返回給用戶,系統處理能力得到大幅度提高。BIG/IP利用定義在其上面的虛擬IP位址來為用戶的一個或多個應用伺服器提供服務。因此,它能夠為大量的基於TCP/IP的網絡應用提供伺服器負載均衡服務。
  • Nginx系列:負載均衡
    0x01:負載均衡 Nginx的負載均衡使用upstream定義伺服器組,後面跟著組名,組名後面是大括號包起來的伺服器列表,每個伺服器使用server開頭,後面跟定義的伺服器名字、伺服器ip:port、參數;一個基本的upstream模塊如下:upstream [伺服器組名稱]{  server 
  • lvs負載均衡集群
    high availiablity,高可用HP:high performance,高性能負載均衡負載均衡(Load Balance)通過對服務請求的調度,以實現提高服務的並發處理能力。負載均衡實現的方法軟體上的負載按照網絡協議工作層的分類,可以分為兩種
  • 微服務管理平臺nacos虛擬ip負載均衡集群模式搭建
    目前許多個人開發者寫的博客或教程中的方法就是在三個nacos服務的前端加一個負載均衡器,如:nginx、haproxy。然後號稱是生產級別的搭建方法,但這種方法是絕對不能用於生產的,因為你的nginx和haproxy是單點,一旦nginx掛了,整個服務就掛了。
  • Nginx負載均衡和反向代理配置
    用戶無法得到網站的真實IP地 址。這樣就保護了網站伺服器,如果您有臺伺服器在國內又不想讓人找到IP,就可以在國外搭建一臺反向代理伺服器。一個反向代理伺服器將很多網站解析到同一 ip地址上。負載均衡示例圖Nginx負載均衡設置直接上圖nginx負載均衡設置Nginx 負載均衡主要使用upstream模塊完成,upstream指令主要是用於設置一組可以在
  • 一文理清負載均衡(nginx,LVS)的工作原理
    >輪詢最基本的配置方法,它是 upstream 模塊默認的負載均衡默認策略。ip_hash指定負載均衡器按照基於客戶端 IP 的分配方式,這個方法確保了相同的客戶端的請求一直發送到相同的伺服器,以保證 session 會話。這樣每個訪客都固定訪問一個後端伺服器,可以解決 session 不能跨伺服器的問題。
  • 這6種實現負載均衡技術的方式不容錯過
    負載均衡(Load Balance)是集群技術(Cluster)的一種應用,可以將工作任務分攤到多個處理單元,從而提高並發處理能力,有利於提升中大型網站的性能。接下來小編就為大家介紹6種實現負載均衡技術的方式:1、http重定向協議實現負載均衡根據用戶的http請求計算出一個真實的web伺服器地址,並將該web伺服器地址寫入http重定向響應中返回給瀏覽器,由瀏覽器重新進行訪問。該方式比較簡單,但性能較差,2、【協議層】dns域名解析負載均衡在DNS伺服器上配置多個域名對應IP的記錄。
  • 分布式系統的負載均衡 | 架構乾貨
    總而言之,負載均衡(Load Balance)是分布式系統架構設計中必須考慮的因素之一。一般通過負載均衡,冗餘同一個服務實例的方式,解決分布式系統的大流量、高並發和高可用的問題。負載均衡核心關鍵:在於是否分配均勻。
  • 美團資深架構師給你講述不一樣的lvs+nginx負載均衡
    1學習目標掌握什麼是負載均衡及負載均衡的作用和意義。了解lvs負載均衡的三種模式。了解lvs-DR負載均衡部署方法。掌握nginx實現負載均衡的方法。掌握lvs+nginx負載均衡拓撲結構。這就是負載均衡最初的基本設計思想。 負載均衡是由多臺伺服器以對稱的方式組成一個伺服器集合,每臺伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。通過某種負載分擔技術,將外部發送來的請求按照某種策略分配到伺服器集合的某一臺伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。
  • nginx淺談之負載均衡
    nginx可以處理大量並發連接,請求到來後,nginx可將其轉發給任意數量的後臺伺服器進行處理,這等於將負載均衡分散到整個集群。語法:proxy_pass URL解釋:URL的形式可以如下:http://location:8000/uri/等,可在location中進行配置。
  • LVS負載均衡、NET模式、DR模式
    LVS:linux virtual server,linux虛擬伺服器,從linux內核2.6版本開始為模塊集成與內核中,使用起來靈活方便,可以實現負載均衡群集部署的功能。負載均衡分層:1.負載調度層:一臺或者多臺調度器組從,通過在主機加載
  • Haproxy負載均衡+Keepalived高可用集群實戰
    客戶端通過Haproxy代理伺服器獲得站點頁面,而代理伺服器收到客戶請求後根據負載均衡的規則將請求數據轉發給後端真實伺服器,實現了一種事件驅動、單一進程模型,能支持非常大的並發連接數。ip進行Hash計算並保存,由此確保相同IP訪問時被轉發到同一真實伺服器上。
  • 滲透測試中的網站真實IP獲取方法大全
    IP信息,相關查詢網站有:ip138查詢:https://site.ip138.com/ (推薦)iphistory:https://viewdns.info/iphistory/ (國外)DNS查詢:https://dnsdb.io/zh-cn/ (註冊帳號機制)微步在線:https://x.threatbook.cn/
  • EIGRP負載均衡的實現
    EIGRP支持等價和非等價的負載均衡,要理解等價的負載均衡和非等價的負載均衡的前提是首先要知道負載均衡的方式在cisco中,負載均衡分為兩種,一種是基於目標地址的負載均衡,一種是基於數據包的負載均衡。>由於默認是基於CEF的負載均衡,所以要實現EIGRP的等價和不等價的負載均衡,需要關閉cef的急速轉發。
  • springCloud負載均衡機制
    springCloud基於RestTemplate抽象出負載均衡過程,消費者通過http://APP-PROVIDER/user/add這種url格式去訪問提供者接口,其中 APP-PROVIDER 這個是 提供者服務的應用名(準確來說是在註冊中心的serviceId,一般serviceId是應用名),那麼肯定需要在發起http請求調用之前把 APP-PROVIDER 轉換成 ip:port
  • Nginx+SpringBoot實現負載均衡
    負載均衡介紹介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為「硬體負載均衡和軟體負載均衡」,硬體負載均衡是使用專門的軟體和硬體相結合的設備簡單來說所謂的負載均衡就是把很多請求進行分流,將他們分配到不同的伺服器去處理。比如我有3個伺服器,分別為A、B、C,然後使用Nginx進行負載均衡,使用輪詢策略,此時如果收到了9個請求,那麼會均勻的將這9個請求分發給A、B、Cf伺服器,每一個伺服器處理3個請求,這樣的話我們可以利用多臺機器集群的特性減少單個伺服器的壓力。
  • Nginx學習之簡單練習反向代理和負載均衡
    正向代理隱藏真實客戶端,反向代理隱藏真實服務端Nginx反向代理配置例子練習首先安裝一個resin準備安裝包,解壓就可以了解壓後,啟動resin,可以通過瀏覽器訪問到首頁首頁的位置文件在/resin目錄/webapps/index.jsp
  • Nginx 負載均衡
    負載均衡策略的出現和發展成為緩解上述問題的有效途徑。本文將帶你了解基於 Nginx 實現的負載均衡。什麼是負載均衡負載均衡(Load Balance),它在網絡現有結構之上可以提供一種廉價、有效、透明的方法來擴展網絡設備和伺服器的帶寬,並可以在一定程度上增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性等。
  • 負載均衡解析與Nginx實戰
    當負載均衡伺服器接收請求之後,根據不同的負載均衡算法,通過 IP 將請求轉發至不同的真實伺服器。四層負載均衡用 虛擬ip + port 方式。1.5 負載均衡算法負載均衡伺服器在決定將請求轉發到具體哪臺真實伺服器的時候,是通過負載均衡算法來實現的。負載均衡算法,是一個負載均衡伺服器的核心。