2010-10-29 23 views
14

¿Es posible utilizar el programa netcat (nc) de Unix para crear un servidor y monitor proxy TCP? Me gustaría que todo el tráfico TCP pasara a través de la tubería, y que se enviara a stdout para su monitoreo. Tenga en cuenta que esto se utilizará para controlar el tráfico HTTP entre un dispositivo de hardware y un servidor HTTP.Uso de netcat (nc) como servidor proxy HTTP y monitor

Respuesta

0

Claro, usted puede usarlo o un par faucet|hose, pero ¿por qué hacer eso cuando se puede tener una instancia de un mínimo de Apache hacer exactamente lo mismo y proporcionar un conjunto más completo de funciones de análisis?

2

No netcat en sí mismo, ya que tendría que interpretar la solicitud HTTP y transmitirla. Por ejemplo, una solicitud HTTP a través de un proxy comienza con:

GET http://www.example.org/ HTTP/1.1

la que el proxy entonces tiene que ir, 'está bien, tengo que conectar a example.org y GET /'.

Ahora esto podría hacerse simplemente canalizando la salida nc en un script que analiza el HTTP req y luego llama a 'wget' para obtener la página, luego sorpréndelo a través de netcat ... oh diablos, ¿por qué?

Apache, o calamar, probablemente pueda hacer el trabajo.

+0

Gracias, el proxy HTTP fue engañoso, porque eso es más de lo que necesito. Solo quiero establecer estáticamente un conducto que envíe todo el tráfico TCP de un puerto a otro host y puerto, y que proporcione monitoreo. –

+0

bien, tal vez nc -l -p 9999 localhost | logging_processor | nc -p 9998 localhost: solo asegúrese de que su programa logging_processor lo pase todo. – Spacedman

0

Sí, debería ser posible.

Cuando pregunté sobre escribir un servidor web en bash 1 en un grupo de noticias, terminé con dos buenas ideas. Uno era usar xinetd como el servidor real, y hacer que ejecutara un script de shell para cada conexión; en su caso, el script podría usar tee y nc para reenviar y registrar la conexión (creo que con algún truco de descriptor de archivo para obtener un tee en cada transmisión). La otra era usar socat, que efectivamente le permite escribir un servidor completamente operativo, con sockets de escucha y subprocesos de manejador, en bash; de nuevo, desearía que tee y netcat hicieran el registro y el proxy.

Si desea un servidor proxy adecuado, como dice @Spacedman, necesitaría interpretar la línea de solicitud, pero eso es bastante fácil: lea la primera línea, aplique cut -d ' ' -f 2 para obtener la URL, alguna cadena sed o shell operadores para sacar el dominio y el puerto, y continuar. Sin embargo, si sabes de antemano que todo el tráfico va a un punto final, puedes conectarlo.

0

Sería difícil de configurar, por lo que funcionó correctamente. Una solución mejor sería usar un proxy adecuado (por ejemplo, calamar) o simplemente oler el tráfico (wireshark, pastmon).

14

Acabo de tener la necesidad ayer. Puede encontrar la respuesta aquí (francés): http://www.linux-france.org/~mdecore/linux/doc/memo2/node168.html

mknod backpipe p 
nc -l -p 80 < backpipe | tee -a in | nc localhost 8080 | tee -a out.html > backpipe 

Esta escucha en el puerto 80 y redirigir en el puerto 8080. El tráfico entrante estará presente en el archivo in, el tráfico de salida en la canalización con nombre out.html es file.The necesario para que la conexión sea bidireccional.

+0

nc no le permite especificar -l y -p al mismo tiempo. – ScaryAardvark

+1

Correcto, por lo que está obligado a dar un nombre de host para especificar un puerto para la primera nc.Acabo de probar con el comando 'nc -l localhost 8080 backpipe' y luego abrir una pestaña en http: // localhost: 8080/funcionó bien, excepto que el host virtual que maneja parte de stackexchange se confundió y no sabía qué hacer. – hlovdal