【网络】使用 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_RS1IP_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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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的键,自动持久化到磁盘,同时支持多…