能不能 调用路由器的UPnP自动开放端口
因为很多时候,没有路由器的权限,不能改动防火墙,但路由器都支持 UPnP NAT-PMP功能,像qbittorrent 这类bt下载软件都是支持自动开端口。然后把 natmap 运行在主机就可以了,不用改动路由器设置。
Natter支持UPnP: https://github.com/MikeWang000000/Natter
Natter 手搓实现了 UPnP 协议,但是目前在某些品牌路由器还存在兼容问题(头大)。 我觉得 NATMap 可以不必走这个老路,坑很大。
考虑下直接调用 upnpc 吧(miniupnp 的 client)。
https://manpages.debian.org/unstable/miniupnpc/upnpc.1.en.html
upnpc -i -a 192.168.1.1 12345 12345 tcp
↑ 这样就可以让路由器开放一个 12345 的 TCP 端口转发至 192.168.1.1:12345
不知道在通知脚本的时机调用是否能行,可能需要先调用 upnpc 再做 stun bind。@heiher
谢谢,我试试 Natter。
Natter 手搓实现了 UPnP 协议,但是目前在某些品牌路由器还存在兼容问题(头大)。 我觉得 NATMap 可以不必走这个老路,坑很大。
考虑下直接调用
upnpc吧(miniupnp 的 client)。https://manpages.debian.org/unstable/miniupnpc/upnpc.1.en.html
upnpc -i -a 192.168.1.1 12345 12345 tcp
↑ 这样就可以让路由器开放一个
12345的 TCP 端口转发至192.168.1.1:12345不知道在通知脚本的时机调用是否能行,可能需要先调用 upnpc 再做 stun bind。@heiher
如果UPnP建立映射时不会检索当前存在的会话并复用,应该是需要调整顺序的。找时间调调看
natmap调用upnpc程序建立端口映射
(结合Natter宽带症侯群讨论整理)
适用场景
natmap运行在内网主机上,通过用户侧路由器的UPnP功能自动建立端口映射,实现免于手工配置路由器防火墙。
前置条件
用户侧路由器的SNAT默认不更改内网主机的源端口,即在流出方向上路由器层源端口与内网主机源端口相同。若路由器的端口分配行为不满足,无法保证入站可达。
运行机理
- natmap负责建立从内网主机至运营商公网整个链路的映射,维持映射的有效性,并返回公网的IP和端口。
- upnpc负责建立路由器至内网主机方向的端口映射,使入站流量能转发到内网服务上。
涉及三层共四项网络地址:
- 内网主机IP、内网主机STUN端口(natmap -b 参数值)
- 内网主机IP、内网主机服务端口(如Web服务器侦听的80)
- 路由器WAN口IP、路由器WAN口端口
- 运营商公网IP、运营商公网端口
natmap先使用内网主机IP、内网主机STUN端口(-b指定)建立映射,upnpc后使用内网主机STUN端口作为外部端口,内网主机服务端口作为内网端口建立入站方向的映射。这里要求路由器的端口分配行为是路由器WAN口端口与内网主机STUN端口保持相同值,才能保证UPnP建立映射的外部端口与STUN建立映射的路由器层端口相同,即前置条件描述的要求。
使用方法
- 准备natmap通知脚本 upnp-up
#!/bin/bash
SRV_ADDR=$6
SRV_PORT=内网主机服务端口
GW_PORT=$4
PROTO=$5
upnpc -i -a $SRV_ADDR $SRV_PORT $GW_PORT $PROTO
- 运行natmap
-b 建议采用不易冲突的端口范围,并配置为在范围内随机分配。比如1024以下端口
natmap -s turn.cloudflare.com -h example.com -b 800~1000 -e /path/to/upnpc-up
UPnP 协议有无安全隐患?
UPnP 协议有无安全隐患?
严格来说有。无需任何授权就能开放端口,与默认防火墙策略是相反的。