tproxy es un simple proxy de enrutamiento TCP (capa 7) construido sobre Geven_t, lo que le permite configurar la lógica de la rutina en Python. & Nbsp; Es muy inspirado desde la máquina de proxy, pero tienen algunas únicas como el modelo de trabajador pre-tenedor prestado a Gunicorn .
Instalación:
tproxy requiere Python 2.x> = 2.5. Está previsto el apoyo 3.x Python.
PIP instalar GEvent
PIP instalar tproxy
Para instalar desde el código fuente:
git git clone: //github.com/benoitc/tproxy.git
tproxy cd
PIP instalar requirements.txt -r
python setup.py install
Pruebe su instalación ejecutando la línea de comandos:
ejemplos tproxy / transparent.py
Y va en http://127.0.0.1:5000, debería ver la página google.
Uso:
tproxy -h
Uso: tproxy [OPCIONES] script_path
Opciones:
& Nbsp; - número de versión Versión show de programa y salir
& Nbsp; -h, --help muestra este mensaje de ayuda y sale
& Nbsp; - log-file = ARCHIVO El archivo de registro para escribir. [-]
& Nbsp; - a nivel de log = NIVEL La granularidad de las salidas de registro. [Info]
& Nbsp; - log-config = del archivo de configuración de registro para su uso. [Ninguno]
& Nbsp; STRING -n, --name = STRING
& Nbsp; Una base de usar con setproctitle para nombrar proceso.
& Nbsp; [Ninguno]
& Nbsp; -D, --daemon daemonize el proceso Gunicorn. [Falso]
Y ARCHIVO ;-p nbsp, --pid = ARCHIVO Un nombre de archivo que se utilizará para el archivo PID. [Ninguno]
& Nbsp; -u USUARIO, --user = USUARIO procesos de trabajo Cambiar a ejecutar como este usuario. [501]
& Nbsp; GRUPO -g, --group = GRUPO
& Nbsp; proceso de trabajo Cambiar a ejecutar como este grupo. [20]
& Nbsp; -m INT, --umask = INT Una máscara de bits para el modo de archivos en archivos escritos por
& Nbsp; Gunicorn. [0]
& Nbsp; DIRECCIÓN -b, --bind = DIRECCIÓN
& Nbsp; La toma de obligar. [127.0.0.1:8000]
& Nbsp; - cartera = INT El número máximo de conexiones pendientes. [2048]
& Nbsp; -w INT, --workers = INT
& Nbsp; El número de proceso de trabajo para el manejo de las solicitudes.
& Nbsp; [1]
& Nbsp; - trabajadores-conexiones = INT
& Nbsp; El número máximo de clientes simultáneos por trabajador.
& Nbsp; [1000]
& Nbsp; -t INT, --timeout = INT
& Nbsp; Los trabajadores en silencio durante más de esta cantidad de segundos son
& Nbsp; muertos y reiniciado. [30]
Señales
QUIT - Cierre normal. Dejar de aceptar conexiones inmediatamente
& Nbsp; y espere hasta que todas las conexiones de cierre
PLAZO - parada rápida. Deje de aceptar y cerrar todas las conexiones
& Nbsp; después de 10s.
INT - Igual que PLAZO
HUP - recarga agraciada. Actualizar todos los trabajadores con el nuevo código
& Nbsp; en el script de enrutamiento.
USR2 - Actualiza tproxy sobre la marcha
Ajus - Aumentar el número de trabajadores a partir del 1
TTOU - Disminuir el número de trabajadores a partir del 1
Exemple de secuencia de comandos de enrutamiento
re importación
re_host = re.compile ("Host:. s * (*) r n")
clase CouchDBRouter (objeto):
& Nbsp; # vistazo a la tabla de enrutamiento y restablecer un nodo couchdb utilizar
& Nbsp; def búsqueda (self, nombre):
& Nbsp; "" "hacer algo" ""
enrutador = CouchDBRouter ()
# Realizar enrutamiento basada en el contenido basado en los datos de la secuencia. Aquí, el
# Información de encabezado de host del protocolo HTTP se analiza para encontrar el
# Nombre de usuario y una rutina de búsqueda se ejecuta en el nombre para encontrar la correcta
# Nodo couchdb. Si ningún partido se puede hacer, sin embargo, no hacer nada con el
# Conexión. (Hacer su propio servidor couchone ...)
Proxy def (datos):
& Nbsp; partidos = re_host.findall (datos)
& Nbsp; si los partidos:
& Nbsp; host = router.lookup (matches.pop ())
& Nbsp; de retorno {"a distancia": host}
& Nbsp; return None
Ejemplo SOCKS4 proxy en 18 líneas
Toma de importación
estructura de importaciones
Proxy def (datos):
& Nbsp; si len (datos) <9:
& Nbsp; de retorno
& Nbsp; de comandos = ord (datos [1])
& nbsp; ip, puerto = socket.inet_ntoa (datos [4: 8]) (datos "> H", [2: 4]), struct.unpack [0]
& Nbsp; idx = data.index (" 0")
& nbsp; userid = datos [8: idx]
& Nbsp; si el comando == 1: #CONNECT
& Nbsp; dict retorno (distancia =:% (ip, puerto "% s% s"),
& Nbsp; respuesta = " 0 X5a 0 0 0 0 0 0",
& Nbsp; = datos de datos [idx:])
& Nbsp; otra cosa:
& Nbsp; de retorno {"cerrar": " 0 X5b 0 0 0 0 0 0"}
Valores de Válido retorno
& Nbsp; {"remota": cadena o tupla} - Cadena es el host: puerto del servidor que se aproxima.
& Nbsp; {"a distancia": String, "datos": String} - Igual que el anterior, pero enviar los datos dados en su lugar.
& Nbsp; {"a distancia": String, "datos" String "respuesta": String} - Igual que el anterior, pero responder con datos dados vuelta al cliente
& Nbsp; Ninguno - No hacer nada.
& Nbsp; {"cerca": true} - Cierra la conexión.
& Nbsp; {"cerrar": String} - Cerrar la conexión después de enviar la cadena.
Manejar errores
Puede fácilmente manejo de errores mediante la adición de una función proxy_error en el script:
proxy_error def (cliente, e):
& Nbsp; pase
. Esta función obtener la instancia ClientConnection (conexión actual) como primera argumentos y la excepción error en segundo argumento
Requisitos
- Python
Comentarios que no se encuentran