当前位置: 首页 > 知识库问答 >
问题:

TCP穿孔(旁路监听套接字)

储阳曦
2023-03-14

现在,我可以通过NAT建立连接,但只能使用连接套接字:

A.connect(B) -> Crash agains't B's NAT, but open a hole in A's NAT.
B.connect(A) -> Get in A's NAT hole, reach A's connecting socket.

但现在,发送SYN数据包进行连接的两个套接字已经连接。

你会认为我会做的,通过两个NATs得到一个连接,万岁。

#!/usr/bin/env python3
from socket import *
from threading import Thread
Socket = socket

# The used endpoints:
LOCAL = '0.0.0.0', 7000
REMOTE = 'remote', 7000

# Create the listening socket, bind it and make it listen:
Listening = Socket(AF_INET, SOCK_STREAM)
Listening.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Listening.bind(LOCAL)
Listening.listen(5)

# Just start in another thread some kind of debug:
# Print the addr of any connecting client:
def handle():
    while not Listening._closed:
        client, addr = Listening.accept()
        print('ACCEPTED', addr)
Thread(target=handle).start()

# Now creating the connecting socket:
Connecting = Socket(AF_INET, SOCK_STREAM)
Connecting.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Connecting.bind(LOCAL)

# Now we can attempt a connection:
try:
    Connecting.connect(REMOTE)
    print('CONNECTED', Connecting.getpeername())
except Exception as e:
    print('TRIED', type(e), e)

共有1个答案

松飞翮
2023-03-14

所以,经过更多的测试和阅读,我得出了以下结论:

实际上,可以将侦听套接字和进行出站连接的套接字绑定在同一地址(ip,端口)上。

但套接字的行为严重依赖于系统/TCP堆栈的实现,如http://www.brynosaurus.com/pub/net/p2pnat/at§4.3:

 类似资料:
  • 我目前正在开发一款网络游戏。在游戏中,需要通过TCP和UDP将数据从服务器发送到客户端。实现UDP漏洞穿孔很容易,但我不太确定如何实现TCP漏洞穿孔: null 是3。或者是4。该怎么走?

  • 我正在开发一个Java客户机/服务器应用程序,它涉及通过TCP进行P2P通信。我正在尝试实现TCP穿孔,如下所述:http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp。这需要同时侦听并尝试使用同一本地TCP端口建立传出连接。显然,如果使用套接字选项,这应该可以工作,我正在通过Java中的方法进行设置。然而,这并不像我预期的那样奏效。下面是一些测试代码

  • 大多数人似乎都通过UDP使用NAT穿孔,但在我的例子中,我需要使用TCP(这是事实,在有人问“为什么不使用UDP?”之前)我找不到任何示例代码或至少一个适当的教程。我能找到的都是理论上的附属物,但没有使用套接字或TCPClients(我更喜欢套接字)。 有人能给我链接一些示例代码吗?我可以用这些示例代码连接两个NAT后的客户端,或者用示例代码链接到完整的教程?我知道在.NET中很难实现这个目标(我

  • 我知道这个话题并不新鲜。虽然存在各种信息,但健壮的解决方案并没有出现(至少我没有找到)。我有一个用python3编写的P2P守护进程,pie上的最后一个元素是通过TCP连接NAT后面的两个客户端。我得此主题得参考资料: https://bford.info/pub/net/P2pnat/ 如何使两个客户机在连接了一个汇点服务器后直接连接? TCP穿孔问题 到目前为止我所做的: 服务器: 现在,当前

  • 问题内容: 对于linux c编程原始套接字,这是一个快速的问题。如果我只想使用原始套接字来监听任何接口,我是否真的必须绑定到ip地址或接口来监听流量?据我了解,我觉得我应该能够只调用sock();。然后启动recvfrom()流量。也许我错了,但是我看过一些不使用它的程序。 问题答案: 没错,您唯一需要做的就是打电话给then 。不过请注意,使用收听存在一些限制。 如果您不是在“发送后忘记”的基

  • 我正在用C语言编写一个服务器,使用POSIX sockets api。 这是作为GUI应用程序的一部分运行的,它需要能够停止和启动服务器监听和向客户端发送数据。 服务器的主要部分基本上是这样的(我排除了很多代码,因为其中一些与这个问题无关。) 换句话说: 让套接字监听连接 为select()调用设置fds 使用stdin调用select(),所有连接客户端套接字,以及获取从GUI发送的任何数据的管