![LVS 中的单包调度及出包源地址](https://linux22.com/image/801770/LVS%20%E4%B8%AD%E7%9A%84%E5%8D%95%E5%8C%85%E8%B0%83%E5%BA%A6%E5%8F%8A%E5%87%BA%E5%8C%85%E6%BA%90%E5%9C%B0%E5%9D%80.png)
我在 NAT 模式下使用 LVS (ipvsadm) 来为多个“realserver”负载平衡 UDP 流量。我使用单数据包调度,以便将来自客户端上单个源端口的流量分发到不同的 realserver。
然而,我看到的是,源自真实服务器并发送回客户端的 UDP 数据报将其源 IP / 端口设置为真实服务器的 IP / 端口,这让客户端感到困惑,因为它希望收到源 IP / 端口与他发送原始数据报的 IP / 端口匹配的回复。
这确实非常奇怪,因为 LVS 应该将真实服务器“隐藏”在虚拟 IP / 端口后面。
看来,如果我关闭单包调度,传出数据报的源 ip / 端口是由 LVS 正确重写。
有人遇到过这种情况吗?如果是这样,该如何解决?
答案1
如果你仍然感兴趣:
我认为单包调度不期望它刚刚调度的包有响应,因此不存储连接信息。然后当响应返回时,LVS 无法找到它的连接,因此不知道要使用哪个源 IP/端口。
这似乎是设计使然。在这里搜索“OPS 是为没有原始数据包回复的设置而实现的”,你会看到一些解释。
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.UDP.html
解决方案是为 UDP 连接设置持久超时(如果您希望快速响应,可以将其设置得较低),从而明确设置连接时间。既然您可以这样做,OPS 就没有必要记住连接。