Python:在路由器后面打开一个侦听端口(upnp?)

Boo*_*ona 14 python upnp ftplib

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

所以我一直在寻找一个开放端口的简单解决方案,但我发现大多数API太宽泛而且超出我的想象.有人知道一个相对简单的解决方案吗?

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

谢谢!

Gre*_*egD 10

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

大多数家用路由器都支持这种技术,而且很多服务都使用这种技术,比如BitTorrent或multiPlayer游戏,使用或实现它有点复杂.有几个支持IGD的开源库,其中一个最简单的(也是跨平台的)是" miniupnp ":请参阅http://miniupnp.free.fr/


dat*_*man 9

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', '')
Run Code Online (Sandbox Code Playgroud)


Mar*_*wis 2

一篇文章解释了如何将 Windows IGD COM 对象与 win32com 一起使用。