web-dev-qa-db-ja.com

Gcloudロードバランサーの背後にあるUDPサーバー:受信OK、返信失敗

Google Cloudネットワークロードバランサーの背後に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_のネットワークインターフェイスが1つしかありません。UDPServerをこのローカルIPにバインドすると、このサーバーはメッセージを受信しません。

ロードバランサーがないと、すべてが正常に機能します。つまり、メッセージはクライアントに正しくエコーされます。

質問:UDPサーバーがメッセージに応答できるようにするにはどうすればよいですか?

編集:この議論 関連があるかもしれません。

2
Caleb Hattingh

大学院のプロジェクトの1つである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で応答しており、クライアントはロードバランサーからの応答を期待しています。

3
Daniel Widrick