在 Python 中通过 UPnP 转发端口

Posted

技术标签:

【中文标题】在 Python 中通过 UPnP 转发端口【英文标题】:Forward a port via UPnP in Python 【发布时间】:2013-01-07 02:19:18 【问题描述】:

我正在制作一个 Python 应用程序,它要求用户将端口转发到他的计算机,以便与服务器或其他用户进行通信。当前的实现效果很好,但唯一的问题是运行文件的人必须手动将端口转发到本地 IP。我想自动化这个。他选择一个端口,脚本检查它是否可以转发,然后转发它。如果不能,则分别处理错误。

我查看了一些声称可以在纯 Python 中执行此操作的库(因为我需要在完成后编译为 .exe 的 [...]),但没有找到有用的东西。如果您能给我提供一个关于如何尝试转发端口并分别处理成功/失败的代码示例,那就太好了。

提前感谢您的宝贵时间。

P.S.:我的目标是 Python 2.7.X

【问题讨论】:

P.S.:该应用程序将在 Mac 上开发,然后在 Windows 机器上进行测试。如果有效,它将被编译并部署到所有平台。 我正在研究同样的事情,不幸的是,到目前为止我只发现了Brisa 和MiniUPNP......肯定有一个更当前/紧凑/纯 Python 实现吗?有人吗? 在这里寻找跨平台解决方案。 @AbhishekBhatia 我将尝试提供的一个答案,并在一般情况下为此工作几分钟。因为那是差不多 3 年前的事了,我不记得我到底做了什么。我可能放弃了端口转发的想法。如果你也有什么想法,请告诉我。 @DaKnOb 嗨,谢谢。我试过这个 ***.com/questions/36123075/… 。但这似乎不起作用。如果可能,请告诉我。 【参考方案1】:

看起来有几个选项:

Miniupnp 有python bindings Python bindings for GNUPnP miranda-upnp是纯python

有一个很好的例子,用于 GNUPnP 的 python 绑定用于打开路由器 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()

【讨论】:

以上是关于在 Python 中通过 UPnP 转发端口的主要内容,如果未能解决你的问题,请参考以下文章

自动端口转发 (UPnP ?) C++

26-Openwrt 端口转发 dmz upnp

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

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

端口转发 (NAT UPNP) 错误

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