7

Czy istnieje biblioteka Pythona, która implementuje autonomiczny stos TCP?Implementacja stosu TCP w języku Python

Nie mogę używać zwykłej biblioteki gniazd Pythona, ponieważ otrzymuję strumień pakietów przez gniazdo (są one tunelowane do mnie przez to gniazdo). Kiedy otrzymam pakiet TCP SYN adresowany do konkretnego portu, chciałbym zaakceptować połączenie (wysłać syn-ack), a następnie uzyskać dane wysłane przez drugi koniec (odpowiednio).

Miałem nadzieję, że był już napisany stos TCP, który mógłbym wykorzystać. Jakieś pomysły? Używałem lwip w przeszłości dla projektu C - coś takiego w pythonie byłoby idealne.

+2

W końcu udało mi się zaimplementować całkiem podstawowy stos TCP w Pythonie. Właśnie tego potrzebowałem do projektu, nad którym pracowałem, ale mogłem wykorzystać trochę pracy. Jeśli mimo wszystko chcesz na to spojrzeć, źródło znajduje się tutaj: http://github.com/dound/vns/blob/master/TCPStack.py –

Odpowiedz

7

Nie mówisz, na której platformie pracujesz, ale jeśli pracujesz na Linuksie, otworzę numer tun/tap interface i otrzymam pakiety IP z powrotem do jądra jako prawdziwy interfejs sieciowy, więc jądro może zrobić wszystko ten podchwytliwy materiał TCP.

Tak działa (na przykład) OpenVPN - otrzymuje surowe pakiety IP przez UDP lub TCP i tuneluje je z powrotem do jądra przez interfejs tun/tap.

Myślę, że istnieje również interfejs tun/tap dla systemu Windows, który został opracowany dla portu OpenVPN do okien.

+0

Podoba mi się ten pomysł. Używam linuxa, więc uzyskanie urządzenia tun/step i setup tap0 intf nie było trudne. Niestety, nie mam pojęcia, jak z tego skorzystać. Aby rozpocząć, piszę mój nieprzetapnięty pakiet na tap0 (z surowym gniazdem). Widzę, że poprawnie pojawia się pakiet SYN pojawiający się na tap0 (adresowany do adresów MAC i IP tap0). Jednakże, jeśli uruchomię netcat nasłuchując na adresie IP tap0, nie widzę, żeby odpowiadał z synchronizacją. Jestem w stanie połączyć się z nim za pomocą telnetu (choć wydaje się, że jądro po prostu skraca ten ruch przez lo). Jakieś wskazówki, w jaki sposób mogę to uruchomić? Dzięki Nick! –

1

Wiem, że nie jest to bezpośrednio związane z Pythonem, ale jeśli szukasz ciężkiego przetwarzania sieci, powinieneś rozważyć Erlang zamiast Pythona. To tylko sugestia ... zawsze możesz zrobić zdjęcie z Twisted ... jeśli czujesz się żądny przygód (i masz dużo czasu po swojej stronie) ;-)

+0

Dlaczego właśnie Erlang? Dlaczego nie C? C++? Jawa? etc ... – jmucchiello

+1

Ponieważ Erlang doskonale nadaje się do wykonywania procesów asynchronicznych. – jldupont

+1

Głosowałem za tym z powrotem - kto go głosował, powinien się wstydzić - nie ma nic złego w proszenia kogoś o kwestionowanie wymagań dotyczących narzędzi. Z tym powiedział - dlaczego erlang specjalnie? –

0

Być może będziesz w stanie korzystać z ctypes moduł do importowania lwip i użyj go ponownie.

+0

Niezły pomysł, ale myślę, że wymagałoby to o wiele więcej pracy, niż tego szukam. –

2

Spoglądając na stronę Scapy, wygląda na to, że może poradzić sobie z sytuacjami niskiego poziomu. Nie używałem go sam, więc nie mogę potwierdzić, że robi to, co wyjaśniłeś; Zerknąłem tylko na dokumentację.

+0

Scapy są zgrabne, ale nie sądzę, że pomoże mi to w obsłudze samego protokołu - tylko dekodowanie pakietu na jego pola składowe? –

0

Jeśli już jesteś zaangażowany w oprogramowanie na drugim końcu gniazda, to przesyłasz pakiety TCP do ciebie, to być może TCPWatch pokaże ci, jak dostać się do pakietów SYN. SCAPY jest z pewnością świetny do wysyłania dokładnie takich pakietów, jakie chcesz, ale nie jestem pewien, czy będzie działać jako proxy.

http://hathawaymix.org/Software/TCPWatch

Jednakże, jeśli nie są zobowiązane do tego, co jest na końcu wysyłającym, a następnie rozważyć użycie Twisted Conch lub Paramiko zrobić przekierowanie SSH. Nawet jeśli nie potrzebujesz szyfrowania, możesz z nich korzystać z blowfish, który ma mały wpływ na procesor. Nie oznacza to, że potrzebujesz Concha na drugim końcu, ponieważ SSH jest standaryzowany, więc każde oprogramowanie SSH powinno działać. W świecie SSH zwykle określa się to jako "przekazywanie portów", a ludzie używają klienta terminalowego SSH do logowania się do serwera SSH i konfigurowania tunelu przekierowania portów. Conch i Paramiko umożliwiają zbudowanie tego w aplikacji Python, tak aby klient SSH nie był potrzebny.