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?)的主要内容,如果未能解决你的问题,请参考以下文章