我在 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()
Run Code Online (Sandbox Code Playgroud)
虚拟机只有一个网络接口,具有本地IP 10.240.x.x
。如果我将 UDPServer 绑定到该本地 IP,则该服务器甚至不会接收消息。
如果没有负载均衡器,一切都会正常工作,即消息会正确回显给客户端。
问题:我应该怎样做才能让我的 UDP 服务器回复消息?
编辑: 这个讨论可能是相关的。
networking load-balancing udp google-cloud-platform google-cloud-network-load-balancer