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サーバーがメッセージに応答できるようにするにはどうすればよいですか?
編集:この議論 関連があるかもしれません。
大学院のプロジェクトの1つであるDNSの負荷分散についても同様の問題に対処する必要がありました。
/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
次に、pythonアプリケーションをロードバランサーのパブリックIPにバインドしてみます。
基本的に、サーバーはプライベートIPで応答しており、クライアントはロードバランサーからの応答を期待しています。