TCP打洞存在的问题

9

我尝试使用这篇文章中概述的原理,用Python 3编写了一个基本的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

并且

right$ ./tcphole.py localhost 20011 20012

我可以根据Wireshark看到SYN数据包在双向传输: Wireshark capture 但是没有任何东西打印“connected!”。我做错了什么?

我可能会错过一些显而易见的东西,但是我并不完全清楚为什么您期望将那些SYN数据包标识为RELATED。 - NPE
因为它们来自我发送到的同一台机器/端口。第一个SYN将被远程防火墙丢弃,但本地防火墙不知道这一点。 - George Hilliard
这真的是打洞还是普通的TCP?难道不需要在两端都建立出站连接才能进行打洞吗?你只是在一个端口连接,而在另一个端口接受连接... - user541686
@Mehrdad 是的,请记住我会启动两个脚本副本。 - George Hilliard
@thirtythreeforty:哦,我没意识到,好的,谢谢! - user541686
显示剩余5条评论
1个回答

6
答案非常简单:如果数据包没有发往相同的IP地址,则这些数据包不被视为“RELATED”!请将 bind 行更改为:
c.bind('', int(sys.argv[3])))

''绑定到回环地址)完全解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接