软路由/NAS的远程访问方案
当我们把家里的网络和媒体服务搭建好之后,有很多时候人在外边,也想能访问家里的设备,或者观看家里nas的电影。我们可以通过以下几种方式来实现,只讲解思路和使用的平台,这里以openwrt软路由为例。以下几种方案,按优先顺序排列。
公网ipv4
这是最佳的远程访问方案,但是存在的几个问题:
全球ipv4地址即将枯竭,申请难度大,基本只有电信宽带,才有可能申请到。然而这也是以前了,最近消息很多地方的电信宽带发表声明,不在提供公网ipv4服务。至于之前已经获得ipv4的宽带用户,应该是不收回,只是不再新发。
ip为动态ip,所以我们不能固定的使用ip地址来访问家里的设备。
针对这一点,我先给大家解释一下域名和ip还有DNS的关系。大家可以把域名理解为你的名字,把ip理解为你家的房子,并且你家有好几个房子,把dns理解为一个问路人。当我要找到你家的时候,首先我会问问路人(DNS):XXX家在哪里,问路人会根据最新登记的记录,查询到你家在xxx。然后我通过xxx这个地址找到你家。放到实际情况中,我在浏览器中打开“www.baidu.com”这个网站的时候,浏览器会先请求dns服务器,通过“www.baidu.com”这个域名,获取到ip,然后才能正常的访问百度。这就是为什么当dns出问题的时候,通过域名访问网站就访问不了,但是通过ip直接访问却依然可以的原因。
所以当ip不是固定的时候(搬家了),我们该怎么保证DNS(问路人)还知道你家在哪呢。这里就引入一个新的概念——动态DNS。也就是说你设备IP发生变化(搬家)的时候,设备会通知DNS(问路人):这个域名对应的ip变更为xxx.xxx.xxx.xxx(我家搬到xxx了)。这是有朋友就会问了:我哪知道什么时候ip会变呢?总不能隔几分钟就看一眼ip变没变吧? 没错,就是隔几分钟就判断ip是否发生变化,不过这个是由软路由来执行的,并不是我们人工来实现。
结论:公网ipv4用户,使用动态dns,即可保证稳定的访问自家设备。ddns服务商推荐:阿里、华为啥的都行,支持ipv4动态dns的服务商太多了。
公网ipv6
ipv4固然是好,但是实在是很难获得。不过不用担心,ipv6可以作为你的第二种选择。
首先ipv6地址多不胜数,可以给全球每一粒沙子分配一个ipv6。所以我们几乎每个宽带,甚至手机流量,绝大多数都有ipv6地址的提供,请注意:绝大多数,万事屋绝对。前提是,光猫、路由、设备均支持ipv6,并且正确配置ipv6。这里不做ipv6配置教程,网上教程一大把,哪里搞不懂可以评论区大家探讨。这里还要注意区分ipv6的局域网ip和公网ip,局域网ipv6大多数以“fe80::”开头,而公网ipv6是以类似“2409:”开头的。我家是移动宽带,其他运营商可能开头不一样。
当你的设备成功获取到一个公网ipv6地址之后,你依然不能永远以这个ipv6地址访问自家设备,因为ipv6也是动态的,所以我们需要跟ipv4的一样,也是用动态dns。这里推荐一家我一直在用的免费ipv6dns服务商“https://dynv6.com”,相关配置教程网上搜“openwrt dynv6”、“群辉 dynv6”等相关关键字即可。
还有一个要注意的非常重要的点,必须在ipv6网络环境下才能访问ipv6的网站。也就是说,当你配置好这一切之后。你需要在有ipv6环境下才能访问家里的设备,这也是这个方案的最大的缺陷。根据我个人的使用经验,使用宽带访问时,只要路由器支持,配置正确,都可以拥有ipv6网络环境。而手机流量,绝大多数都会获取到ipv6地址。前提是开5g网络,根据我个人测试4g网络下,移动卡基本没有ipv6。
ZEROTIER
然而很多时候,就是没有ipv6网络环境,比如我公司用的企业级路由器就不带ipv6。这时候要怎么办呢?我们可以用zerotier。zerotier是一个免费的虚拟组网平台,经过配置之后,可以实现在异地,即可直接访问局域网的ip,而且大多时候会建立起P2P链接,网速可以达到家里宽带的上行速率极限。
当我在两个地方的openwrt中,都分别装了zerotier,并且在zerotier的后台中配置了Advanced如下图,“192.168.2.0/24”这是我家里的局域网,“10.147.20.1”是我家里openwrt分配到的zerotier虚拟ip,“192.168.0.0/24“是另一个地方的局域网,“10.147.20.2”是另一个地方openwrt分配到的zerotier虚拟ip。经过如此配置之后,即可实现两个局域网落彻底互通。任何一台设备都可以直接连接这两个局域网中任何设备,还有很多细节,大家自己研究,这里不做详细教程,有问题可以评论区探讨。
这里发一个你们可能遇到的问题,就是配置好zerotier之后,发现访问openwrt可以,但是不能访问局域网其他设备。需要在openwrt防火墙自定义规则中加入以下内容:
iptables -A INPUT -i zteb4ahluy -j ACCEPT
iptables -A FORWARD -i zteb4ahluy -o zteb4ahluy -j ACCEPT
iptables -A FORWARD -i zteb4ahluy -j ACCEPT
iptables -t nat -A POSTROUTING -o zteb4ahluy -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.147.20.0/24 -j MASQUERADE
将其中的“zteb4ahluy ”替换成你自己的虚拟接口名称,可以在网络-接口-设备中查看zt开头的。如下图
将其中的“10.147.20.0/24”替换成你自己的虚拟局域网网段,如下图
内网穿透(不推荐)
openwrt常用的有frp内网穿透,原理就是利用服务器进行中转。这里不多介绍
优点:配置简单
缺点:网速受服务器宽带限制、需要服务器成本
总结
基本主流的就这几种远程访问方式,这里推荐一个很好用的工具。很多时候当我们搞定了远程访问之后,我们只能访问路由设备,如果像访问家里的nas,或者家里的其他服务,总不能每个设备都搞一套远程访问吧?而且很多系统不能安装远程访问的一些功能插件。这时候我们就可以在openwrt上安装一个叫“socat”的插件,这个插件就是可以将访问到openwrt的请求,转发到局域网任何一台设备的任何一个端口,同时支持ipv4/ipv6。
有什么问题或者建议,大家评论区探讨。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~







