Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TCP打孔的问题_Python_Sockets_Tcp_Hole Punching - Fatal编程技术网

Python TCP打孔的问题

Python TCP打孔的问题,python,sockets,tcp,hole-punching,Python,Sockets,Tcp,Hole Punching,我尝试使用中概述的原则,在Python3中为防火墙编写一个基本的TCP穿孔器。不过,我很难把任何东西连接起来。代码如下: #!/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(so

我尝试使用中概述的原则,在Python3中为防火墙编写一个基本的TCP穿孔器。不过,我很难把任何东西连接起来。代码如下:

#!/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()
我决定在我的本地机器上尝试使用穿孔机,以便捕获两个实例发送的所有流量。我首先设置了环回防火墙:

iptables -A INPUT -i lo -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j DROP
然后我发布了两份脚本副本:

left$ ./tcphole.py localhost 20012 20011

根据Wireshark,我可以看到SYN数据包以两种方式传输:


但是没有任何东西会打印“已连接!”我做错了什么?

答案很简单:如果数据包没有到达相同的IP地址,它们就不会被认为是相关的

绑定
行更改为

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

(绑定到环回地址的
完全解决了问题。

等等,您的防火墙规则(特别是规则#2)不会将传入的
SYN
数据包丢弃到
lo
上吗?在您的示例中没有“已建立”或“相关”的连接,对吗?是的,这正是我试图解决的行为。(在这种情况下,防火墙是对手。)被识别为相关的SYN数据包应该能够通过。感谢您提出了我所看到的最完整、最清晰的问题之一。(+1)哈哈,谢谢!我总是在问之前把事情彻底搞清楚,这样我才不会看起来像个白痴。有时我最终看起来像个白痴,但你只能做这么多。我可能遗漏了一些明显的东西,但我并不完全清楚为什么你希望这些SYN数据包被识别为相关的。
c.bind('', int(sys.argv[3])))