问题描述
因此,为了便于理解,我们将假设两台机器都在 ipv4 上且位于 NAT 网络之后。 我希望能够在两台机器上打开一个套接字并让机器通过这些套接字(或类似的系统)连接。 我知道这需要 nat 穿透,但我不确定 nat 穿透是如何应用的(曾经连接的套接字现在可以接受吗?)任何在 python 中使用过 nat 穿透的人,我真的很感激你的帮助。
1楼
这称为“NAT 穿越问题” 。
有三种解决方案:
静态配置 NAT 以将给定端口的传入连接请求转发到您的服务器。 它也称为端口转发
互联网网关设备 (IGD) 协议。 允许 NATed 主机:
-学习NAT路由器的公共IP地址
- 添加/删除端口映射(带租用时间)
即,自动化静态 NAT 端口映射配置中继(在 Skype 中使用)
-NATed 客户端建立与中继/服务器的连接
-外部客户端连接到中继
-relay 在连接之间桥接数据包
有关详细信息,请参阅《计算机网络 A 自上而下的方法》第 6 版-James F. Kurose、Keith W. Ross第 4 章>>网络地址转换 (NAT) 一书
2楼
打孔在很好描述
打孔是一种计算机网络技术,用于在位于限制性防火墙之后的不同组织中的两方之间建立通信。 用于在线游戏、P2P 和 VoIP 等应用程序,两个客户端都与不受限制的第三方服务器建立连接,为它们揭示外部和内部地址信息。 由于每个客户端都向服务器发起了请求,因此服务器知道它们为该会话分配的 IP 地址和端口号,它们彼此共享。 拥有有效的端口号会导致防火墙接受来自每一方的传入数据包。 ICMP 打孔、UDP 打孔和TCP 打孔分别使用Internet 控制消息、用户数据报和传输控制协议。 使用 TCP 恶意打孔,可以将压缩的 SYN 数据包发送到公共 ACK 路径中。
那里有关于 TCP、UDP 和 ICMP 保持冲压的各种技术的链接。
通常,要从 A 到 B(都在 NAT 后面)打一个洞,需要他们最初都可以连接到的第 3 方服务器 C。 服务器将 A 的连接信息发送给 B,反之亦然。 A & B 然后使用此信息尝试直接相互连接,但该过程并非 100% 可靠。
如果您没有第 3 方服务器,那么我认为它不会起作用。
编辑
您可能还想查看 UPnP 。 我不确定路由器对它的支持程度,但它听起来适合您的应用程序。
3楼
听起来您需要设置端口转发——本质上是告诉您的路由器将它在特定端口上接收到的呼叫转发到位于它后面的服务。
这通常是通过路由器的管理界面完成的。