【網絡】使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,回包失敗

【網絡】iptables 1 概念
【網絡】iptables 2 查看規則
【網絡】使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,回包失敗
【網絡】回包路由原理

使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,后端服務器將直接回包給客戶端,導致客戶端因收到源 IP 不匹配的響應而丟棄數據包,最終連接失敗。

場景設定

  • 客戶端 (Client):?IP_C

  • 負載均衡器 (Load Balancer):?IP_VIP?(虛擬服務 IP),?IP_LB?(LB 的內部接口 IP)

  • 后端真實服務器 (Real Server):?IP_RS1,?IP_RS2

  • 網絡拓撲:

    • 客戶端?IP_C?可以訪問?IP_VIP

    • 負載均衡器?IP_LB?可以訪問后端服務器?IP_RS1/RS2

    • 后端服務器?IP_RS1/RS2?知道如何到達?IP_C(例如,IP_C?和?IP_RS?在同一個二層網絡,或者?IP_RS?的默認網關指向了能到達?IP_C?的路由器)。


流量路徑分析

1. 請求 (Request) 路徑:IP_C -> IP_VIP
  1. 客戶端發送:?IP_C?發送一個請求包到?IP_VIP

  2. 到達負載均衡器: 包到達負載均衡器。此時包的源/目的為:src=IP_C, dst=IP_VIP

  3. iptables DNAT 執行:

    • 負載均衡器上的?iptables?規則(通常在?PREROUTING?鏈的?nat?表)匹配到該包。

    • 執行 DNAT,將目的 IP?從?IP_VIP?修改為某個后端服務器的 IP,例如?IP_RS1

    • 關鍵:?源 IP (IP_C) 保持不變。

    • 包變為:src=IP_C, dst=IP_RS1

  4. 負載均衡器轉發: 負載均衡器根據路由表,將修改后的包轉發給?IP_RS1

2. 響應 (Response) 路徑:IP_RS1 -> IP_C?(問題發生!)
  1. 后端服務器處理:?IP_RS1?收到一個來自?IP_C?的請求包(src=IP_C, dst=IP_RS1)。它認為這是一個直接的、正常的連接。

  2. 后端服務器直接回包:

    • IP_RS1?準備響應包。

    • 它查詢自己的路由表,發現有到達?IP_C?的路由(直連或通過網關)。

    • 因此,它直接將響應包發送給?IP_C

    • 響應包的源/目的為:src=IP_RS1, dst=IP_C

  3. 響應包繞過負載均衡器: 這個響應包直接從?IP_RS1?發往?IP_C,完全繞過了負載均衡器。


產生的問題

  1. 客戶端收到“錯誤”的響應:

    • 客戶端?IP_C?發起的是到?IP_VIP?的連接。

    • 它期望收到的響應包的源 IP 是?IP_VIP

    • 但它實際收到的響應包的源 IP 是?IP_RS1

    • 客戶端的 TCP/IP 協議棧會認為這是一個不屬于任何已知連接的、無效的包(因為五元組?src=IP_RS1, dst=IP_C?與它發起的?src=IP_C, dst=IP_VIP?不匹配)。

    • 結果: 客戶端通常會丟棄這個包,并可能發送一個?RST?(復位) 包給?IP_RS1,導致連接中斷。

  2. 連接狀態不完整:

    • 負載均衡器只看到了請求包(并執行了 DNAT),但從未看到響應包。

    • 它無法維護一個完整的連接狀態(conntrack)。如果后續有同一個連接的包到達,負載均衡器可能會再次進行 DNAT 決策,導致行為不一致。

  3. 非對稱路由 (Asymmetric Routing):

    • 請求路徑:?IP_C -> LB -> IP_RS1

    • 響應路徑:?IP_RS1 -> IP_C?(繞過 LB)

    • 這種進出路徑不一致的情況就是非對稱路由,在安全設備、狀態防火墻等場景下會引發問題。


為什么需要 SNAT/MASQUERADE?

