Come invertire i pacchetti TCP Raw di Proxy

Sto progettando un sistema in cui i dispositivi remoti trasmettano in modo sicuro aggiornamenti di stato a un server di logging centrale per l'aggregazione. Sul server sto usando la soluzione Redis + Logstash + Elasticsearch. I dati inviati al server sono sensibili e devono essere crittografati. Sto lottando per trovare un mezzo efficace e sicuro per "LPUSH" i registri all'elenco Redis.

Attualmente i dispositivi sono in grado di submit direttamente il seguente command Redis alla port 6379.

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

La voce corretta e la voce di elenco vengono creati all'interno di Redis sul server.

Il passo successivo è quello di mettere redis dietro un firewall e crittografare i pacchetti. Il mio tentativo attuale era quello di utilizzare Apache come proxy inverso. Un dispositivo creerebbe una connessione SSL a due vie a Apache e quindi invertire il proxy le informazioni decrittate alla port 6379 utilizzando l'interface di loopback. La connessione SSL a due vie viene fatta senza problemi e un messaggio viene inoltrato a Redis. Purtroppo non è il messaggio inviato dal dispositivo. tcpdump mi dice il seguente …

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.... 

Come si può vedere nella traduzione ASCII, Apache tronca il messaggio al primo CRLF dopo * 3 e aggiunge le informazioni di intestazione HTTP per l'inoltro, come si suppone. Naturalmente Redis risponde con un errore in quanto il messaggio non è più formattato utilizzando il Redis Serialization Protocol (RESP).

1) C'è un modo per configurare Apache per trasmettere ciecamente i pacchetti TCP crudi?

2) In caso negativo, esiste una soluzione open source standard per questo problema?

Grazie per il tuo tempo!

2 Solutions collect form web for “Come invertire i pacchetti TCP Raw di Proxy”

Se tutto funziona, tranne le appendici da Apache alle intestazioni, allora potresti distriggersrle via mod_headers: http://httpd.apache.org/docs/2.2/mod/mod_headers.html

Mentre la mia intuizione mi dice che Apache + PHP non è una soluzione ottimale, è stato un process veloce e finora soddisfacente. Apache invia il messaggio HTTP allo script PHP in cui il post viene estratto e inoltrato a redis utilizzando l'interface di loopback. Per 'posterità' ho incollato una versione scheletrica dello script qui.

 <?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"); } } ?> 

Cerco di evitare di "incollare" le cose insieme agli script ovunque ansible, ma finora ha fornito i vantaggi aggiuntivi di consentirmi di controllare i dati di input per l'integrità e di creare registri e risposte personalizzate.

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.