Comunicando-se entre dois servidores sentados atrás de seus respectivos NATs

1

Estou criando um aplicativo da web (Servidor A) que se comunica com um servidor remoto (Servidor B) conectado à Internet.

O servidor B fica atrás de um NAT e está ouvindo a comunicação em três portas não padrão.

Em um cenário típico, para implantar vários servidores remotos em diferentes redes e fazer com que ele se comunique com o aplicativo Web pai (Servidor A), cada um desses servidores precisa ter os roteadores configurados manualmente para encaminhar os respectivos servidores. portas para um ip estático no qual o Servidor B está configurado.

Estou procurando uma maneira de resolver esse problema de ter que configurar cada roteador individualmente e manualmente para cada implantação. O encaminhamento de porta deve ser feito porque o Servidor A precisa se comunicar com o Servidor B e precisa iniciar a conversa.

Estou perguntando se existe uma maneira de o Servidor B iniciar a comunicação, e não o contrário, para que o encaminhamento de porta não precise ocorrer.

O servidor B só precisaria chamar de casa, abrir o que sempre sockets / portas necessariamente (é aqui que eu preciso da sua ajuda para obter informações) e toda a comunicação seria feita através dessas portas abertas sem que o Server A precisasse saber o ip do Servidor B, e ter que falar com o roteador para lidar com o encaminhamento.

Este cenário é possível?

Editar: Adicionou mais alguns detalhes:

Basicamente eu criei um webapp (Servidor A) que fala com vários servidores de impressão 3D que tem uma API REST exposta. Os servidores de API do servidor de impressão estão todos escutando em uma porta não padrão de 8721.

Agora, manualmente no meu webapp eu estou configurando manualmente para apontar para cada servidor de impressão através do seu endereço IP externo e porta encaminhada pela porta. Como você provavelmente pode dizer, isso criará um monte de problemas, já que a maioria desses endereços IP externos vai mudar devido à maioria das redes domésticas / consumidoras que não possuem um IP estático.

Isso significa que tenho que descobrir toda vez que o endereço IP é alterado e modificar manualmente meus registros na minha webapp.

Eu imagino (e suponho) que uma das melhores maneiras de resolver isso é não deixar o webapp se preocupar com onde cada um desses servidores de impressão está localizado, mas deixar que os próprios servidores de impressão digam ao servidor onde eles estão.

Estou tentando resolver 2 problemas:

  1. Os endereços IP externos são dinâmicos e não estáticos (como mencionado acima)
  2. Encaminhamento de porta / firewall imposto pelas redes domésticas. No caso de haver vários servidores de impressão em uma rede doméstica, isso significa que, para alcançar cada servidor individualmente, o roteador doméstico precisa saber como rotear cada porta exclusiva que precisa ser configurada no aplicativo Web e no roteador doméstico. lado do servidor de impressão correto (já que todos eles estão ouvindo em 8721).

Desculpe pelo longo post. Eu ainda sou relativamente novo em toda parte de programação de socket e espero que alguém seja capaz de me indicar onde eu deveria procurar mais informações sobre como fazer o que foi dito acima.     

por David C 16.04.2014 / 03:55

2 respostas

1

Sim, isso é possível. Isso pode ser automatizado facilmente com Encaminhamento de porta UPnP, se habilitado no host / dispositivo NAT, se a segurança não for considerada. Se você não quiser usar o UPnP, por exemplo, porque a segurança é uma consideração, você pode conseguir isso usando outra API para acessar seus dispositivos NAT. O UPnP é muito comum em roteadores domésticos.

Você pode querer usar outro servidor para comunicar os endereços IP e os números de porta do Servidor A e Servidor B em um endereço IP estático ou FQDN que esteja diretamente acessível em uma porta estática. Isso pode ser feito armazenando os dados em um arquivo de texto, por exemplo.

Como disse @Evan, sem detalhes sobre o que você está realmente tentando alcançar, isso é tudo que posso dizer.

    
por 16.04.2014 / 05:43
1

Assumindo que você controla o código do servidor de impressão, então, com certeza, você pode fazer com que o servidor de impressão se conecte aos seus servidores, evitando a necessidade de se preocupar com o NAT nas redes remotas. Isto é, por exemplo, como "GoToMyPC" e "LogMeIn" funcionam - fazendo conexões persistentes de saída através do firewall para servidores.

Existem protocolos que permitem a você "passar" pelo NAT, mas, francamente, a menos que ambos os endpoints estejam atrás de NAT que você não pode controlar, eu diria que esses protocolos (STUN, etc) ) são muito trabalhosos para um retorno muito pequeno.

Você vai querer pensar sobre como seus servidores de impressão localizam o servidor central. É tentador usar apenas nomes DNS, mas você deve pensar em alterações que você possa fazer posteriormente em sua infraestrutura de servidores (em escala, por exemplo). Eu apontaria você para registros SRV como um mecanismo para os servidores de impressão localizarem seu servidor central. O registro SRV já possui abstração integrada para alta disponibilidade e ponderação prioritária.

    
por 16.04.2014 / 08:07