Networking

Gcloud負載均衡器後面的UDP伺服器:接收正常,回复失敗

  • February 1, 2019

我在 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。

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/s1-initial-setup-forwarding-VSA.html

/etc/sysctl.conf

net.ipv4.ip_nonlocal_bind = 1

然後嘗試將 python 應用程序綁定到負載均衡器的公共 IP。

基本上,您的伺服器在其私有 IP 上做出響應,而客戶端期待來自負載均衡器的響應。

引用自:https://serverfault.com/questions/768681