GCloud负载均衡器后面的UDP服务器:收到ok,回复失败

我在Google Cloudnetworking负载平衡器后面(在虚拟机上)设置了一个UDP服务器。 服务器绑定到0.0.0.0 。 UDP服务器可以接收发送给平衡器的消息,但回复不会返回给客户端。 没有错误报告, tcpdump没有显示任何exception。 我确定所有的防火墙规则都允许这个stream量,并且负载平衡器被设置为转发所有的端口。

我不是一个networking专家,但我怀疑 UDP服务器出了问题,因为收到消息的地址与用于回复( sendto() )的地址不同。

我在标准库中使用Python的socketserver模块作为echo服务器来testing所有这些:

 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() 

虚拟机只有一个networking接口,本地IP为10.240.xx 如果我将UDPServer绑定到这个本地IP,那么这个服务器甚至不会收到消息。

没有负载均衡器,一切正常,即消息正确回显到客户端。

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

编辑: 这个讨论可能是相关的。

我必须为我的一个项目负责处理类似的问题:负载均衡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进行响应,并且客户端期望来自负载平衡器的响应。