我在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,那么这个服务器甚至不会收到消息。
没有负载均衡器,一切正常,即消息正确回显到客户端。
问题:我应该怎么做才能允许我的UDP服务器回复消息?
编辑: 这个讨论可能是相关的。
我必须为我的一个项目负责处理类似的问题:负载均衡DNS。
/etc/sysctl.conf中
net.ipv4.ip_nonlocal_bind = 1
然后尝试将python应用程序绑定到负载平衡器的公共IP。
基本上,您的服务器正在对其私有IP进行响应,并且客户端期望来自负载平衡器的响应。