# UPnP

### 背景知识

**通用即插即用**（英语：Universal Plug and Play，简称**UPnP**）是由“通用即插即用论坛”（UPnP™ Forum）推广的一套网络协议。该协议的目标是使家庭网络（数据共享、通信和娱乐）和公司网络中的各种设备能够相互无缝连接，并简化相关网络的实现。在理解 UPnP 之前，我们先了解一下传统的 PnP 技术，因为 UPnP 是对于传统 PnP（即插即用）概念的扩展。

传统的 PnP **“即插即用”**&#x662F;指 PC 电脑在添加硬件设备时可以自动处理的一种标准。在 PnP 技术出现以前，当需要为 PC 电脑安装新的硬件（比如：声卡，CD-ROM，打印机）时，这些设备需要用到 PC 电脑的 DMA 和 IRQ 等资源，为了避免硬件设备对计算机这些资源使用上的冲突，我们就需要**手工为新添加的硬件设备设置中断和 I/O 端口**（比如，想要为添加的声卡占用中断 5，就找一个小跳线在卡上标着中断 5的针脚上一插）。这样的操作需要用户了解中断和 I/O 端口的知识，并且能够自己分配中断地址而不发生冲突，对普通用户提出这样的要求是不切实际的。

PnP “即插即用”技术出现以后，可以**自动为新添加的硬件分配中断和 I/O 端口，用户无须再做手工跳线，也不必使用软件配置程序**。唯一的要求就是操作系统需要支持 PnP 标准，同时所安装的新硬件也符合 PnP 规范的。

### UPnP 协议介绍

现在我们讲 UPnP，在网络世界里，**当一个主机加入网络时，其行为模式跟我们上述的添加和删除设备是类似的。**&#x5C24;其是在私有网络和公网交互的时候，私有网络中的主机使用的是内网 IP 地址，是无法被外网的主机直接访问的。必须借助 NAT 网关设备（本地路由器）把内网地址映射到网关的公网地址上。

简单来说就是， NAT 网关设备拥有一个公网 IP 地址（比如 10.59.116.19），内网中的主机（比如 192.168.1.101）想要与外界通信的话，NAT 网关设备可以为其做一个端口映射（比如：180.59.116.19 :80 —> 192.168.1.101 :80），这样，外部的主机发往 NAT 网关的数据包都会被转发给内网的该主机，从而实现了内网中的主机与外部主机的通信。![](//upload-images.jianshu.io/upload_images/1452123-e9de3f9f9ab40947.png?imageMogr2/auto-orient/strip|imageView2/2/w/650/format/webp)

当内网中的主机想要被外界主机直接访问（比如开放 80 端口，对外提供 HTTP 服务），我们就需要在 NAT 设备中为当前主机手工配置端口映射，如果内网中有多台主机都想要被外界主机直接访问的话，我们必须在同一个 NAT 设备上为这些主机分别做端口映射，它们之间不能使用有冲突的端口。这个过程需要用户手工一一配置，显然给用户带来了很大的麻烦。![](//upload-images.jianshu.io/upload_images/1452123-b3d8c688d7bcdc04.png?imageMogr2/auto-orient/strip|imageView2/2/w/650/format/webp)

UPnP 技术标准的出现就是为了解决这个问题，只要 NAT 设备（路由器）支持 UPnP，并开启。那么，当我们的主机（或主机上的应用程序）向 NAT 设备发出端口映射请求的时候，**NAT 设备就可以自动为主机分配端口并进行端口映射**。这样，我们的主机就能够像公网主机一样被网络中任何主机访问了。

### UPnP 的应用场景

UPnP 典型的应用场景就是家庭智能设备的互联，还有，目前在网络应用比如 BitTorrent, eMule，IPFS，Ethereum 等使用 P2P 技术的软件，UPnP 功能为它们带来极大的便利。比如：利用 UPnP 能自动的把它们侦听的端口号映射到公网地址上，这样，公网上的用户也能对当前的 NAT 内网主机直接发起连接。

#### 实现 UPnP 所需条件

必须同时满足三个条件：

* NAT 网关设备必须支持 UPnP 功能；这是因为它需要扮演控制点（239.255.255.250:1900）的角色，控制点提供的是 SSDP 服务。
* 操作系统必须支持 UPnP 功能；比如 Windows 系列操作系统；
* 应用程序必须支持 UPnP 功能；比如 Bt、eMule、IPFS, Ethereum 等。

以上三个条件必须同时满足，缺一不可。

**注：**&#x5927;多数路由器都是支持 UPnP 的，有的是默认开启，有的需要手工开启。![](//upload-images.jianshu.io/upload_images/1452123-9540ef826d131c37.png?imageMogr2/auto-orient/strip|imageView2/2/w/190/format/webp)

**UPnP 这么好，那么我们应该立即开启吗？**

非也，如果我们的电脑并不需要 UPnP 所提供的功能，比如，我们的电脑并不想要对外直接提供服务，也不运行上述 P2P 软件，那么我们就无需开启 UPnP。因为一旦开启 UPnP，就意味着我们把自己的主机暴露在公网环境中，任何主机都可以向我们的电脑发起连接，NAT 设备会对所有收到的数据包不进行任何 authentication 认证而转发给我们的主机，这样，路由防火墙就会完全失效，我们的主机就很容易受到恶意的网络窥探，感染病毒或者恶意程序的几率也大大增加。

**注：**&#x4E0A;述 NAT 设备通常就是指我们本地的路由器。<br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dev2ero.gitbook.io/notes-cs/cyber-security/xin-xi-an-quan-yuan-li/iot-security/iot-chang-jian-xie-yi/upnp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
