linux - con - ncat
Usar netcat(nc) como servidor proxy HTTP y monitor (5)
¿Es posible utilizar el programa Unix netcat (nc) 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.
Claro, puede usarlo o un par de faucet|hose
, pero ¿por qué hacer eso cuando puede tener una instancia mínima de Apache hacer exactamente lo mismo y proporcionar un conjunto más completo de análisis de características?
No netcat por sí solo, ya que tendría que interpretar la solicitud HTTP y transmitirla. Por ejemplo, una solicitud HTTP a través de un proxy comienza con:
OBTENER http://www.example.org/ HTTP / 1.1
que tu proxy luego tiene que ir, ''bien, tengo que conectarme a example.org y GET /''.
Ahora esto podría hacerse canalizando la salida nc en una secuencia de comandos 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.
Sí, debería ser posible.
Cuando pregunté por escribir un servidor web en la primera ronda de 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 quieres un servidor proxy adecuado, como dice @Spacedman, necesitarías interpretar la línea de solicitud, pero eso es bastante fácil: lee la primera línea, aplica cut -d '' '' -f 2
para obtener la URL, algo de sed Operadores de cadenas de shell para extraer 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.
Sería complicado configurarlo, así que funcionó correctamente. Una mejor solución sería usar un proxy adecuado (por ejemplo, calamar) o simplemente oler el tráfico (wireshark, pastmon).
Solo tuve 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
Esto escucha en el puerto 80 y redirecciona en el puerto 8080. El tráfico entrante estará presente en el archivo in
, el tráfico saliente en el out.html
out.html. El conducto nombrado es necesario para que la conexión sea bidireccional.