LVS DR实现UDP协议的集群收不数据包

请教章博士和各位高手 我最近配置一个小的集群,采用LVS/DR方式, tcp的程序都能正常工作,但是udp程序发现一个奇怪的问题,我在real server 上跑了一个udp的server 程序,当udp客户端链接到Load Balance,在转发到后台的real server, real server 回复udp包时,客户端收不到数据包,但采用TCP协议就可以.我的配置例如:

VIP=202.33.66.102(独立的服务器,公网IP地址, 它的内网IP=192.168.1.36)
RIP=192.168.1.123
RIP=192.168.1.145
RIP=192.168.1.156

原来的Server程序Bind的IP为本机IP地址,但收不到UDP包,可以收到TCP包;后来我把Server程序Bind的IP改为VIP,就可以收到UDP和TCP包.现在我想如果Bind本机IP地址而不VIP,能否实现客户端收到包,该怎么实现才可以,请章博士帮帮忙.谢谢.

Forums:

请教章博士和各位高手 我最近配置一个小的集群,采用LVS/DR方式, tcp的程序都能正常工作,但是udp程序发现一个奇怪的问题,我在real server 上跑了一个udp的server 程序,当udp客户端链接到Load Balance,在转发到后台的real server, real server 回复udp包时,客户端收不到数据包,但采用TCP协议就可以.我的配置例如:

VIP=202.33.66.102(独立的服务器,公网IP地址, 它的内网IP=192.168.1.36)
RIP=192.168.1.123
RIP=192.168.1.145
RIP=192.168.1.156

原来的Server程序Bind的IP为本机IP地址,但收不到UDP包,可以收到TCP包;后来我把Server程序Bind的IP改为VIP,就可以收到UDP和TCP包.现在我想如果Bind本机IP地址而不VIP,能否实现客户端收到包,该怎么实现才可以,请章博士帮帮忙.谢谢.

你的UDP均衡的例子做通了么?!

你已经找到问题的关键所在。

在DR方式下,服务器程序需要bind到VIP地址上,这样响应报文的源地址是VIP,对客户端程序来说这样的响应报文是有效的。

在DR方式下,服务器程序需要bind到RIP地址(服务器自己的IP地址)上,这样响应报文的源地址是RIP,对客户端程序来说这样的响应报文是无效的,因为客户端程序要访问的是VIP。

可以参见wiki上关于UDP服务绑定地址的解释:

你好,我最近使用lvs配置了一个udp协议的负载均衡(算法是轮询rr)。但是出现了一个问题,负载均衡器(LB)只能识别一个真实服务器(RS),具体现象是LB只向一个RS转发数据包,如果把这个RS关闭,LB将不再转发数据包。我之前试用时,都是转发tcp协议,效果是正常的,但是改为我项目要用的udp协议时,就出现了上述问题。请问可能是什么问题,非常感谢。

randomness