您可以在名为“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 上也是如此。
我假设您希望作为您正在创建的东西的一部分自动/以编程方式执行此操作,这就是为什么我向您指出
Python 中的上述 Coherence DNLA/UPnP 框架的原因。
如果您只想一次性手动执行此操作,则有一些出色的命令行和 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 这些数据包返回/第四,这超出了这个答案的范围)。