我开发了一个应用程序,它本质上只是一个小的ftp服务器,能够指定您希望在启动时共享的目录。我正在使用ftplib作为服务器,因为它很容易生病。我唯一的问题是,如果你在路由器后面,你必须手动转发路由器上的端口,我发现它对我的用户(又名同事/客户)来说有点过于复杂。
所以我一直在寻找一个开放端口的简单解决方案,但我发现大多数API太宽泛而且超出我的想象。有人知道一个相对简单的解决方案吗?
注意:它实际上只会在Windows上使用,尽管欢迎跨平台兼容性。如果只有一个更简单的Windows解决方案,那么我会选择它。
谢谢!
答案 0 :(得分:9)
您想要的协议称为IGD(用于Internet网关设备),并且基于UPNP。它允许客户端程序(您的)发现网络上的路由器(使用UPNP),然后让它转发特定端口。
大多数家用路由器都支持这种技术,而且很多服务都使用这种技术,比如BitTorrent或multiPlayer游戏,使用或实现它有点复杂。有几个支持IGD的开源库,其中一个最简单的(也是跨平台的)是“ miniupnp ”:见http://miniupnp.free.fr/
答案 1 :(得分:8)
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', '')
答案 2 :(得分:3)
看起来有几个选项,一个是miniupnp。还有GNUPnP here的python绑定。对于Windows,minupnp可以工作,或者你可以使用miranda-upnp进行纯python。
有一个很好的例子,用于在路由器here上打开端口的python GNUPnP绑定。 在该示例中,租约时间设置为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()
答案 3 :(得分:2)
有an article解释如何将Windows IGD COM对象与win32com一起使用。
答案 4 :(得分:0)