我在Google网络负载均衡器后面设置了一个UDP服务器(在VM上)。服务器绑定到0.0.0.0。UDP服务器可以接收发送给平衡器的消息,但回复不会返回到客户端。没有报告错误,而且tcpdump没有显示出任何异常。我已经确保所有防火墙规则都允许这个流量,负载均衡器被设置为转发所有端口。
我绝不是网络专家,但我怀疑UDP服务器出了什么问题,因为接收消息的地址与用于回复(sendto())的地址不同。
我正在使用标准库中的Python的socketserver模块作为回显服务器来测试所有这些:
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服务器回复消息?
编辑:这一讨论可能是相关的。
发布于 2016-04-07 04:20:31
对于我的一个毕业项目,我不得不处理一个类似的问题:负载平衡DNS。
/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1然后尝试将python应用程序绑定到负载均衡器的公共IP。
基本上,您的服务器是在其私有IP上响应,而客户端正在期待负载均衡器的响应。
https://serverfault.com/questions/768681
复制相似问题