Gcloud 负载均衡器后面的 UDP 服务器:接收正常,回复失败

Gcloud 负载均衡器后面的 UDP 服务器:接收正常,回复失败

我在 Google Cloud 网络负载均衡器后面设置了一个 UDP 服务器(在虚拟机上)。该服务器绑定到0.0.0.0。UDP 服务器可以收到发送到平衡器的消息,但回复未返回到客户端。没有报告任何错误,也tcpdump没有显示任何异常。我已确保所有防火墙规则都允许此流量,并且负载平衡器已设置为转发所有端口。

我绝不是一个网络专家,但我怀疑UDP 服务器出现问题,接收消息的地址与用于回复的地址不同(sendto())。

socketserver我正在使用 Python标准库中的模块作为测试所有这些回显服务器

import SocketServer

class MyUDPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print "{} wrote:".format(self.client_address[0])
        print data
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":
    HOST, PORT = "0.0.0.0", 5029
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()

VM 只有一个网络接口,具有本地 IP 10.240.x.x。如果我将 UDPServer 绑定到此本地 IP,则该服务器甚至不会接收消息。

没有负载均衡器,一切都正常工作,即消息正确地回传回客户端。

问题:我应该怎么做才能允许我的 UDP 服务器回复消息?

编辑: 这次讨论可能相关。

答案1

我的一个研究生项目也曾遇到过类似的问题:负载平衡 DNS。

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/s1-initial-setup-forwarding-VSA.html

/etc/sysctl.conf

 net.ipv4.ip_nonlocal_bind = 1

然后尝试将 python 应用程序绑定到负载均衡器的公共 IP。

基本上,您的服务器正在其私有 IP 上响应,并且客户端正在等待来自负载均衡器的响应。

相关内容