要在家庭或公司的局域网以外(俗称外网)访问家中或公司内网的设备(例如 NAS),通常有两种方式。第一种方式是在局域网的路由器上架设一个 VPN 服务器,再将外网的终端设备作为 VPN 客户端接入内网。在这种情况下,VPN(虚拟专有网络)充当了网线的角色,即接入 VPN 的外网设备,就相当于拉了一根通往内网的网线。因此在 VPN 网络中,即使这根网线是虚拟的,也能实现如同身处局域网内一般的访问体验。

第二种方法则更为简单直接,即通过动态 DNS 服务将一个域名绑定到局域网服务器的外网 ip,再议端口映射的方式将内网设备暴露在公网中,以供外网设备连接。由于众所周知的原因,我国境内的 VPN 连接并不稳定,因此大多数人都会选择第二种方式进行内网穿透。

在路由器上进行端口映射的操作非常简单。这里以 Openwrt 系统为例,仅需在网络 - 防火墙 - 端口转发中新建转发规则,将相应内网设备的端口映射为外网端口即可。

然而,由于内网设备的内部 ip 地址会随着 DHCP 租约的更新而不断变化,尽管我们可以通过 IP/MAC 绑定的方式人为地固定内网设备的 ip 地址,但实践证明这种方式并不稳定。因此,我们经常需要手动修改端口映射规则,这就使得相关的维护工作变得非常繁琐。如果我们长期在外,无法接入内网环境,上述规则修改的工作就很难进行。这时,我们就需要用到 UPnP(通用即插即用)服务。顾名思义,它是一种自动配置端口映射的工具。只要服务器和内网其他设备同时开启 UPnP 服务并稍加简单的配置,即可一劳永逸地解决端口映射的问题。

以群晖和 Openwrt 系统为例,我们首先需要在 Openwrt 路由器上安装并开启 UPnP 服务。

然后,登陆群晖的管理后台,在控制面板 - 外部访问 - 路由器配置选项卡中,选择“设置路由器”。此时系统会自动检测网络环境以及路由器型号与配置,不出意外的话,整个过程能够由系统自动完成,无须人工配置。之后,点击“新增”按钮,并根据自己的需求选择要转发的应用和端口,再点击“保存”即可。

最后,我们可以回到路由器后台的 UPnP 页面,查看已经被系统自动添加好的端口映射规则。值得注意的是,国内的网络运营商一般会禁用个人和家庭宽带的 443 和 445 端口(前者是 https 的默认端口,后者是 smb 服务的默认端口),因此,即使我们在 UPnP 服务中添加了上述两个端口的自动映射,也无法实现 443 和 445 端口的外网访问。此时,就需要我们在防火墙的端口映射中手动进行端口映射,即将 443 和 445 两个内网端口映射到外网的非 443 或 445 端口(如 444 和 446,全凭个人喜好)。这样,我们才能绕过运营商的封锁,成功进行上述两个端口的外部访问。