如何使用 scapy 使端口在 NAT 后面显示为开放设备?

网络工程 IPv4 tcp 纳特 转发端口
2022-02-20 13:59:16

这已经在 7 年前的堆栈溢出中被问到了。我在那里没有看到正确的答案。有没有办法做到这一点?

当这个数据包继续传输时,另一端不认为端口是伪开放的吗?应用程序被配置为确保仅使用套接字绑定使用这些端口。我无法让它工作。应用程序未连接到服务器。在wireshark上,(一个是服务器——它不在NAT之后),另一端自动发送RST ACK(关闭连接)。如何放入 tcp-port-keepalive,使其不会关闭连接?

详细信息:我有一个在 LAN 中运行良好的应用程序。P2P .. 现在我希望它在 NAT 之后工作,这样就不需要服务器了。该应用程序有一个使用端口 12345 的“服务器”端和一个使用端口 12346 的“客户端”端。这里的想法是使实际上位于 NAT 后面的服务器看起来好像是打开的。从而实现真正的点对点连接。

2个回答

如果您希望不同 NAT 后面的两台主机相互通信,则必须有一些 Internet 可访问的服务器来代理连接。[另请参见:nat 打孔]如果一方开始盲目传输,另一方将永远看不到它,因为在另一个 NAT 中没有连接。TCP 需要握手来建立连接。任何 NAT 引擎都需要看到完整的握手来设置自己的连接跟踪。

归根结底,如果我在 NAT 之后,而你在 NAT 之后,我们就无法直接通信。我们每个人都需要了解对方的一些事情,而没有可以交换它的渠道。

  1. 要在 NAT 后面工作 - 从公共 IP 地址连接到服务器的私有 IP 地址 -需要目标 NAT,也就是端口转发,也就是反向 NAT 您无法从私有服务器端解决这个问题。

  2. 如果客户端和服务器都在同一个专用网络中(更准确地说:共享一个公共寻址域),那么你什么也不做。只需从客户端连接到服务器的 IP 和端口即可。

  3. 如果客户端和服务器位于不同的私有网络中,则 #1 适用 - 客户端的私有地址需要在其 WAN 网关处由源 NAT 进行转换。公共目标地址需要在服务器网络的 WAN 网关处由目标 NAT 进行转换。

  4. 作为#3 的替代方案,可以在两个网络之间创建一条隧道,允许它们共享一个公共寻址域,因此适用#2。

尝试使用某种诡计绕过必要的目标 NAT可能适用于 UDP,但对于 TCP(由 HTTP/S 使用)绝对没有实际意义。TCP 需要完美的 SYN-SYN/ACK-ACK 握手,这是您无法解决的。