一. 简介
实现 UPnP 条件:
- 路由器需支持 UPnP,且需启用该功能。
- 操作系统需支持 UPnP,且操作系统需启用该功能。
- 软件需支持 UPnP,如 p2p 下载软件等,且需启用该功能。
简单来理解的话,UPnP 是一种设备间通信协议,功能是建立设备和 NAT 网关的端口映射,目的是希望接入 Internet 的任意两个设备在 LAN 下可以相互通信。
二. 协议
2.1. 发现
设备加入网络时,通过简单服务发现协议(SSDP)寻找网络上可用设备。
Internet Gateway Device(IGD)
互联网网关设备协议是一种常见的自动配置端口映射通信协议。
2.2. 控制
控制消息是通过简单对象访问协议(SOAP)
用 XML 来描述的,通过返回动作的值来回应控制消息。
三. miniupnp
https://github.com/miniupnp/miniupnp
Ubuntu 安装 upnpc 命令:
sudo apt install miniupnpc
3.1. upnpc 常用命令介绍
- 添加映射端口,如映射 192.168.110.146 的 TCP 9999 端口到外网的 9999 端口
upnpc -a 192.168.110.146 9999 9999 TCP
- 删除映射端口
upnpc -d 9999 TCP
- 列出映射端口
upnpc -l
3.2. miniupnp 映射部分代码简单逻辑
upnpDiscover() // 返回找到的所有设备的链表
UPNP_GetValidIGD() // 从设备链表中找到有效的 IGD(Internet Gateway Device)网络网关设备
UPNP_AddPortMapping() // 端口映射 -a
-> soapPostSubmit() // 发送 SOAP 请求
-> getHTTPResponse() // 获取相应的响应
RemoveRedirect() // 移除 -d
-> UPNP_DeletePortMapping()
参考
https://www.homenethowto.com/ports-and-nat/upnp-automatic-port-forward/