9.7. 专用网络与 NAT¶
IPv4 设计之初提供了 40 亿个地址,在当时听起来似乎足够了。但事实并非如此。每个接入互联网的家庭、办公室和工厂都需要一整块地址来分配给内部设备,而当全世界数不清的摄像头、手机和家电都加进来后,40 亿个地址就远远不够分了。
互联网最终采用的解决办法是专用网络:本地网络上的大多数设备使用的地址在全局范围内并不唯一,只在该网络内部唯一,而处于网络边缘的单个设备负责在两个世界之间进行转换。摄像头几乎总是位于这样的专用网络之中。
9.7.1. 专用地址范围¶
有三段 IPv4 地址被保留为不在公共互联网上路由。任何本地网络都可以自由使用这些范围内的地址,无需与任何人协调,因为本地网络之外的路由器永远不会尝试将数据送往这些地址:
10.0.0.0--10.255.255.255(1600 万个地址;常见于较大的企业网络)。172.16.0.0--172.31.255.255(约 100 万个地址;在实际中较少见)。192.168.0.0--192.168.255.255(6.5 万个地址;几乎所有家用路由器的默认设置)。
在典型的家庭网络中,摄像头和与之通信的笔记本电脑都使用 192.168.x.x 地址,因为这正是家用路由器为其所托管网络所选用的地址范围。
9.7.1.1. 网络掩码的用途¶
IP 地址 页面介绍了 /24 表示法。它在这里之所以重要,是因为网络掩码正是每个设备用来判断数据包下一步该送往何处的依据。摄像头每发送一个数据包,都会将自己的网络掩码应用到目标地址上,并查看结果:
如果目标地址与摄像头自身地址共享相同的网络位,那么目标就处于同一本地网络中。摄像头会直接将数据包发送给它。
如果目标地址不共享相同的网络位,那么它必然位于其他某个网络。摄像头会将数据包发送给它的默认网关(链路建立时自动配置的路由器),并让网关处理后续的事情。
这个单一的判断——“我们是否共享网络位?”——正是网络掩码的用途所在。这也是为什么家庭网络默认采用 /24:254 台设备的上限对一个家庭来说绰绰有余,同时还能让网络保持简单。
9.7.2. 网络地址转换¶
处于 192.168.1.50 的摄像头不能直接向公共互联网上的服务器发送数据包——公共互联网不会路由到 192.168.x.x。家用路由器通过网络地址转换(Network Address Translation,即 NAT)来解决这个问题,并且整个过程是透明的。
NAT 会将出站数据包的源地址改写为路由器的公有地址,并在进入的回复上反向还原该改写,从而使专用设备看起来共用同一个公有地址。¶
路由器拥有两个地址:一个是本地网络上的私有地址(通常是 192.168.1.1),另一个是互联网服务提供商分配的公有地址。当摄像头向某个公有地址发送数据包时,路由器会
记录下摄像头的私有地址与端口,并将其与自己的一个临时出站端口配对;
将数据包上的源地址改写为自己的公有地址(并将源端口改写为所选的出站端口);
将改写后的数据包从公有一侧发出。
当回复发回到路由器的公有地址与端口时,路由器查找该配对关系,将目标地址改写回摄像头的私有地址与端口,并在本地一侧将其投递出去。摄像头从不知道发生过改写;服务器也从不知道原始的源地址。
NAT 正是让家庭网络变得切实可行的关键。它同时还带来两点值得了解的后果。
9.7.3. NAT 改变了什么¶
出站很容易。 处于专用网络上的摄像头可以自由地向外通信。每当它打开一个 TCP 连接或向远程服务器发送 UDP 数据包时,NAT 都会自动建立配对。大多数摄像头应用都朝这个方向工作:采集一张图像,将其推送到某处的服务器,再接收回复。
入站很难。 公共互联网上的设备无法直接连接到专用网络上的摄像头。当一个未经请求的数据包到达路由器的公有地址时,路由器没有可供查找的配对关系,因此该数据包无处可去。路由器要么将其丢弃,要么交给运行在路由器自身上的某个服务。
针对入站情形有三种常见的变通办法,大致按可行性从低到高排列:
端口转发。 配置路由器,将某个选定公有端口上的所有入站数据包定向到指定的私有设备。这需要路由器的管理员权限;并且当路由器的公有地址发生变化时会变得脆弱。
VPN。 运行一个虚拟专用网络,将摄像头放到与需要访问它的人相同的逻辑网络上。这种方法较为笨重;对大多数摄像头部署而言超出了讨论范围。
由出站发起的连接。 摄像头向公共互联网上某个已知的服务器发起向外的连接,并保持该连接处于打开状态;服务器利用这条已有的连接将消息推送回来。推送通知以及大多数云连接设备协议正是这样工作的,也是大多数摄像头应用最终采用的模式。
NAT 对摄像头上的 Python 代码是不可见的。脚本只管与它所需的任何目标通信;路由器在幕后处理转换。但连接的方向确实很重要,而 NAT 正是为什么“摄像头主动连出到云服务器”比“云服务器主动连入到摄像头”要容易得多的原因。