【问题标题】:Python Flask with STUN带有 STUN 的 Python 烧瓶
【发布时间】:2025-12-02 19:50:02
【问题描述】:

我正在开发一个简单的基于 Flask 的服务器,它可以与 Internet 上的对等应用程序(其他类似服务器)进行通信。应用程序可以位于 NAT 之后。所以我正在尝试使用 pystun 通过 stun 服务器解析外部 IP 和端口。

import stun
nat_type,external_ip,external_port=stun.get_ip_info()

返回的端口是 54320。问题是当我尝试 http://external_ip:54320 时,请求没有到达 Flask 应用程序。 http://external_ip:5000 也不起作用,5000 是使用的内部端口(我知道这不应该起作用,但无论如何都试过了)。没有防火墙。我已经用 host="0.0.0.0" 运行了 Flask。 添加..我不想在路由器中进行显式端口映射..有没有办法烧瓶可以监听可从外部地址访问的端口并通过 stun 找出外部端口?

【问题讨论】:

  • 端口映射是否正确?
  • 我不这么认为.. 但是如何检查呢?我认为它的映射不正确,因为每次我用 pystun 查询它总是返回相同的端口 54320
  • 添加..我不想在路由器中进行显式端口映射..有没有办法烧瓶可以监听可从外部地址访问的端口并通过 stun 找出外部端口跨度>

标签: python flask stun


【解决方案1】:

如果不进行明确的端口映射,很难在 NAT 后面托管服务器。 NAT 还充当防火墙。 NAT 后面的节点可以进行出站 TCP 连接,但 NAT 会阻止任何入站连接。

STUN 在这里没有帮助,因为它只能帮助 NAT 后面的节点发现它们自己的端口映射。要在 STUN 之后建立连接,您通常必须执行打孔步骤,这涉及到两个端点同时尝试相互连接。

您可以尝试的一个想法是使用UPNP,这是一种许多 NAT 支持动态创建端口映射的协议。有一些开源库可能会起作用。

但更简单的解决方案是将您的 NAT 配置为具有明确的端口映射。 (例如,端口 50000 在特定端口映射到您 PC 的内部 IP 地址)。

【讨论】: