upnp原理与实践
WANIPConnection
参考:http://upnp.org/specs/gw/UPnP-gw-WANIPConnection-v2-Service.pdf
- AddPortMapping()
- NAT
- upnp流程
最多进行4层映射,第一层路由通过/proc/net/route获取本地网关,也就是route -n的功能,第一层映射成功后,可以根据GetExternalIPAddress获得该层路由出口ip,如果出口ip为内网ip,说明还有多层路由,traceroute可以跟踪路由信息,如traceroute -m 4 -w 1 -q 2 www.baidu.com,设置为各层路由的网关,使用出口ip作为NewInternalClient,发送upnp映射请求给各层路由的网关,尝试多层映射。
广播过程:
1 | 1. 设备 A 向多播地址发送信息(例如,发送到组播地址 X.X.X.X)。 |
广播实现:
1 |
|
UPNP解析流程如下:
- GetExternalIPAddress,获取externalIp,作为下次映射的localIp
- GetGenericPortMappingEntry,从0开始遍历,获取已映射的端口,避免端口冲突
- CheckPortMapping,检查需要映射的端口是否已映射,避免重复映射
- DelPortMapping,如果端口已映射,删除旧映射
- AddPortMapping,添加新映射
- CheckPortMapping,检查映射是否成功
具体过程可以参考日志:
1 | 2025-07-28 09:52:06.822 local ip is 192.168.1.4,rawNat = 3 |
WANIPv6FirewallControl
参考:http://upnp.org/specs/gw/UPnP-gw-WANIPv6FirewallControl-v1-Service.pdf
具体流程如下:
- AddPinhole()
- UpdatePinhole()
- DeletePinhole()
- GetOutboundPinholeTimeout()
- GetFirewallStatus()
- GetPinholePackets()
- CheckPinholeWorking()
在IPv4中,NAT(网络地址转换)是缓解IPv4地址短缺的流行服务。例如,NAT允许私有网络上的多台主机使用单个公共IP地址访问Internet。IPv6的设计部分是为了纠正IPv4中的某些缺陷。特别是,IPv6地址空间比IPv4地址空间大得多,因此希望不存在IPv6地址短缺的风险。
因此,IPv6不再需要NAT,恢复了端到端的通信范式。然而,使用IPv4 NAT的副作用之一是许多供应商和用户认为NAT通过隐藏设备的IP地址来为设备提供一些基本的安全性,从而保护设备免受外部攻击。
许多专家对NAT的假定安全声明提出异议。然而,许多供应商和用户可能希望防火墙服务保护内部主机免受外部访问,以便内部设备继续具有抵御外部攻击的基本安全性。
在IPv6防火墙很常见的可能场景中,如果有一种类似于NAT穿越的方式来动态控制防火墙,那么对某些应用程序将是有益的。在这种情况下,IPv6 IGD供应商可以实施WANIPv6FirewallControl服务(而不是 WANIPConnection 服务)以允许UPnP控制点控制IGD的防火墙。
对于使用以前的WANIPConnection服务 UPnP CP,使用WANIPv6FirewallControl服务所需的返工量有望减少,因为这两种服务非常相似。