【问题标题】:Is it possible to map a port using UPnP, with SOAP, to bind to a local port where my http server is listening?是否可以使用带有 SOAP 的 UPnP 映射端口以绑定到我的 http 服务器正在侦听的本地端口?
【发布时间】:2011-05-20 09:56:23
【问题描述】:

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

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

对不起,我在这方面完全是新手。我正在网关的 80 端口上使用 Putty 进行测试,使用 xml 发出 http。

POST /upnp/control3 HTTP/1.1 缓存控制:无缓存 连接:关闭 Pragma:无缓存 内容类型:文本/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】:

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

    http://coherence.beebits.net/browser/trunk/Puncher/puncher/base.py

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

    我假设您想自动/以编程方式执行此操作,作为您正在创建的内容的一部分,这就是我向您指出上述内容的原因 Coherence DNLA/UPnP framework in Python.

    如果您只想一次性手动执行此操作,可以使用一些出色的命令行和 GUI 工具来创建 UPnP 端口映射。在 Mac 上,SubEtha Edit 的创建者在http://www.codingmonkeys.de/portmap/index.html 上提供了一个手动 GUI 工具。在 Windows 上,http://deusty.blogspot.com/2008/07/tcmportmapper-for-windows.html 提供手动 GUI 工具。

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

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

    http://miniupnp.tuxfamily.org/

    https://trac.transmissionbt.com/browser/trunk/libtransmission/upnp.c

    http://www.howtoforge.com/administrating-your-gateway-device-via-upnp

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

    我希望这已经回答了您的问题。祝你一切顺利。

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

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

    【讨论】:

    • 感谢您的及时回复!不幸的是,tcpportmapper 在这里运行致命,不知道为什么。我目前在一个 windows 盒子里,我尝试了你建议我的 python 应用程序。它看起来像我需要的。问题是,显然我的 wifi 路由器支持 upnp,因为它会做出相应的响应。我的 dsl 调制解调器也是如此。我认为映射成功但毫无意义的问题可能是因为我从 wifi 网关获得的外部 IP 是调制解调器的,而调制解调器又具有自己的外部 IP,即互联网 IP。我可以在 wifi gw 上映射,但我无法从任何地方访问映射的端口。
    猜你喜欢
    • 2014-08-21
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2017-02-15
    • 2023-03-12
    相关资源
    最近更新 更多