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:
Aber nichts druckt immer "verbunden!" Was mache ich falsch?
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
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
Und danke für eine der vollständigsten und klarsten Fragen, die ich seit langem gesehen habe. (+1) – NPE