Eu tenho um servidor UDP configurado (em uma VM) por trás do balanceador de carga da rede do Google Cloud. O servidor está vinculado a 0.0.0.0
. O servidor UDP pode receber mensagens que foram enviadas ao balanceador, mas as respostas não retornam ao cliente. Não há erros relatados, e tcpdump
não está mostrando nada incomum. Certifiquei-me de que todas as regras de firewall permitem esse tráfego, e o balanceador de carga está configurado para encaminhar todas as portas.
Eu não sou de modo algum um especialista em rede, mas suspeito de que algo está errado com o servidor UDP em que o endereço no qual a mensagem é recebida é diferente do que está sendo usado para o resposta ( sendto()
).
Estou testando tudo isso usando o módulo socketserver
do Python na biblioteca padrão como um servidor de eco :
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()
A VM tem apenas uma interface de rede, com o IP local 10.240.x.x
. Se eu ligar o UDPServer a este IP local, então as mensagens nem serão recebidas por este servidor.
Sem o balanceador de carga, tudo está funcionando normalmente, ou seja, as mensagens são retornadas corretamente para o cliente.
Pergunta: O que devo fazer para permitir que meu servidor UDP responda a mensagens?
EDITAR: esta discussão pode ser relevante.