Python:打开路由器后面的监听端口(upnp?)

Posted

技术标签:

【中文标题】Python:打开路由器后面的监听端口(upnp?)【英文标题】:Python: Open a Listening Port Behind a Router (upnp?) 【发布时间】:2011-05-22 11:15:55 【问题描述】:

我开发了一个应用程序,它本质上只是一个小型 ftp 服务器,能够指定您希望在启动时共享哪个目录。我将 ftplib 用于服务器,因为它很容易生病。我遇到的唯一问题是,如果你在路由器后面,你必须手动转发路由器上的端口,我发现这对我的用户(也就是同事/客户)来说有点太复杂了。

所以我一直在寻找一种简单的解决方案来打开端口,但我发现大多数 API 都过于宽泛,超出了我的想象。有人知道实施起来相对简单的解决方案吗?

注意:尽管跨平台兼容性会受到欢迎,但它实际上只会在 Windows 上使用。如果有更简单的仅限 Windows 的解决方案,那么我会选择它。

谢谢!

【问题讨论】:

@Falmarri:您可以使用 UPnP 执行此操作,它是(除其他外)动态打开防火墙中的漏洞的标准;)所以这不是路由器/制造商特定的。 【参考方案1】:

miniupnp 的简单示例。它在已发现网关上创建从外部端口 43210 到连接到已发现网关的接口上的端口 43210 的接口的映射。

import miniupnpc

upnp = miniupnpc.UPnP()

upnp.discoverdelay = 10
upnp.discover()

upnp.selectigd()

port = 43210

# addportmapping(external-port, protocol, internal-host, internal-port, description, remote-host)
upnp.addportmapping(port, 'TCP', upnp.lanaddr, port, 'testing', '')

【讨论】:

谢谢,@lionello,好收获!我稍微修改了您的编辑。【参考方案2】:

您想要的协议称为 IGD(用于 Internet 网关设备)并且基于 UPNP。它允许客户端程序(您的)发现网络上的路由器(使用 UPNP),然后要求它转发特定端口。

大多数家用路由器都支持这项技术,并且该技术被许多服务(如 BitTorrent 或多人游戏)使用,但使用或实现有点复杂。有几个支持 IGD 的开源库,其中最简单的一个(也是跨平台的)是“miniupnp”:参见http://miniupnp.free.fr/

【讨论】:

【参考方案3】:

看起来有几个选项,一个是miniupnp。 GNUPnP here 也有 python 绑定。对于 Windows,minupnp 可以工作,或者您可以使用 miranda-upnp 使用纯 Python。

有一个很好的例子,python GNUPnP 绑定用于打开路由器here 上的端口。 在该示例中,租用时间设置为 0,这是无限制的。 add_port 的定义见here。

一个简单的例子可能是:

#! /usr/bin/python
import gupnp.igd
import glib
from sys import stderr

my_ip = YOUR_IP

igd = gupnp.igd.Simple()
igd.external_ip = None

main = glib.MainLoop()

def mep(igd, proto, eip, erip, port, localip, lport, msg):
    if port == 80:
        igd.external_ip = eip
        main.quit()

def emp(igd, err, proto, ep, lip, lp, msg):
    print >> stderr, "ERR"
    print >> stderr, err, proto, ep, lip, lp, msg
    main.quit()

igd.connect("mapped-external-port", mep)
igd.connect("error-mapping-port", emp)

#igd.add_port("PROTO", EXTERNAL_PORT, INTERNAL_IP, INTERNAL_PORT, LEASE_DURATION_IN_SECONDS, "NAME")
igd.add_port("TCP", 80, my_ip, 8080, 86400, "web")

main.run()

【讨论】:

【参考方案4】:

an article 解释了如何将 Windows IGD COM 对象与 win32com 一起使用。

【讨论】:

【参考方案5】:

我找了很多天。我无法使用 pip for python 3 安装 miniupnpc。

我通过找到here 的实现解决了这个问题,该实现适用于 python 2。

我对它进行了 fork 并进行了更改以在 python 3 上使用,您可以找到它Here

这个实现是迄今为止我见过的最简单的并且运行良好。

【讨论】:

以上是关于Python:打开路由器后面的监听端口(upnp?)的主要内容,如果未能解决你的问题,请参考以下文章

360 p1路由器如何开启UPNP功能

通过使用 UPnP 发送广播数据包来发现路由器不起作用

使用 upnp 以编程方式将端口转发条目添加到路由器中?

如何以编程方式通过upnp实现双NAT端口转发

模拟 UPnP 路由器

1900端口问题