Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
ISO/IEC 29341-26-10标准定义了WANIPConnection:1服务,这是互联网网关设备(IGD)系列中使用最广泛的UPnP服务。该服务负责管理IP路由的WAN连接,包括连接生命周期控制、NAT端口映射管理以及连接参数(如外部IP地址、DNS服务器配置和连接状态)的暴露。这是P2P应用、游戏主机和VoIP电话在需要通过消费者路由器防火墙开放端口时与之交互的服务。
服务类型URN为urn:schemas-upnp-org:service:WANIPConnection:1。它嵌入在WANConnectionDevice实例中,与WANPPPConnection:1互斥——给定的WANConnectionDevice应根据底层WAN技术暴露基于IP的连接服务或基于PPP的连接服务。
WANIPConnection:1服务实现了一个定义良好的状态机,用于建模IP连接的生命周期。ConnectionStatus状态变量通过五个不同状态转换:Unconfigured(初始状态,未设置连接参数)、Connecting(尝试建立连接)、Connected(IP连接已建立)、PendingDisconnect(请求断开,等待清理)和Disconnected(连接已终止)。
| 动作 | 输入参数 | 输出参数 | 描述 |
|---|---|---|---|
| GetStatusInfo | 无 | NewConnectionStatus, NewLastConnectionError, NewUptime | 检索当前连接状态和运行时间 |
| GetNATRSIPStatus | 无 | NewRSIPAvailable, NewNATEnabled | 查询NAT和RSIP能力 |
| GetGenericPortMappingEntry | NewPortMappingIndex | NewRemoteHost, NewExternalPort, NewProtocol等 | 按索引枚举端口映射 |
| AddPortMapping | NewRemoteHost, NewExternalPort, NewProtocol, NewInternalPort, NewInternalClient, NewEnabled, NewPortMappingDescription, NewLeaseDuration | 无 | 创建新的NAT端口映射 |
| DeletePortMapping | NewRemoteHost, NewExternalPort, NewProtocol | 无 | 删除端口映射 |
| GetExternalIPAddress | 无 | NewExternalIPAddress | 返回外部(WAN侧)IP地址 |
NAT端口映射管理功能可以说是该服务最关键的特性。每个端口映射由(RemoteHost、ExternalPort、Protocol)元组标识。AddPortMapping动作在NAT表中创建一个条目,将匹配指定条件的入站数据包转发到内部主机。LeaseDuration参数使能了具有自动过期能力的动态端口映射。
RemoteHost参数的不当处理。当RemoteHost为空字符串时,映射适用于所有远程主机。然而,一些网关拒绝空字符串的远程主机,或者在指定RemoteHost时未能正确匹配入站数据包。高效实现WANIPConnection:1服务需要谨慎的架构决策。端口映射表同时被UPnP控制路径和数据平面NAT引擎访问。在基于Linux的使用netfilter/iptables或nftables的系统中,每个AddPortMapping动作转化为iptables规则插入,这可能是一个相对昂贵的操作。对于高性能网关,建议采用批量更新机制:在短时间内累积UPnP端口映射变更,然后在单个原子事务中提交到内核NAT表。
GetGenericPortMappingEntry动作要求设备维护一个索引化的端口映射列表。每次查询时解析内核NAT表的朴素方法在有数百个映射时速度极慢。更好的设计是维护一个用户空间影子表,通过netlink事件监听器镜像内核的NAT状态。该影子表支持O(1)索引查找,可按端口号排序以确保一致的枚举顺序。
租期管理是另一个重要的设计考量。WANIPConnection:1规范允许LeaseDuration值为0表示无限期/永久租约。然而,对于注重安全的实现,即使对于无限租约请求,强制执行最大租约期限(如7天)也是良好实践。
GetGenericPortMappingEntry/AddPortMapping接口暴露PCP映射。AddAnyPortMapping动作。