為了解決上述問題,必須確保響應包也經過負載均衡器。這就是 SNAT 或 MASQUERADE 的作用。

  • 在 DNAT 的同時配置 SNAT:

    • 當負載均衡器執行 DNAT (dst=IP_VIP -> dst=IP_RS1) 時,同時執行 SNAT,將源 IP?從?IP_C?修改為負載均衡器自己的 IP (IP_LB)。

    • 發送給后端服務器的包變為:src=IP_LB, dst=IP_RS1

  • 后端服務器回包:

    • IP_RS1?收到?src=IP_LB, dst=IP_RS1?的包。

    • 它認為連接是?IP_LB?發起的,所以會回復?IP_LBsrc=IP_RS1, dst=IP_LB

    • 這個包必須經過負載均衡器(因為?IP_LB?是它的直接鄰居或默認網關)。

  • 負載均衡器處理回包:

    • 負載均衡器收到?src=IP_RS1, dst=IP_LB?的包。

    • 它查詢連接跟蹤表 (conntrack),找到原始連接記錄(orig=IP_C->IP_VIP, reply=IP_RS1->IP_LB)。

    • 執行逆向轉換:

      • 將目的 IP 從?IP_LB?改回?IP_C?(逆向 SNAT)。

      • 將源 IP 從?IP_RS1?改回?IP_VIP?(逆向 DNAT)。

    • 最終發給客戶端的包為:src=IP_VIP, dst=IP_C,客戶端完全滿意。


總結

iptables DNAT 負載均衡中,如果不配置 SNAT/MASQUERADE:

  1. 后端服務器會直接回包給客戶端,繞過負載均衡器。

  2. 客戶端收到源 IP 錯誤的響應包(是?IP_RS?而不是?IP_VIP)。

  3. 客戶端丟棄響應包,導致連接失敗。

因此,在標準的 DNAT 負載均衡場景中,SNAT/MASQUERADE 不是“可選”,而是“必需”的,以保證流量路徑的對稱性和連接的完整性。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93879.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析GCC:從編譯原理到嵌入式底層實戰

繼續更新編譯器底層系列!!!硬核C語言的屠龍之術:從GCC到匯編的底層征途(一)總綱: 恭喜你,決定踏上這條通往嵌入式大佬的硬核之路。這條路的起點,不是C語言的語法書&#…

最新MySQL面試題(2025超詳細版)

2025最新超詳細MySQL面試題 文章目錄2025最新超詳細MySQL面試題[toc]一、 SQL 和基本操作1. SQL的執行順序2. 如何優化MySQL查詢3. 常用的聚合函數4. 數據庫事務5. 事務的四大特性(ACID)6. 視圖7. MySQL中使用LIMIT子句進行分頁8. MySQL中使用變量和用戶定義的函數9. MySQL中的…

Spring Retry實戰指南_讓你的應用更具韌性

1 Spring Retry概述 1.1 什么是Spring Retry Spring Retry是Spring生態系統中的一個重要組件,專門用于處理應用程序中的重試邏輯。在分布式系統和微服務架構中,網絡通信、外部服務調用、數據庫訪問等操作都可能因為各種原因而失敗,如網絡抖動、服務暫時不可用、資源競爭等…

大數據畢業設計選題推薦-基于大數據的1688商品類目關系分析與可視化系統-Hadoop-Spark-數據可視化-BigData

?作者主頁:IT畢設夢工廠? 個人簡介:曾從事計算機專業培訓教學,擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

【Grafana】grafana-image-renderer配合python腳本實現儀表盤導出pdf

背景 os:centos7Grafana:v12grafana-image-renderer:v4.0.10插件:否grafana-image-renderer可以以插件形式啟動,也可以以單獨服務啟動,在centos7插件啟動時,報錯glibc版本太低,未找到…

靜/動態庫 IIC(arm) day58

十七:動態庫和靜態庫 庫:一堆可執行二進制文件的集合,由若干個.o文件歸并生成 一:靜態(鏈接)庫:libxxx.a 生成一個獨立的可執行程序(運行時僅需要一個文件即可) 使用方便 不需要安裝 文件比較大 多個程序使用同一個靜態…

uniapp 手寫簽名組件開發全攻略

引言在移動應用開發中,手寫簽名功能是一個常見的需求,特別是在電子合同、審批流程、金融交易等場景中。本文將詳細介紹如何基于uni-app框架開發一個高性能、功能豐富的手寫簽名組件,并分享開發過程中的技術要點和最佳實踐。組件概述這個簽名組…

理解JavaScript中的函數賦值和調用

👨 作者簡介:大家好,我是Taro,全棧領域創作者 ?? 個人主頁:唐璜Taro 🚀 支持我:點贊👍📝 評論 ??收藏 文章目錄前言一、函數賦值二、函數調用三、 代碼示例總結前言…

交叉編譯 手動安裝 SQLite 庫 移植ARM

