26-Openwrt 端口转发 dmz upnp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了26-Openwrt 端口转发 dmz upnp相关的知识,希望对你有一定的参考价值。

参考技术A 比如我想用wan口的IP,192.168.2.180,远程连接lan口内网192.168.18.235的ubuntu,如何实现:

在防火墙下面添加如下规则 cat /etc/config/firewall

实际实现在iptable的nat表下面添加了如下规则

这样通过wan ip加src_dport就可以访问到内网机器的ssh端口了。

dmz就是加强版的端口转发,比如你内网IP里面有22端口给ssh用,也有80端口给web用,也有23端口给telnet用。如果用端口转发的话,你需要建立三条端口转发的规则。用dmz的话一下子就都可以了。

在防火墙下面添加如下规则 cat /etc/config/firewall

实际实现在iptable的nat表下面添加了如下规则

openwrt上面使用miniupnpd服务来实现upnp服务

/etc/config/upnpd里面的log_output设置成1,可以在logread下查看交互日志。

右键查看属性可以看到路由器的信息

抓包可以看到路由器发送SSDP广播包给239.255.255.250,NOTIFY消息内容包含上面信息。

抓包可以看到路由器发送SSDP广播包给239.255.255.250,NOTIFY消息内容被byebye。

upnp可以通过另一种方式实现端口映射,就是客户端告诉路由器说,我想要通过哪个端口应该到哪个端口,然后路由器帮忙建立端口转发规则。

ubuntu安装upnpc

ubuntu的ssh添加2222端口,upnp默认只允许1024-65535端口的映射

sudo vim /etc/ssh/sshd_config

sudo /etc/init.d/ssh restart

ubuntu 通过upnpc请求添加端口映射,2222内部端口,9000外部端口

这时候在upnp.leases下面就会添加一条信息,iptable -t nat下面添加一条规则。完成端口映射

ubuntu 通过upnpc请求删除端口映射

会有如下信息被upnpd捕获到

在 Python 中通过 UPnP 转发端口

【中文标题】在 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()

【讨论】:

以上是关于26-Openwrt 端口转发 dmz upnp的主要内容,如果未能解决你的问题,请参考以下文章

端口转发 (NAT UPNP) 错误

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

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

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

简单的多人游戏网络,无需专用服务器或需要玩家手动转发端口(无 UPnP)

路由器中的DMZ主机是啥原理