Como reverter os pacotes TCP brutos do proxy

3

Estou projetando um sistema em que dispositivos remotos enviam seguramente atualizações de status para um servidor de registro central para agregação. No servidor, estou usando a solução Redis + Logstash + Elasticsearch. Os dados enviados para o servidor são confidenciais e devem ser criptografados. Eu estou lutando para encontrar um meio eficiente e seguro para 'LPUSH' os logs para a lista Redis.

Os dispositivos atualmente são capazes de enviar o seguinte comando Redis diretamente para a porta 6379.

"*3\r\n$5\r\nLPUSH\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"

A chave correta e a entrada da lista são criadas dentro do Redis no servidor.

O próximo passo é colocar os redis atrás de um firewall e criptografar os pacotes. Minha tentativa atual foi usar o Apache como um proxy reverso. Um dispositivo faria uma conexão SSL bidirecional com o Apache e, em seguida, inverteria as informações descriptografadas para a porta 6379 usando a interface de loopback. A conexão SSL de 2 vias é feita sem problemas e uma mensagem é encaminhada para o Redis. Infelizmente não é a mensagem que o dispositivo enviou. tcpdump me diz o seguinte ...

tcpdump -nnXvv -i lo host localhost and port 6379

127.0.0.1.48916 > 127.0.0.1.6379: Flags [P.], cksum 0xfeab (incorrect -> 0x9415),
seq 1:132, ack 1, win 1025, options [nop,nop,TS val 299310518 ecr 299310518], 
length 131
0x0000:  4500 00b7 12b7 4000 4006 2988 7f00 0001  E.....@.@.).....
0x0010:  7f00 0001 bf14 18eb ce9c 0f04 e920 abec  ................
0x0020:  8018 0401 feab 0000 xxxx xxxx xxxx xxxx  ................
0x0030:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  ....*3./.HTTP/1.
0x0040:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  1..Host:.localho
0x0050:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  st:6379..X-Forwa
0x0060:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  rded-For:.xx.xxx
0x0070:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  .xxx.xxx..X-Forw
0x0080:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  arded-Server:.xx
0x0090:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  .xxx.xxx.xx..Con
0x00a0:  xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx  nection:.Keep-Al
0x00b0:  xxxx xxxx xxxx xx                        ive....

Como pode ser visto na tradução ASCII, o Apache está truncando a mensagem no primeiro CRLF após * 3 e anexando informações de cabeçalho HTTP para encaminhamento, como é suposto. Claro Redis está respondendo com um erro como a mensagem não está mais formatada usando o protocolo Redis Serialization Protocol (RESP).

1) Existe uma maneira de configurar o Apache para encaminhar cegamente os pacotes TCP brutos?

2) Se não, existe uma solução padrão de código aberto para este problema?

Obrigado pelo seu tempo!

    
por Nathan Crock 20.02.2014 / 19:12

2 respostas

1

Enquanto minha intuição me diz que o Apache + PHP não é uma solução ideal, foi uma solução rápida e até agora satisfatória. O Apache envia a mensagem HTTP para o script PHP no qual a postagem é extraída e encaminhada para os redis usando a interface de loopback. Para 'posteridade' eu colei uma versão esquelética do script aqui.

<?php
    $file = fopen("/some/logging.txt","a");
    $entityBody = file_get_contents('php://input');
    $redisSocket = fsockopen("localhost", 6379, $errno, $errstr, 30);
    if (!$redisSocket) {
        fwrite($file, "Error: $errstr ($errno)\n");
    } else {
        fwrite($redisSocket, "$entityBody");
        $redisResponse = fgets($redisSocket);
        if (!$redisResponse) {
            fwrite($file, "No response from Redis");
        } else {
            fwrite($file, "Redis Response: $redisResponse");
        }
    }
?>

Eu tento evitar "colar" as coisas junto com os scripts sempre que possível, mas até agora isso forneceu os benefícios adicionais de me permitir verificar a integridade dos dados de entrada e criar registros e respostas personalizados.

    
por 24.02.2014 / 19:18
1

Se tudo estiver funcionando, exceto os anexos do Apache nos cabeçalhos, você poderá desativá-los via mod_headers: link

    
por 20.02.2014 / 20:30