说,我在192.168.0.1的路由器后面,这导致外部IP,即192.168.1.64(一个dsl调制解调器),它导致一个公共互联网地址。
是否可以通过对网关的SOAP请求使用uPnP将我的http服务器端口本地映射到该公共Internet地址的任意端口?
对不起,我对这件事情完全是新手。我在网关上使用端口80上的Putty进行测试,用xml发出http。
POST / upnp / control3 HTTP / 1.1 缓存控制:无缓存 连接:关闭 Pragma:没有缓存 Content-Type:text / xml;字符集= “UTF-8” User-Agent:Microsoft-Windows / 6.1 UPnP / 1.0 SOAPAction:“urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping” ... ..
感谢。
答案 0 :(得分:4)
你可以在一个名为“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和其他许多一样。
另请参阅以下库,示例和工具以及UPnP客户端实现,以编程方式转发/映射路由器上的端口,如果您不喜欢Python(这些是C和Perl):
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端口映射(可能不可能,因为你的路由器可能不会让UPnP请求离开它的WAN端口),或者设置你的DSL调制解调器或您的路由器桥接而不是NAT,因此您只能在一个NAT后面。
编辑2: @kaneda:围绕双重NAT的另一种可能方法是用Linux机箱替换您的路由器(例如使用OpenWRT或类似机制)并在那里运行您的upnp代码转发DSL调制解调器端口,然后在路由器后面的主机上运行基于miniupnp的代码,以进一步打开路由器。但是,此时,由于您可以控制路由器,因此您可以创建一个静态端口映射,并将所有UPNP协议请求传递给DSL调制解调器(通过告诉iptables有选择地转发/ NAT这些数据包/第四,这超出了这个答案的范围。)