Criptografando aplicativo peer-to-peer com iptables e stunnel

2

Estou executando aplicativos legados nos quais não tenho acesso ao código-fonte. Esses componentes conversam entre si usando texto simples em uma porta específica. Eu gostaria de ser capaz de proteger as comunicações entre os dois ou mais nós usando algo como stunnel para facilitar a comunicação peer-to-peer ao invés de usar um pacote VPN mais tradicional (e centralizado) como o OpenVPN, etc.

Idealmente, o fluxo de tráfego seria assim:

  1. app @ hostA: 1234 tenta abrir uma conexão TCP para app @ hostB: 1234.
  2. O iptables captura e redireciona o tráfego na porta 1234 para stunnel em execução no hostA na porta 5678.
  3. stunnel @ hostA negocia e estabelece uma conexão com stunnel @ hostB: 4567.
  4. stunnel @ hostB encaminha qualquer tráfego descriptografado para app @ hostB: 1234.

Essencialmente, estou tentando configurar para onde qualquer tráfego de saída (gerado na máquina local) redireciona a porta N através do stunnel para a porta N + 1, e o lado de recebimento recebe na porta N + 1, descriptografa e encaminha para a aplicação local no porto N.

Não estou particularmente preocupado em perder a identidade do endereço IP / máquina do hostA quando stunnel @ hostB encaminha para app @ hostB porque a carga útil de comunicações contém informações de identificação.

O outro truque é que normalmente com stunnel você tem uma arquitetura cliente / servidor. Mas esta aplicação é muito mais P2P, porque os nós podem entrar e sair dinamicamente e codificar um tipo de "connection = hostN: port" na configuração do stunnel não funcionará.

EDIT: Uma outra possibilidade pode estar configurando algum tipo de rota padrão de forma que o tráfego de saída para a porta N seja encaminhado através do stunnel configurado como um gateway ...

    
por Jonathan Oliver 25.06.2013 / 00:07

1 resposta

1

Acho que o iptables parece um pouco supérfluo aqui.

appA é uma instância do aplicativo no hostA (IP externo A.A.A.A) appB é uma instância do aplicativo no hostB (IP externo B.B.B.B)

  1. appA ouve 127.0.0.1:1234 no hostA
  2. stunnel no hostA configurado para encaminhar a conexão criptografada de A.A.A.A: 1234 para 127.0.0.1:1234

    [appA]

    aceitar = A.A.A: 1234

    connect = 127.0.0.1:1234

    client = no

  3. stunnel no hostB configurado para criar encapsulamento criptografado e encaminhar conexão de 127.0.0.1:4321 para A.A.A.A: 1234

    / usr / bin / stunnel-d 127.0.0.1:4321 -r A.A.A: 1234

  4. o appB estabelece uma conexão com 127.0.0.1:4321

e vice-versa para hostB

    
por 25.06.2013 / 08:51