我在 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。
/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
然后尝试将 python 应用程序绑定到负载均衡器的公共 IP。
基本上,您的服务器正在其私有 IP 上响应,并且客户端正在等待来自负载均衡器的响应。