2014-04-23 11 views
5

Ich habe versucht, einen grundlegenden TCP-Locher für eine Firewall in Python 3 mit den in this article beschriebenen Prinzipien zu schreiben. Ich habe jedoch Probleme, etwas zu bekommen, um sich zu verbinden. Hier ist der Code:Probleme mit TCP-Lochung

#!/usr/bin/python3 

import sys 
import socket 
import _thread as thread 

def client(): 
    c = socket.socket() 

    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 

    c.bind((socket.gethostbyname(socket.gethostname()), int(sys.argv[3]))) 
    while(c.connect_ex((sys.argv[1], int(sys.argv[2])))): 
     pass 
    print("connected!") 
    thread.interrupt_main() 

def server(): 
    c = socket.socket() 

    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 

    c.bind((socket.gethostbyname(socket.gethostname()), int(sys.argv[3]))) 
    c.listen(5) 
    c.accept() 
    print("connected!") 
    thread.interrupt_main() 

def main(): 
    thread.start_new_thread(client,()) 
    thread.start_new_thread(server,()) 

    while True: 
     pass 

if __name__ == '__main__': 
    main() 

Ich beschloss, die Puncher auf meinem lokalen Rechner, um zu versuchen, so dass ich die gesamten Verkehr von beiden Instanzen gesendet erfassen könnte. Ich habe zunächst eine Loopback-Firewall-up:

iptables -A INPUT -i lo -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A INPUT -i lo -j DROP 

Dann startete ich zwei Kopien des Skripts:

left$ ./tcphole.py localhost 20012 20011 

und

right$ ./tcphole.py localhost 20011 20012 

Ich sehe nach Wireshark, dass die SYN-Pakete in beide Richtungen übertragen werden:

Wireshark capture

Aber nichts druckt immer "verbunden!" Was mache ich falsch?

+0

Warten, würden nicht Ihre Firewall-Regeln (insbesondere Regel # 2) eingehende 'SYN'-Pakete auf' lo' fallen lassen? In Ihrem Beispiel gibt es keine "ESTABLISHED" oder "RELATED" Verbindungen, oder? – NPE

+0

Ja, genau das ist das Verhalten, um das ich mich bemühe. (In diesem Fall ist die Firewall der Gegner.) SYN-Pakete, die als RELATED gekennzeichnet sind, sollten es jedoch wieder durchkommen lassen. – thirtythreeforty

+0

Und danke für eine der vollständigsten und klarsten Fragen, die ich seit langem gesehen habe. (+1) – NPE

Antwort

3

Die Antwort stellte sich als recht einfach heraus: Pakete werden nicht als RELATED betrachtet, wenn sie nicht zur selben IP-Adresse kommen!

Ändern der bind Linien

c.bind('', int(sys.argv[3]))) 

(die '' an die Loopback-Adresse bindet) behebt das Problem vollständig.