7

Esiste una libreria python che implementa uno stack TCP standalone?Implementazione stack TCP Python

Non riesco a utilizzare la solita libreria di socket python perché sto ricevendo un flusso di pacchetti su un socket (mi vengono sottoposti a tunnel su questo socket). Quando ricevo un pacchetto TCP SYN indirizzato a una particolare porta, mi piacerebbe accettare la connessione (inviare un syn-ack) e quindi ottenere i dati inviati dall'altra parte (ack'ing in modo appropriato).

Speravo che esistesse già una sorta di stack TCP che potrei utilizzare. Qualche idea? Ho usato lwip in passato per un progetto in C: qualcosa del genere in Python sarebbe perfetto.

+2

Alla fine ho implementato uno stack TCP piuttosto semplice in Python. È proprio quello di cui avevo bisogno per il progetto su cui stavo lavorando, ma potevo usare del lavoro. Se vuoi guardarlo comunque, la fonte è qui: http://github.com/dound/vns/blob/master/TCPStack.py –

risposta

7

Non si dice su quale piattaforma si sta lavorando, ma se si sta lavorando su Linux, aprirei uno tun/tap interface e riavrei i pacchetti IP nel kernel come un'interfaccia di rete reale in modo che il kernel possa quella roba di TCP complicata.

Questo è il modo (ad esempio) OpenVPN funziona - riceve i pacchetti IP non elaborati su UDP o TCP e li restituisce nel kernel tramite un'interfaccia tun/tap.

Penso che ci sia anche un'interfaccia tun/tap per Windows ora che è stata sviluppata per la porta OpenVPN a Windows.

+0

Mi piace questa idea. Sto usando Linux, quindi ottenere il dispositivo tun/tap e un setup tap0 intf non è stato difficile. Sfortunatamente, non so come utilizzarlo. Per iniziare, sto scrivendo il mio pacchetto raw non criptato su tap0 (con un socket raw). Vedo che il pacchetto SYN della forma corretta appare su tap0 (indirizzato agli indirizzi MAC e IP di tap0). Tuttavia, se eseguo netcat in ascolto sull'indirizzo IP di tap0, non lo vedo rispondere con un syn-ack. Sono in grado di connettersi ad esso con telnet (anche se il kernel sembra solo scorciatoia da questo traffico attraverso lo). Eventuali indicazioni su come potrei farlo funzionare? Grazie Nick! –

1

So che questo non è direttamente correlato a Python ma se si sta cercando di eseguire un'elaborazione di rete pesante, si dovrebbe considerare Erlang al posto di Python. Solo un suggerimento davvero ... puoi sempre fare uno scatto facendo questo con Twisted ... se ti senti avventuroso (e hai molto tempo dalla tua parte) ;-)

+0

Perché Erlang in particolare? Perché non C? C++? Giava? ecc ... – jmucchiello

+1

Perché Erlang si appresta molto bene a fare processi asincroni. – jldupont

+1

Ho votato questo backup - chiunque abbia votato per il rifiuto dovrebbe vergognarsi di te stesso - non c'è niente di sbagliato nel chiedere a qualcuno di mettere in discussione i propri requisiti di lavorazione. Con quello detto - perché erlang in particolare? –

0

Potresti essere in grado di utilizzare lo ctypes modulo per importare lwip e usarlo di nuovo.

+0

Non è una cattiva idea, ma penso che questo implicherebbe molto più lavoro di quello che sto cercando su questo. –

2

Dando uno sguardo a Scapy, sembra che sia in grado di gestire queste situazioni di basso livello. Non l'ho usato da solo, quindi non posso confermare che faccia ciò che hai spiegato; Ho solo dato un'occhiata alla documentazione.

+0

Scapy è pulito, ma non penso che mi aiuterà a gestire il protocollo stesso - solo decodificando il pacchetto nei suoi campi costitutivi? –

0

Se si è già impegnati con il software all'altra estremità del socket, ovvero se si stanno inoltrando pacchetti TCP, allora TCPWatch mostrerà come ottenere i pacchetti SYN. SCAPY è sicuramente ottimo per inviare esattamente i pacchetti che vuoi, ma non sono sicuro che funzionerà come proxy.

http://hathawaymix.org/Software/TCPWatch

Tuttavia, se non si è impegnata a ciò che si trova all'estremità di invio, quindi considerare l'utilizzo di twisted Conch o paramiko fare forwarding SSH. Anche se non hai bisogno di crittografia, puoi comunque usarli con blowfish che ha un basso impatto sulla tua CPU. Ciò non significa che hai bisogno di Conch dall'altra parte, poiché SSH è standardizzato, quindi qualsiasi software SSH dovrebbe funzionare. Nel mondo SSH questo viene normalmente chiamato "port forwarding" e le persone utilizzano un client SSH per accedere a un server SSH e configurare il tunnel di port forwarding. Conch e Paramiko ti permettono di creare questo in un'applicazione Python in modo che non ci sia bisogno del client del terminale SSH.