tproxy è una semplice delega di routing TCP (livello 7) costruito su Geven_t, che consente di configurare la logica di routine in Python. & Nbsp; E 'fortemente ispirato dalla macchina procura ma avere un po' unico come il lavoratore modello pre-forcella preso in prestito per Gunicorn .
Instalation:
tproxy richiede Python 2.x> = 2.5. È previsto il supporto Python 3.x..
pip installare gevent
pip installare tproxy
Per installare da fonte:
git clone git: //github.com/benoitc/tproxy.git
cd tproxy
Pip installare requirements.txt -r
python setup.py install
Metti alla prova la tua installazione eseguendo la riga di comando:
Esempi tproxy / transparent.py
E va in http://127.0.0.1:5000, si dovrebbe vedere la home page di Google.
Utilizzo:
tproxy -h
Utilizzo: tproxy [opzioni] script_path
Opzioni:
& Nbsp; - il numero di versione di versione esposizione del programma ed esce
& Nbsp; -h, --help mostra questo messaggio di aiuto ed esce
& Nbsp; - log-file = FILE Il file di registro di scrivere. [-]
& Nbsp; - a livello di log = LIVELLO La granularità delle uscite di registro. [Info]
& Nbsp; - log-config = FILE Il file di registro di configurazione da utilizzare. [Nessuno]
& Nbsp; STRING -n, --name = string
& Nbsp; Una base da usare con setproctitle per il processo di denominazione.
& Nbsp; [Nessuno]
& Nbsp ;-D, --daemon demonizzare il processo Gunicorn. [Falso]
& Nbsp FILE ;-p, --pid = FILE A nome del file da usare per il file PID. [Nessuno]
& Nbsp; -u USER, processi di switch di lavoro --user = UTENTE per l'esecuzione come questo utente. [501]
& Nbsp; GROUP -g, --group = GRUPPO
& Nbsp; del processo di lavoro Passa per l'esecuzione come questo gruppo. [20]
& Nbsp; -m INT, --umask = INT Una maschera di bit per la modalità di file sul file scritti da
& Nbsp; Gunicorn. [0]
& Nbsp; INDIRIZZO -b, --bind = INDIRIZZO
& Nbsp; La presa di legare. [127.0.0.1:8000]
& Nbsp; - backlog = INT Il numero massimo di connessioni in sospeso. [2048]
& Nbsp; -w INT, --workers = INT
& Nbsp; Il numero di processo di lavoro per la gestione delle richieste.
& Nbsp; [1]
& Nbsp; - operai connessioni = INT
& Nbsp; Il numero massimo di connessioni simultanee per lavoratore.
& Nbsp; [1000]
& Nbsp; -t INT, --timeout = INT
& Nbsp; I lavoratori in silenzio per più di questo numero di secondi sono
& Nbsp; ucciso e riavviato. [30]
Segnali
ESCI - Arresto regolare. Smettere di accettare connessioni immediatamente
& Nbsp; e attendere che tutte le connessioni vicino
TERM - spegnimento rapido. Smettere di accettare e chiudere tutti conections
& Nbsp; dopo 10s.
INT - Idem come TERM
HUP - ricarico Grazioso. Ricarica tutti i lavoratori con il nuovo codice
& Nbsp; nello script di routing.
USR2 - Aggiornamento tproxy al volo
Z IO NI - Aumentare il numero di lavoratori da 1
TTOU - Diminuire il numero di lavoratori da 1
Esempio di script di routing
re di importazione
re_host = re.compile ("Host:. s * (*) r n")
Classe CouchDBRouter (oggetto):
& Nbsp; # un'occhiata alla tabella di routing e restituisce un nodo couchdb da usare
& Nbsp; def lookup (self, name):
& Nbsp; "" "fare qualcosa" ""
router = CouchDBRouter ()
# Eseguire content-aware routing basata sui dati di flusso. Qui, la
# Informazioni di intestazione host dal protocollo HTTP viene analizzato per trovare il
# Username e una routine di ricerca viene eseguito sul nome per trovare il giusto
# Nodo couchdb. Se nessuna corrispondenza può essere ancora fatto, non fare nulla con la
Connessione #. (Rendere il proprio server couchone ...)
Proxy def (dati):
& Nbsp; fiammiferi = re_host.findall (dati)
& Nbsp; se le partite:
& Nbsp; host = router.lookup (matches.pop ())
& Nbsp; ritorno {"a distanza": host}
& Nbsp; restituire None
Esempio SOCKS4 Proxy in 18 Righe
Presa importazione
import struct
Proxy def (dati):
& Nbsp; se len (dati) <9:
& Nbsp; ritorno
& Nbsp; comando = ord (dati [1])
& nbsp; IP, porta = socket.inet_ntoa (dati [4: 8]), struct.unpack ("> H", i dati [2: 4]) [0]
& Nbsp; IDX = data.index (" 0")
& nbsp; userid = dati [8: idx]
& Nbsp; se il comando == 1: #connect
& Nbsp; dict ritorno (a distanza = "% s:% s"% (ip, porto),
& Nbsp; risposta = " 0 X5a 0 0 0 0 0 0",
& Nbsp; data = dati [idx:])
& Nbsp; il resto:
& Nbsp; ritorno {"close": " 0 X5b 0 0 0 0 0 0"}
I valori di ritorno valido
& Nbsp; {"a distanza": stringa o tuple} - String è l'host: porta del server che verrà inoltrata.
& Nbsp; {"a distanza": String, "dati": String} - Come sopra, ma inviare i dati forniti invece.
& Nbsp; {"a distanza": String, "dati": String, "risposta": String} - Come sopra, ma rispondere con dati forniti al client
& Nbsp; Nessuno - Non fare nulla.
& Nbsp; {"vicino": True} - Chiudere la connessione.
& Nbsp; {"vicino": String} - Chiudere la connessione dopo l'invio del String.
gestire gli errori
Si può facilmente la gestione degli errori con l'aggiunta di una funzione proxy_error nello script:
def proxy_error (client, e):
& Nbsp; passaggio
. Questa funzione ottiene l'istanza ClientConnection (connessione corrente) come primi argomenti e l'eccezione di errore nel secondo argomento
Requisiti
- Python
I commenti non trovato