Networking
Gcloud負載均衡器後面的UDP伺服器:接收正常,回复失敗
我在 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()
虛擬機只有一個網路介面,本地 IP
10.240.x.x
。如果我將 UDPServer 綁定到此本地 IP,則此伺服器甚至不會收到消息。沒有負載均衡器,一切都正常工作,即消息正確回傳到客戶端。
**問:**我應該怎麼做才能讓我的 UDP 伺服器回复消息?
編輯: 這個討論可能是相關的。
對於我的一個研究生項目,我不得不處理一個類似的問題:負載平衡 DNS。
/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
然後嘗試將 python 應用程序綁定到負載均衡器的公共 IP。
基本上,您的伺服器在其私有 IP 上做出響應,而客戶端期待來自負載均衡器的響應。