Ligando duas conexões TCP recebidas

3

Eu tenho um cliente para conectar vários dispositivos. Por não pagar mensalmente a taxa de IP estático por dispositivo. Nós planejamos mudar a arquitetura. Nesta nova arquitetura, os dispositivos se conectam a um servidor. Em vez de escrever um servidor. Eu estou procurando uma solução intermediária.

Arquitetura atual:

--------------                           ------------
| POLLER APP | ------------------------> | DEVICE 1 |
--------------                           ------------
         |  |
         |  |                            ------------
         |  ---------------------------> | DEVICE 2 |
         |                               ------------
         |
         |                                   ...
         |
         |                               ------------
         ------------------------------> | DEVICE N |
                                         ------------

O aplicativo Poller se conecta sequencialmente a todos os dispositivos com IP estático.

Solução 1:

--------------                           ------------
|   SERVER   | <------------------------ | DEVICE 1 |
--------------                           ------------
         A  A
         |  |
         |  |                            ------------
         |  ---------------------------  | DEVICE 2 |
         |                               ------------
         |
         |                                   ...
         |
         |                               ------------
         ------------------------------  | DEVICE N |
                                         ------------

Nesta solução (que eu não prefiro), devo escrever um aplicativo de servidor para os dispositivos que possuem IPs dinâmicos.

Solução 2 (que eu procurei):

                                         ------------
--------------                           |          |               ------------
| POLLER APP | ------------------------> |     X    | <------------ | DEVICE 1 |
--------------                           |          |               ------------
         |  |                            |          |
         |  |                            |          |               ------------
         |  ---------------------------> |          | <------------ | DEVICE 2 |
         |                               |          |               ------------
         |                               |          |
         |                               ------------
         |                               
         |                               ------------
         ------------------------------> | DEVICE S |
                                         ------------

O X Box funciona como um servidor. Os dispositivos remotos podem se conectar a essa caixa e o aplicativo Poller pode se conectar a esse servidor localmente ou por meio de soquetes de domínio Unix. X Box repete as mensagens que vêm da conexão local para dispositivos remotos.

A minha pergunta é: Existe alguma solução completa ou parcial que me ajude a conseguir isso. Posso ligar diretamente duas conexões de entrada com facilidade?

    
por Fırat KÜÇÜK 22.05.2015 / 08:47

2 respostas

0

Dependendo da frequência com que o pesquisador entra em contato com os dispositivos, pode ser o suficiente para usar o DNS dinâmico . Com o DNS dinâmico, você não precisa de um endereço IP estático, você só precisa de um nome de domínio que você controle com um provedor que suporte DNS dinâmico. Toda vez que um dispositivo (re) se conecta, ele se conecta ao provedor de DNS para declarar seu novo endereço IP. A desvantagem dessa abordagem é que leva alguns minutos para a informação do DNS se propagar, então, cada vez que os endereços IP mudarem, haverá alguns minutos durante os quais seus dispositivos estarão inacessíveis.

Se você deseja ter uma única caixa com um endereço IP estático, o que você está procurando é chamado de NAT (endereço de rede tradução) . A idéia é que quando a caixa X recebe uma conexão TCP de entrada em uma certa porta, ela consulta uma tabela para decidir a qual dispositivo encaminhar a conexão (ou para obter a conexão para si). Isso acontece no nível de pacotes IP e conexões TCP, então você não precisa de nenhum software especial no poller ou no dispositivo, você só precisa configurar o poller para usar o mesmo endereço IP, mas números de porta diferentes para cada dispositivo.

O NAT é suportado por praticamente qualquer dispositivo de dispositivo. Por exemplo, é o que os roteadores domésticos fazem para que você possa conectar vários dispositivos (computadores, telefones, etc.) à Internet, mesmo que seu provedor de serviços de Internet forneça apenas um único endereço IP. Nesse caso, o dispositivo executa NAT de origem (SNAT): o roteador modifica a origem da conexão TCP para ser ela mesma em vez do computador (e, inversamente, o destino dos pacotes na outra direção é modificado). No seu caso, você deseja o destino NAT (DNAT), que modifica o destino dos pacotes na direção cliente → servidor e a origem dos pacotes no servidor → direção do cliente. Se os dispositivos precisarem abrir conexões com outras máquinas na Internet, você poderá fazer com que a caixa X faça tanto DNAT quanto SNAT.

No Linux, você pode usar iptables para configurar o NAT. Veja o howfil do netfilter ou qualquer um dos muitos tutoriais de NAT do Linux na web.

    
por 23.05.2015 / 02:33
0

Eu escrevi um pequeno script Python para isso. Talvez haja um caminho mais curto para conseguir isso, mas não consegui encontrar. Meu script cria um servidor externo que escuta 1560 para conexões de dispositivos. Para cada conexão de dispositivo, cria um novo servidor interno. Depois disto. Transfere mensagens entre conexões internas e externas correspondentes.

                  B I N D E R
                 -------------
                 | INT |  E  |                 ------------
-------> (60000) | SRV |  X  | (1560) <------- | DEVICE 1 |
                 |     |  T  |                 ------------
                 |-----|  E  |
                 | INT |  R  |                 ------------
-------> (60001) | SRV |  N  | (1560) <------- | DEVICE 2 |
                 |     |  A  |                 ------------
                 |-----|  L  |
                 | INT |     |                 ------------
-------> (60002) | SRV |  S  | (1560) <------- | DEVICE 3 |
                 |     |  E  |                 ------------
                 |-----|  R  |
                 | INT |  V  |                 ------------
-------> (60003) | SRV |  E  | (1560) <------- | DEVICE 4 |
                 |     |  R  |                 ------------
                 -------------

O script precisa de python-twisted de dependência. Eu criei um repositório do github para isso: github.com/codvio/binder

    
por 23.05.2015 / 10:13

Tags