DSR负载均衡器设计中TCP流跨IP回包的通信问题咨询
核心问题直接结论
计算机A会一直向最初请求的IP地址Y发送后续报文,绝对不会自动切换到回包来源的IP X。
TCP连接的四元组(源IP、源端口、目的IP、目的端口)在三次握手完成时就会被操作系统内核固定记录,协议栈会对所有收到的报文做严格校验:如果收到的报文源IP和连接记录里的目的IP不匹配,内核会直接把报文当无效包丢弃,根本不会递交给上层应用,更不可能主动修改已建立连接的目的地址。
你当前设计的本质问题
你现在设计的“修改入向报文目的IP为后端真实IP再转发”的逻辑,是四层NAT负载均衡的实现方式,根本不是DSR(直接服务器返回)模式:
- 按这个逻辑转发,后端服务器收到的报文目的IP是自己的真实IP X,回包时自然会用X作为源IP,刚好触发前面说的客户端TCP校验逻辑,要么直接丢包,要么回RST包断开连接,根本无法建立正常的TCP连接
- 就算你在客户端做特殊静态配置绕开校验,这种模式下的回包流量也必须绕回负载均衡器做源NAT转换,把回包源IP改回Y才能让客户端识别,完全达不到你想要的“回包不经过LB、客户端和后端直接通信”的效果
TCP DSR负载均衡的正确实现逻辑
DSR模式的核心是转发全程不修改IP层的源、目的IP字段,只做二层链路层的转发,核心配置要点如下:
- 先在所有后端服务器的回环(lo)接口上绑定负载均衡对外的虚拟IP(也就是你说的接收请求的IP Y),同时必须在后端的物理网卡上配置ARP抑制,避免后端直接对外响应VIP的ARP请求,和负载均衡器产生IP冲突
- 负载均衡器收到目的IP为Y的入向报文后,不要改动IP头的任何字段,只把二层以太网帧的目标MAC地址替换成轮询选中的后端服务器的MAC地址,直接从对应物理网卡把帧转发出去
- 后端服务器收到这个二层帧时,因为自己的回环口绑定了VIP Y,IP层校验会判定这个报文是发给本机的,正常递交给对应端口的应用处理
- 后端处理完请求构造回包时,直接用回环口上的VIP Y作为源IP,通过物理网卡把回包直接发给原始客户端A,整个回包路径完全不经过负载均衡器
- 客户端收到的回包源IP就是自己最初请求的Y,TCP四元组完全匹配,连接状态正常,后续请求会持续发往VIP Y。注意DSR模式下不能做无状态的纯轮询调度,必须记录流表保证同一条TCP流的所有报文都转发到同一台后端,否则会出现请求被调度到其他后端、连接异常中断的问题
内容的提问来源于stack exchange,提问作者yemista
相关产品推荐
相关产品推荐

