如何在具有公共 IP 但都在 LAN(python 解决方案)之后的两台机器之间进行通信?

Posted

技术标签:

【中文标题】如何在具有公共 IP 但都在 LAN(python 解决方案)之后的两台机器之间进行通信?【英文标题】:How to communicate between two machines with public IP but both behind LAN(python solution)? 【发布时间】:2015-02-27 04:58:16 【问题描述】:

为此寻找一个简单的python解决方案:

假设机器A的本地IP是192.168.1.5,公网IP是111.11.111.11,机器B的本地IP是10.0.0.5,公网IP是222.22.222.22,现在需要这两台机器通信,你怎么做那个?

我已经看到很多在同一网络上同时使用服务器和客户端的套接字编程示例,但是如何在不更改路由器配置(端口转发等)的情况下连接不同网络后面的机器?

编辑:

如果机器 A 在 LAN 后面怎么办:本地 IP 192.168.1.5,公共 IP 111.11.111.11;机器B是一个HTTP服务器,公网IP为222.22.222.22;现在您可以通过 HTTP 请求轻松地从 A 到达 B,但是从机器 B 到达机器 A 的最佳解决方案是什么?

【问题讨论】:

不知道 python.. 但我可以告诉你.. 这种情况下的典型解决方案将基于 HTTP,并且可能涉及充当网关/中继的中间服务。 使用可从两者访问的第三台公共机器,例如localtunnel.me @VikasGupta:我正在考虑在每一端构建一个简单的 HTTP 服务器,以便它们可以相互发送 HTTP 请求进行通信,但是如果没有每一端路由器的管理员权限,你就无法真正访问到任一侧... “它不是实时的” -- 你的意思是什么? (端口转发器“实时”工作)还有其他要求吗? (提供更多上下文,使问题更具体,否则它太宽泛了)。如果 A->B 工作,则保持长期连接,以便能够随时从 B 向 A 发送消息。 任何带有 192.168 的设备。或 10. IP 地址将位于 NAT 路由器后面,无法直接访问。您需要依靠路由器进行连接。要么你需要配置路由器进行转发,要么你需要让路由器后面的设备发起连接。没有别的办法。如果它们在不同的路由器后面而没有转发,则需要第三方。 【参考方案1】:

打孔是实现这一目标的一种方法。打孔是一种 NAT 穿越技术,它允许 NAT 后面的设备之间直接通信。并非所有 NAT 都支持打孔。但是很大比例的 NAT 允许。

http://www.brynosaurus.com/pub/net/p2pnat/

此链接详细解释了它。他们也给出了统计数据。

【讨论】:

【参考方案2】:

对于第一种情况,当两个设备都在 NAT 之后,如果您不想手动转发端口,则需要执行 hole punching 或使用 UPnP python 库来转发端口。

对于第二种情况,机器 A 上的程序必须初始化连接。这一端的 NAT 将在其表中创建一个转换条目。基本上,从您网络的公共 IP 地址上的机器 B 发送的任何数据包现在都将转发到作为本地 IP 地址的机器。

【讨论】:

以上是关于如何在具有公共 IP 但都在 LAN(python 解决方案)之后的两台机器之间进行通信?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 公开具有公共 IP 地址的 Azure Kubernetes 集群

如何使用 Python 检索 AWS Lambda 公共 IP 地址?

具有私有 IP 的 AWS Gitlab Autoscale 运行器,不想启用公共 IP

cassandra.yaml中的群集配置问题,用于多节点群集,其中只有1个公共IP

来自lan和外部的wordpress访问

如何使 LAN 客户端可以发现服务器