# 下載源碼 wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz tar -xzf sqlite-autoconf-3420000.tar.gz cd sqlite-autoconf-3420000cd /home/lxh/sqlite-autoconf-3420000 make distclean //清除下,因為我安裝失敗過。 ./configure --hostarm-…

翻譯記憶庫(TMX)與機器翻譯的結合應用

更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、核心概念解析 1.1 翻譯記憶庫 (Translation Memory, TM) 1.2 翻譯記憶交換格式 (Translation Memory eXchange, TMX) 二、為何要將兩者結合? 2.1 TM和MT的優勢是高度互補的 2.2 TMX在結合中的關鍵作用 2.3 TMX與MT的…

SpringBoot中集成eclipse.paho.client.mqttv3實現mqtt客戶端并支持斷線重連、線程池高并發改造、存儲入庫mqsql和redis示例業務流程,附資源下載

場景 SpringBoot整合MQTT服務器實現消息的發送與訂閱(推送消息與接收推送): SpringBoot整合MQTT服務器實現消息的發送與訂閱(推送消息與接收推送)_服務端接收mqtt消息-CSDN博客 上面SpringBoot集成MQTT使用的是spring-integration-mqtt依賴,也是經常使…

【考研408數據結構-08】 圖論基礎:存儲結構與遍歷算法

📚 【考研408數據結構-08】 圖論基礎:存儲結構與遍歷算法 🎯 考頻:????? | 題型:選擇題、綜合應用題、算法設計題 | 分值:約8-15分 引言 想象你正在規劃一次跨省自駕游,面前攤開一張復雜的…

SQL查詢語句的執行順序

好的,我們來詳細講解一下 SQL 查詢語句的執行順序。 很多人會誤以為 SQL 的執行順序就是我們寫的順序(SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY),但實際上,數據庫引擎在底層處理查詢…

【Android】OKHttp網絡請求原理和弱網優化

【Android】OKHttp網絡請求原理和弱網優化 1. OkHttp 網絡請求原理 OkHttp 的請求過程可以分為 四個關鍵階段: (假設你是通過 OkHttpClient.newCall(request).enqueue(callback) 發的請求) OkHttpClient│▼ Dispatcher (調度器)│▼ RealC…

概率論基礎教程第4章 隨機變量(四)

4.7 泊松隨機變量 定義 泊松隨機變量:如果一個取值于 $ 0, 1, 2, \ldots $ 的隨機變量對某一個 $ \lambda > 0 $,其分布列為: p(i)P{Xi}e?λλii!i0,1,2,?(7.1) \boxed{p(i) P\{X i\} e^{-\lambda} \frac{\lambda^i}{i!} \qquad i 0…

Unity高級開發:反射原理深入解析與實踐指南 C#

Unity高級開發:反射原理深入解析與實踐指南 在Unity游戲開發中,反射(Reflection) 是一項強大的元編程技術,它允許程序在運行時動態地獲取類型信息、創建對象和調用方法。根據Unity官方統計,超過78%的商業游…

任務五 推薦頁面功能開發

一、推薦頁面需求分析 由推薦頁面效果圖,可以看出,推薦頁面主要由頂部輪播圖和歌單列表頁面組成 二、推薦頁面輪播圖組件封裝 由于輪播圖,可能在項目多個地方用到,因此可以將輪播圖抽調成一個組件,然后各個頁面調用這個組件。 在開發輪播圖組件時,需要安裝better-scro…

【工具使用-Docker容器】構建自己的鏡像和容器

1. 鏡像和容器介紹 鏡像(Image)是一個只讀的模板,包含了運行某個應用所需的全部內容,比如: 操作系統(比如 Ubuntu)應用程序代碼運行環境(如 Python、Java、Node.js 等)庫…

Apache Shiro550 漏洞(CVE-2016-4437):原理剖析與實戰 SOP

在 Web 安全領域,反序列化漏洞一直是威脅等級極高的存在,而 Apache Shiro 框架中的 Shiro550 漏洞(CVE-2016-4437),更是因利用門檻低、影響范圍廣,成為滲透測試中頻繁遇到的經典漏洞。本文將從 “原理拆解”…

安卓開發者自學鴻蒙開發3持久化/數據與UI綁定

AppStorage,PersistentStorage與StorageLink AppStorage是應用全局狀態管理器,數據存儲于內存中,常見的如全局的黑暗模式,StorageLink是用來綁定AppStorage的鍵到ui上的工具,省去了用戶手寫代碼的無聊過程,PersistentStorage可以綁定AppStorage的鍵,自動持久化到磁盤,同時支持多…