是否可以使用 UPnP 和 SOAP 来映射端口,以绑定到我的 http 服务器正在侦听的本地端口?

问题描述 投票:0回答:1

假设我位于 192.168.0.1 的路由器后面,它通向外部 IP,即 192.168.1.64(DSL 调制解调器),通向公共互联网地址。

是否可以使用 uPnP,通过 SOAP 请求网关,将我的本地 http 服务器端口映射到该公共互联网地址的任意端口?

抱歉,我在这件事上完全是新手。我正在网关的端口 80 上使用 Putty 进行测试,使用 xml 发出 http。

POST /upnp/control3 HTTP/1.1 缓存控制:无缓存 连接:关闭 编译指示:无缓存 内容类型:text/xml;字符集=“utf-8” 用户代理:Microsoft-Windows/6.1 UPnP/1.0 SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping" ... ..

谢谢。

xml http soap upnp portforwarding
1个回答
4
投票

您可以在名为“Puncher”的 Python 模块中看到一个很好的示例,它是 Coherence DNLA/UPnP 框架的一部分(在防火墙上“打孔”,duh!:o),它可以创建外部端口的端口映射(例如端口 8080) )到您选择的内部端口:

https://gitlab.digitalcourage.de/coherence/puncher/-/blob/develop/puncher/base.py

Coherence 模块也可以作为 python-coherence 包在 Debian 上使用。如果您使用 ActiveState Python,也可以在 Windows 上使用。

我假设您希望作为您正在创建的内容的一部分自动/以编程方式执行此操作,这就是为什么我向您指出上述内容

Python 中的 Coherence DNLA/UPnP 框架

如果您只想手动一次性执行此操作,可以使用一些出色的命令行和 GUI 工具来创建 UPnP 端口映射。在 Mac 上,SubEtha Edit 的创建者在Port Map 和 TCMPortMapper 上提供了手动 GUI 工具。在 Windows 上,可在 Deusty:UPnP 和 NAT-PMP PortMapper for Windows 处获得手动 GUI 工具。

我强烈建议您使用 Python 中的 Coherence,它可以是一种有趣的编程体验。或者,许多使用网络的不同程序将具有 UPnP 模块来打开端口并将它们转发/映射到本地计算机。例如,μTorrent 就有一个,libtorrent/rtorrent 也有,其他许多也有。

如果您不喜欢 Python(这些是 C 和 Perl 语言),另请参阅以下具有 UPnP 客户端实现的库、示例和工具,以编程方式转发/映射路由器上的端口:

请注意,第二个链接,trunk/libtransmission 中的 upnp.c – Transmission,是来自流行的 BitTorrent 客户端“Transmission”的代码,它使用 miniupnp 库(第一个链接)。

我希望这已经回答了您的问题。祝你无论做什么都好运。

编辑: @kaneda:作为对您的评论的回应,如果我理解正确的话,您位于两个 NAT 后面,一个由您的 DSL 调制解调器负责,另一个由您的无线路由器负责。简单的 UPnP 在这里对您没有帮助,您需要能够在 DSL 调制解调器和路由器上进行 UPnP 端口映射(这可能是不可能的,因为您的路由器可能不会让 UPnP 请求离开其 WAN 端口),或者设置您的DSL 调制解调器或路由器来桥接而不是 NAT,这样您就只位于一个 NAT 后面。

编辑2: @kaneda:围绕双重 NAT 的另一种可能的方法是用 Linux 盒子替换路由器(例如使用 OpenWRT 或类似的)并在那里运行 upnp 代码以转发 DSL 调制解调器端口,然后还在路由器后面的主机上运行基于 miniupnp 的代码以进一步打开路由器。然而,此时,由于您可以控制路由器,您不妨创建一个静态端口映射,并将其将所有 UPNP 协议请求传递到 DSL 调制解调器(通过告诉 iptables 有选择地转发/NAT 这些数据包回来/继续,这超出了本答案的范围)。

© www.soinside.com 2019 - 2024. All rights reserved.