前言
大家好,我是顾。
最近入手了一台极空间 NAS,主要原因是手机存储空间快不够用了,想把不常用的照片、视频这些文件都转移到 NAS 上,顺便释放点手机空间。NAS 的全称是 Network Attached Storage(网络存储器),简单理解就是一台可以存放数据、并支持通过网络远程访问的存储服务器。像百度网盘、阿里云盘这类网盘,其实也算是广义上的 NAS。
不过现在大家提到 NAS,更多指的是“私有云”——一台完全属于自己的本地化存储设备。NAS 相比于网盘而言,基础的功能是相同的,优势就是彻底摆脱了传输速度的限制,也不用担心一些视频被和谐了。
NAS
NAS 的本质上也是一个小型的服务器,我买极空间也是看中了它的 Docker 能力,可以部署运行一些服务或工具。目前主流的 NAS 品牌有威联通和群晖,极空间和绿联。前两者也是老牌的 NAS 了,系统比较稳定,上手难度高,适合极客玩家;后两者是国内最近新出的 NAS 品牌,上手容易适合小白,考虑到预算只有两千多,而且不想折腾太复杂的系统,所以高价且偏专业的威联通、群晖就先排除了。极空间 Z4Pro 在综合表现和体验也相对好一点,所以我入手了性价比更高的极空间 Z4Pro。
当我入手了 NAS 之后,才发现拥有一个属于自己的私人网盘简直太爽了。公司和家里的电脑可以随时互传文件,再也不用发微信文件传输助手;还能直接把 NAS 当成 BT 下载器,挂着就能下电影,成为家庭影视库;手机的相册也能自动备份,再也不用担心照片丢失。它是个 4 盘位的,我先装了一块 4TB 硬盘,对目前的使用场景来说已经完全够用了。
然而,上面提到的这些,其实还只是 NAS 的一些基础功能,NAS 本质上其实就是一台小型服务器——不仅能存储文件,还能运行服务、安装一个 Linux 虚拟机直接当服务器使用,或者直接使用 Docker 快速部署一些开源的镜像。NAS 提供了图形化的容器管理,可以很方便的运行一些服务,比如 Lucky,宝塔,Alist,个人博客、个人图床、私人影院 等,其中比较实用的还是 Lucky,可以轻松地实现反向代理,以及通过域名 + Https 的方式使用外网访问家庭NAS里服务,甚至可以连接家庭局域网的任何服务 ~ 具体的方法我后面再说。
我的 NAS 还支持虚拟机的功能,可以安装 Windows、Linux 操作系统等,我安装了三个虚拟机,一个是iStore,用来替代家里的路由器的功能,实现旁路由,可以解锁更多的功能,一个是 Windows10,用来跑些脚本程序,还有个是 CentOS,现在是当我的家庭服务器来使用,我在上面放上了一些 web 网站和数据库,Redis 啥的,这样就可以节省云服务器每年的费用了,相比于云服务,系统配置也比较高,而且带宽用的是家庭宽带,相比与腾讯云阿里云的这些小水管带宽,速度那也是没的说 ~
拥有了这么多的服务和搭建的网站,那么问题来了,如何在外面,比如在公司或者地铁上,也能够访问我家里的NAS 上的服务呢?这就涉及到网络环境的核心概念了。
宽带网络的介绍
IP 地址和域名
首先介绍下什么是 IP 地址,这大家应该都知道。整个互联网可以看做是一个城市,里面的每一台设备(比如电脑、手机、NAS)都是一个“住户”。 IP地址,就是每个住户在这个网络城市里的唯一门牌号。有了这个门牌号,所有的请求、数据传输才知道应该从哪里出发,要送到哪里去。 例子: 192.168.1.1 就是一个典型的IP地址,我们可以在家里的路由器里看到很多类似这样的地址,它们分配给了手机、电脑等局域网设备。但是这些纯数字非常不容易记住,所以又出现了域名,用来映射对应的 IP 地址,访问一个网站,比如编程导航,只需要输入codefather.cn 就可以了。那么IP地址和域名是怎么映射的呢?这就需要 DNS了,DNS是互联网的“地址簿”,负责将我们访问的域名转换为IP地址,这一转换的过程叫做“域名解析”, 所以DNS又称“域名解析系统”,相当于网络访问的指路牌。比如我们访问codefather.cn,首先会询问DNS服务器:codefather.cn的IP地址是什么?然后 DNS 服务器会给出一个 IP 地址的 响应,最后浏览器拿到这个IP 地址,然后才真正地向这个 IP 发起连接,打开网站首页。
公网 IP
那什么是公网 IP 呢? 现在,把你家(比如三号楼二单元1001室)比喻成一台设备,把整个小区可以看作一个家庭网络。 内网IP就像三号楼二单元1001室这个门牌号,这个号码只在你小区内部有效。快递员如果只看到这个地址,而没有小区名和路名,是找不到你家的。同样,192.168.1.1 这个地址也只在局域网内部有效,互联网上的其他设备是无法直接用这个地址找到家里设备的。 公网IP,就像是整个小区的唯一大门地址,比如“上海市静安区南京西路xxx号”,这个地址是全球唯一的,所有人都能通过这个地址找到对应的小区。所以公网 IP 是指在全世界互联网上都可以直接识别和访问的唯一地址。互联网上的所有数据交换,最终都是通过公网IP来定位的。
由于我国接入国际互联网的时间较晚,分配到的 IPv4 地址总量相对有限。在一些早期接入互联网的国家(例如美国),IPv4 地址资源相对充足,人均大概能分到 5 个 IPv4 地址;而我国人均只有约 0.24 个。这就意味着,在国内,IPv4 公网地址是非常珍贵的资源。随着手机、电脑、平板、智能家居等设备越来越多,公网 IPv4 的缺口被进一步放大。运营商无法为每个家庭甚至每个设备分配独立的公网 IPv4,因此最常见的做法就是给家庭宽带统一做 NAT。也就是说,你家路由器后面连接的所有设备,看到的“外网 IP”其实都是运营商提供的共享地址;设备发出的所有流量,都必须先经过运营商的 NAT 转换后才能访问互联网。而在 IPv4 不紧缺的国家,由于他们拥有大量的公网地址,网络运营方式也更为宽松。一个常见的副作用是:很多网络攻击(例如 DDoS 流量)往往来自海外的真实公网 IP。一方面是因为海外公网 IP 数量大、成本低,另一方面攻击者也更容易批量租用或控制这些公网设备。因此,我们在国内看到的恶意流量,有很大一部分是来自国外的 IPv4 地址段。
NAT 介绍
那么什么是 NAT 呢,它的全称是叫网络地址转换(Network Address Translation),允许多个内网设备共享一个公网IP地址,使内部网络设备能够与外部互联网通信,主要就是用来解决 IPv4 地址不足的问题。NAT 的类型主要由下面这些:
1)全锥形 NAT(Full Cone NAT):
内网设备映射出的端口是固定的,任何外部 IP 都能通过这个端口访问回你。这种类型几乎没有限制,只要知道公网 IP 和映射端口,即可直接访问。
2)受限锥形 NAT(Restricted Cone NAT):端口固定,只有你主动访问过的外部 IP,才允许再回连你。
这种类型比全锥形 NAT 严格了一些,如果想让外部访问,需要内网设备先对目标服务器发起一次通信,例如 STUN 方式。
3)端口受限锥形 NAT(Port Restricted Cone NAT):端口固定,只有你主动访问过的 “IP+端口” 组合才能回连你。
4.)对称型 NAT(Symmetric NAT):每次访问不同的外部地址时,本地映射的端口都不一样。这种类型外部完全无法主动找到你,通常可以通过第三方服务器中转(如 Tailscale/ZeroTier/Frp、向日葵、花生壳等)。
NAT 的影响
其实,NAT 类型影响最大的,就是 UDP 这种传数据的方式稳不稳定,速度快不快。特别是玩游戏、打语音电话、视频聊天这些,对网速要求高、延迟要低的场景,你的 NAT 类型越严,实际体验下来就越差。
我们拿玩游戏来说,主机玩家感觉是最明显的。不管是 PS、Xbox 还是 Switch,一看网络设置就能看到自己的 NAT 类型。这个类型越“开放”,你跟其他玩家直连的成功率就越高,匹配速度自然就快。反过来,要是 NAT 太严了,你可能就会遇到半天匹配不到人、老是掉线、游戏卡顿这些问题。有些联机游戏甚至会直接拒绝你进入多人模式。
像语音和视频通话,也逃不掉 NAT 的影响。你可能遇到过这种情况:家里 WiFi 信号明明是满格的,但微信视频老提示网络质量差,画面卡顿、声音断续。这时候,更大的原因不是 WiFi 信号的问题,而是你的 NAT 类型太严格了,变成了大家常说的 NAT4。设备间没办法直接建立稳定连接,只能靠中间服务器转接,体验自然会差很多。
最后说说 BT、PT 这种需要点对点传输的下载方式。NAT 类型的影响同样特别大。越开放的 NAT 类型,你就能连到更多的资源提供方,资源多了,下载速度自然就快。可要是你的宽带处于那种非常严格的 NAT 环境下,能直接连上的资源就会少一大截,P2P 下载速度往往就会被限制住。对那些用 NAS 来下载 BT 资源的朋友来说,这个感受会尤其深刻。
国内 NAT
目前国内的宽带网络中,大部分人的网络 NAT 类型都 是NAT3(端口受限锥形 NAT),NAT1(全锥形 NAT)类型很少。这是因为大多数的路由器默认都是 NAT3 的,并且需要带支持公网 IP。国内的三大运营商,电信的公网 IP 概率最高,其次是联通,移动宽带就别想了,大部分都是 NAT4,也就是对称 NAT,外网访问几乎不可行。https://mao.fan/mynat 这个网站可以检测网络类型,如果你没修改过路由器设置,或者使用的是联通或者移动,检测结果大概率是下面这种:
如果是在这种 NAT 的环境下,家里的设备虽然能访问外网,但外网无法主动访问你家里的设备。也就是说,你想从公司访问家里的 NAS、摄像头,都会被 NAT 挡住。
即使像电信给宽带分配的是公网 IP,听起来像是公网,但它会随时变化,而且不一定每次都能分到真正的公网地址。即便分到了公网 IP,只要重启路由器或宽带重新拨号,地址就变了,外部访问立刻中断。
公网 IP
如何判断自家家网络是否公网IPv4?
判断是否有公网 IPv4 其实并不复杂。第一步,可以先打开一个 IP 查询网站,比如 https://ip111.cn/,页面会显示你当前访问互联网时使用的外网IP。第二步,根据你家宽带的接入方式,去对应的设备后台查看 WAN 口 IP。
如果你的光猫工作在“路由模式”(也就是光猫本身负责拨号),那么就需要登录光猫后台查看 WAN 口获取到的 IP 地址;如果你的光猫是“桥接模式”(由路由器负责拨号),那就登录路由器后台查看 WAN 口 IP。只要设备后台显示的 WAN 口 IP 地址与 IP 查询网站显示的外网 IP 完全一致,就说明你家真正拿到了公网 IPv4。
之前我看到网上经常有人说:“网上能查到 IP 就说明你有公网 IP,可以直接做 DDNS 和端口转发。”这种说法并不完全准确。百度显示的确实是公网 IP,但它可能只是运营商 NAT 出去的统一出口地址,并不一定是真正分配到你家宽带的公网 IP。所以关键仍然是看路由器 WAN 口的 IP 地址,而不是单看 IP 查询网站的显示结果。只有当两个 IP 完全一致时,才说明你的宽带具备公网 IPv4,只不过这个地址通常是动态分配的,并非固定 IP(固定公网 IP 一般只提供给专线或企业用户)。
申请公网 IP
如果检测出来没有公网 IP,可以去营业厅,或者打电话给运营商客服,编一个理由,比如说装监控什么的,需要一个公网 IP,一般客服会核实宽带线路后,大概率一般都会给的,一般在几个小时之内,会为你的宽带开通公网 IP 功能。这里注意哈,大部分地区公网 IP 是免费的,不收费的,如果收费的大概率是要你办理什么专线之类的服务,直接跟客服说办理动态公网 IP 就行~
如果你的宽带所在地区或者运营商实在无法给你开通公网 IPv4,也不必纠结。多数运营商都支持原生 IPv6 公网地址,在路由器和设备支持的情况下,同样可以实现远程访问和内网穿透,只是需要考虑访问端是否具备 IPv6 网络环境。
光猫桥接
在家庭宽带安装时,运营商通常会把光猫直接设置为路由模式。也就是说,光猫不仅负责接入光纤信号,还同时承担拨号上网、分配局域网地址和管理家庭网络的工作。如果光猫自带 WiFi,那么用户甚至可以不再使用额外的无线路由器,直接连上光猫的无线信号就能上网。对于大多数家庭来说,这样的配置足够使用,三五个设备同时上网基本不会有明显问题。运营商选择这种方式,也是为了减少用户配置成本,避免用户自己保存宽带账号密码,也能让装机和售后更省心。
光猫的另一种工作方式是桥接模式。开启桥接后,光猫不再进行拨号和路由,而是把运营商下发的宽带信号直接交给用户自己的路由器处理。此时,真正的网络管理、拨号上网、端口转发等操作,全部由用户路由器来完成。这样做的好处是,公网 IP 会直接落在路由器的 WAN 口上,更适合需要远程访问、NAS、内网穿透等功能的人,也能避免光猫性能不足带来的网络卡顿或转发瓶颈。在一些网络结构复杂的环境中,让光猫只做最基础的信号转换,能让整体网络更稳定。
不过,修改光猫到桥接模式需要一定的网络知识。操作不当会直接导致无法上网,而且很多光猫的高级权限并不会对用户开放,现在网络上公开的所谓“超级管理员密码”大多数也已经失效。因此,如果你确实需要桥接模式,建议联系运营商客服或宽带师傅处理,不要自行尝试,以免误操作造成故障,最终还得等待上门维修才能恢复上网。
路由器设置
有了公网 IP 和 并且改为桥接之后,光猫就不能正常上网了,需要对我们自己的路由器进行配置,改拨号上网模式,首先需要登录路由器的后台管理地址,在上网方式改为PPPoE,然后输入宽带账号密码,拨号成功后就有网络了。
我为了解锁路由器更多的功能,还专门从咸鱼淘了一台小米 AX3600 路由器,把它刷入 OpenWrt 系统。相比普通路由器的默认系统,OpenWrt 在插件、自定义规则、防火墙、端口转发等方面都更加灵活,而且 UI 也很好看~
OpenWrt
这里简单介绍下OpenWrt吧,OpenWrt (https://openwrt.org/zh/start)是一种专门为路由器等网络硬件设备设计的操作系统。路由器原有的固件通常功能非常简单,是被厂商严格限制住的。它只允许你进行一些基础操作,比如设置无线密码或查看连接设备,你无法自由地添加新的功能或修改系统的底层运行方式。
OpenWrt 则是一个针对嵌入式设备的 Linux 操作系统。安装了 OpenWrt 之后,我们就能获得对路由器内部的完全控制权限。这样我们可以对路由器安装各种插件,比如广告屏蔽,流量监控,挂载网盘、内网穿透等等。
OpenWrt 使得我们的路由器有强大的扩展性和定制能力。不过国内出厂搭载OpenWrt 系统的很少,基本上都是基于这个系统定制魔改的,所以市面上也出现了很多刷机的,有些发烧友们也整理出了市面上可以刷机的路由器:https://mao.fan/select
当然,如果家里只是普通上网需求,用普通的路由器也能满足,但是必须要支持开启防火墙,端口转发等功能,如果防火墙还能做到只开放某个端口,或者根据规则进行限制,那会更好了。因为一旦你拥有了公网 IP,家里的网络就直接暴露在公网环境中,所有设备都处在可被访问的状态。如果没有必要的安全措施,有可能就会被攻击。因此,必须确保路由器具备可靠的防火墙能力,能够对外部流量进行过滤和限制,可以避免你的设备直接当成靶子了。
检测
全部设置完成之后,我们就可以检测一下了~ 首先我们看下 NAT 是否是全锥形 NAT,也就是 NAT1 ,打开上面的检测网站:https://mao.fan/mynat ,然后关闭所有的代理,点击检测:
哈哈完美~ 说明我的网络能够直接被外网访问了,下面来测试下:
在路由器管理页面——端口转发(不同路由器叫法可能不同),设置一下外部端口,以及要转发到的内网地址和内网端口,如果你的路由器还带有防火墙功能,还需要在防火墙中放行同样的端口,否则外部流量会被直接拦截,端口转发也无法生效。
不过需要注意的是,端口并不是随便填就行的。像 80、443、8080这些常见的 Web 服务端口,很多运营商都会默认做限制,外部访问往往会被屏蔽,导致你在家里搭建的服务根本无法从公网访问。所以在端口转发时,最好避开这些敏感端口,选择一些不常被限制的高位端口,会更稳定、更容易成功。
配置完成后,来自公网的访问就能够直接地被转发到你家内部的设备上。我们打开浏览器看下:
成功了,说明公网 IP 生效了。
测速
另外我们可以测测这个宽带的公网IP的速度如何,我们在 NAS 的 Docker 里安装下iperf3,他是一个带宽的测速工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。
注意需要在路由器中配置下端口转发,5201转发到 NAS 的局域网IP:5201。
然后在我们的电脑上运行:
iperf3 -c 公网IP -t 10
这个参数-t表示持续测试时间为 10 秒。
可以看到他的速度还是挺快的,比我的阿里云服务器的小水管带宽快的多,这个取决于你的宽带的下行速度,如果要测上行速度,可以加个-R,家里宽带的上行一般比下行小的多,上行:下行一般为1:10或者1:5左右,这个和运营商相关。
使用 Lucky 实现反向代理+域名访问
对 NAS用户来说,内网访问是最基础的功能,而如果能够玩转公网,才能使 NAS 发挥最大的价值,真正成为个人专属家庭服务器。
现在有了公网IP,如果你想在公司访问家里的 NAS,只需要在浏览器里输入:http://你的公网IP:5055看起来方法很直接,但这种做法,基本相当于把 NAS 完全暴露在互联网上,会带来很多严重隐患。首先,HTTP 协议是明文传输,任何数据都没有加密保护,一旦被截获就能直接读取,非常危险。其次,直接使用公网+端口访问,就会直接把这个服务的端口暴露在公网中,安全性差,其实最主要的问题还是 NAS 上的服务通常不止一个,每个都需要单独占用一个端口。端口数量一多,难以记住。而且更麻烦的是,大多数家庭宽带分配到的都是动态公网 IP,可能隔一段时间就会变化一次,导致你根本记不住,访问也容易失败。
为了让 NAS 能够在公网环境下安全访问,我们需要一个稳定、易用、同时具备反向代理和动态 DNS(DDNS)的工具。我给大家推荐一个非常实用的软件,叫 Lucky,它是专门面向个人和家庭用户的网络工具。
这款软件支持Windows、Linux、甚至路由器内使用插件安装。因为我的小米路由器性能不是很好,所以我把他装在了 NAS 的 Docker 里,整个流程也非常简单,一共分为 5 步,安装 Lucky -> 配置 Lucky -> 购买域名 -> 设置 DDNS -> 设置 SSL 证书 -> 设置反向代理。
安装 Lucky
打开NAS 的 Docker,搜索 Lucky。
下载完成后在本地镜像中找到,双击创建容器:
输入一个容器名称,然后配置下 CPU 和内存参数,这里 1 核 1G 就够用了
点击文件夹路径选项,将Lucky安装位置设置在NAS 的目录下,装载路径中填写/goodluck。
网络模式必须选择host,不能使用常用的 Bridge,因为是为了让 Lucky 获得与NAS 主机完全一致的网络权限和能力,从而避免复杂的端口映射和网络协议兼容问题。
其他的配置默认就可以了,点击应用,这样就安装完成了。
配置 Lucky
打开浏览器,输入 NAS 的 内网 IP 地址+16601,进入Lucky管理后台:
登录进去后,可以在左侧的设置里,设置一套新的账号密码,确保安全。
下面就是 DDNS 配置了,首先你要有一个域名,如果有了就可以跳过了。
域名购买
Lucky 支持很多平台的域名,这里我选择腾讯云。
可以直接在 腾讯云域名注册 购买一个你喜欢的域名。
购买完成后需要在腾讯云的访问管理里获取腾讯云的 API 秘钥,后面有用到。
设置 DDNS
打开 Lucky 管理页面,在左侧找到“动态域名”选项卡,并点击“添加任务”。
填写下任务名称,操作模式选择“简易模式”,DNS托管服务商选择自己域名的服务商(我这里是腾讯云),并将前面保存下来的密钥填入,然后按照自己家的公网IP类型选择 IPv4或 IPv6,获取方式选择通过接口获取,然后点击下方的添加同步记录,记录名里填写刚刚购买的域名:*.域名.com。其他全部默认,完毕后点击添加任务。
稍等一会儿~,看到提示结果为“托管商记录一致”,就说明 DDNS 设置成功了。你会看到你设置的类型、以及解析IP地址。
如果你去腾讯云域名解析后台也能看到 Lucky 自动解析的DNS记录了。
因为宽带都是动态公网 IP,当你的宽带有变化的时候,这里的记录也会实时更新的,不需要手动操作 ~
设置 SSL 证书
下面需要为自己的域名申请SSL证书。转到“SSL/TLS证书”选项卡,并点击“添加证书”。
添加方式选择ACME(用于自动申请 SSL 证书的协议),证书颁发机构选择Let's Encrypt 或者 ZeroSSL 都行,DNS 服务商选择自己域名的服务商,输入刚刚保存的密钥,然后可以选择开启 EAB 认证,这个认证主要是 ACME 协议中的一种认证机制。简单来说,EAB 就是一种身份验证凭证,用于把你的 ACME 客户端(比如你用的 Lucky、acme.sh、Certbot)和你在 证书颁发机构(CA)的真实账户绑定在一起。如果刚刚选择的是 ZeroSSL,应该是要必须开启的。下面是申请获取的步骤:
1)访问 ZeroSSL 官网 并登录。
2)点击侧边栏的 "Developer"。
3)点击 "EAB Credentials"。
4)点击 "Generate"。
5)你会得到 EAB KID 和 EAB HMAC Key。
6)把这两串字符复制到 Lucky 的对应输入框里即可。
把选项卡往下拉,如果前面的DDNS是使用的公网IPV4,那么需要开启使用IPv4网络申请证书、DNS查询强制IPV4、DNS查询仅使用TCP三项,这个是在申请证书时会验证服务器IP的,如果不对就会申请失败。其他的配置保持默认就好了,最后点击添加。
然后就是正在申请中了,证书申请需要稍等一段时间,大概几分钟。成功后就会出现 ACME 信息,颁发时间和过期时间。每张免费SSL证书的有效期为三个月,到期前lucky会自动续期的,不需要我们手动续期。
设置反向代理
选择Web 服务菜单,点击“添加 Web 服务规则”
填写下规则名称,规则开关开启,操作模式选简易模式,监听类型可以根据你是公网 IPv4还是IPv6来确定。监听端口可随意,不要使用80和443端口就行了,建议使用10000以上的端口号,只要和局域网中其他服务端口不冲突就行,防火墙自动放行开启。特别注意,这里一定要开启TLS,否则无法使用HTTPS。
基本信息填完后,然后点击“添加Web服务子规则”。这个“子规则”,就是你从外网访问的某一个服务,比如说 NAS 管理页面,或者部署在 Docker 上的一个服务等等。首先填写下区分服务的子规则名称,规则开关开启。服务类型选择“反向代理”。 前端地址需要填写你想要从外网访问该服务的二级域名,比如我这个子规则是分配给NAS管理页面的,那我就写 nas.xxx.com。 而后端地址则需要写你访问该服务的内网IP+端口号,注意前面需要加http://,其他选项保持默认即可,最后完成后点击“添加 WEB 服务规则”。
这里有个选项需要注意下,就是安全设置,如果你的网站需要有个身份认证才能访问,可以开启这个选项。在开启之后,从外网访问时,需要先输入账号和密码,如果你的网站是没有账号密码登录的,开启这个是很有必要的。
然后你可以参照上面的步骤依次添加其他的服务,有几个服务,就开启几个子规则就可以了。添加完成后,可以在规则列表这里看到当前页面的访问IP数和连接数,还有访问日志等等。
设置Https重定向
目前配置的是没有 Https 重定向功能的,也就是你打开 https://nas.xxxx.com:20000 是正常的,但是打开http://nas.xxxx.com:20000 就会报 502,Lucky 里也可以配置 Http 重定向到 Https 的功能。
先创建一条Web服务规则,注意这条新的Web服务规则不要启用TLS,然后选择定制模式,在默认子规则中选择Web服务类型为重定向,这条新规则的监听端口填和你https同样的端口,也就是刚刚配的 20000,默认子规则中的默认目标地址填写 https://{host}:{port}{path}{args},注意哈,两条规则的监听类型要完全一致,不能一条监听 tcp6 而另外一条监听 tcp。
端口转发
全部设置好以后,我们还需要把反向代理的端口20000通过路由器进行端口转发,才能够正常从外网访问。和正向代理不同,现在我们只需要映射一个反代端口就可以,不用把每个服务单独的内网端口再映射出去,注意内网端口和外网端口号要保持一致。
如果你设置了防火墙,注意也要把对应的端口进行放开。
把端口进行转发之后,我们就可以从外网访问了。比如我现在输入https://nas.xxx.com:20000,就可以访问到NAS 的设置页面。而且我们在地址栏的前面可以看到,是有锁的,说明是开启了 SSL 了。
接入 CDN 防护
目前的域名后面总是有个端口,太不优雅了,而且这个地址也是没有任何防护功能的,会直接暴露家庭公网 IP 的地址,如果被不怀好意的人看到,总想要试上几试,网络直接被攻击了。
因此我们可以接入个 CDN,正好前些日子我领了个腾讯云 EdgeOne 的码,我就直接接入这个域名了。打开https://console.cloud.tencent.com/edgeone/analytics/waf-security 添加站点。
选择一个套餐,因为我是免费领取的,所以直接选中这个套餐。
然后选择接入模型和加速区域,免费套餐可以选择“全球可用区”。
然后添加要加速的网站,这里我选择 AI 零代码应用生成平台教程 这个项目,我刚学完这个项目,拿来部署试试手。这个项目我是部署在极空间 Linux 虚拟机里的,添加到 EO 前,需要先在 Lucky 的Web 服务里添加子规则,类型为反向代理,前端地址填写源站子域名,后端地址填写项目的内网地址,然后点击添加。
回到 EdgeOne 里,加速域名这里填写了ai.xxx.com,在源站配置里填写刚刚在 Lucky 里添加的子域名,回源协议选择HTTPS,回源端口填写 DDNS 里的端口,我这里写 20000,回源 HOST 头选择使用源站域名,然后点击下一步进行创建。
然后会在部署中,稍等几分钟,可以看到已经生效了。
接下来我们配置 Https,直接申请免费的证书。
现在等待申请证书,大概 5 分钟左右,免费证书就下来了。
现在打开我们的加速域名,成功~ 简直完美。
内网穿透
现在解决了从外网访问家庭内网的需求了,那么如果我想用公司的网络进行内网穿透怎么办了,比如我们的业务中可能会涉及到支付,支付回调需要公网地址,现在市面上有很多的内网穿透工具,但是都有限制,比如一个套餐只能设置一个内网端口,或者连接数也有限制等等。
其实我们也可以用开源的内网穿透工具,github 上有个 star 数比较多的:https://github.com/fatedier/frp,这个用的人比较多,功能也很成熟,我们可以根据他们的文档进行搭建,https://gofrp.org/zh-cn/。它的原理很简单:通过服务端和客户端之间建立一条长期、安全的连接,把家里或公司的电脑上的服务映射到公网,让外部可以直接访问。
它这个分为两个程序,一个是服务端(frps),一个是客户端(frpc)。客户端负责把你家网络中的设备连接上去,而服务端负责真正地对外提供访问入口。正因为服务端需要在公网能够被访问,它必须部署在一台具有固定公网 IP 的服务器上。这也就是为什么很多教程会要求你额外购买一台云服务器,把 frps 部署上去,然后再让家里的设备作为客户端连接过去。
这里就产生了一个问题:既然家里的 NAS 也能被公网访问,为什么还要多买一台服务器?而且服务器本身也是成本,每年续费也不便宜。NAS 本身就是一台小型服务器,支持 Docker、虚拟机等,而且现在宽带为我分配的就是公网 IP。既然这样,完全可以直接把 frps 运行在 NAS 上,让它直接承担“服务端”的角色。这样一来,就不再需要额外购买一台云服务器,公网访问入口就是我家宽带的公网 IP, 简直完美~
NAS 搭建 frps 服务
老规矩,直接进行docker,搜索 frps,看看有没有这个镜像,找一个 star 数最多的,进行下载。
下载好之后添加到容器里,先把frps 的配置文件/frp/frps.toml映射到本地。
网络还是选择 host 模式。
点击命令,在自建分类里输入'/bin/sh' '-c' '/frp/frps -c /frp/frps.toml' 用来指定配置文件运行。
其他的配置默认就可以,最后点击应用完成创建。
在启动前,我们需要在刚刚映射的目录下新建个配置文件frps.toml。
# 服务端监听地址(必填)
# 一般保持为 0.0.0.0,表示监听所有网卡
bindAddr = "0.0.0.0"
# frpc 客户端连接 frps 的主端口(必填)
bindPort = 7000
# QUIC 协议监听端口(可选,不需要可以关掉)
quicBindPort = 7000
# HTTP/HTTPS 虚拟主机端口,用于反代 Web 服务(可选,但如需 Web 访问则必填)
vhostHTTPPort = 20080 # 默认 80 可能被运营商封禁,所以用高位端口
vhostHTTPSPort = 20443 # 默认 443 也常被限制
# 连接性能优化相关配置(可选)
transport.maxPoolCount = 2000
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60
transport.tcpKeepalive = 7200
# 是否强制启用 TLS(可选)
# 若为 true,客户端也必须开启 TLS 才能连上
transport.tls.force = false
# ============================
# frps 管理面板(可选)
# ============================
webServer.addr = "0.0.0.0"
webServer.port = 7500 # 管理面板端口
webServer.user = "admin" # 管理员账号
webServer.password = "xxxxxxxxx" # 管理员密码
webServer.pprofEnable = false # 性能分析工具,一般不需要开
# ============================
# 日志配置(推荐填写,便于排查问题)
# ============================
log.to = "/frp/frps.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false
# ============================
# 客户端认证(必填)
# ============================
auth.method = "token"
auth.token = "xxxxxxxxxxxxxxxxxxx" # 服务端和客户端必须一致,否则无法连接
# ============================
# 端口控制(可选但强烈建议配置)
# 限制客户端可映射的端口范围,提升安全性
# ============================
allowPorts = [
{ start = 10001, end = 50000 }
]
# 限制单个客户端最大端口映射数量(可选)
maxPortsPerClient = 8
# UDP、NAT 分析相关优化参数(可选)
udpPacketSize = 1500
natholeAnalysisDataReserveHours = 168
把frps端口暴露出去
在路由器的端口转发里,新建两条规则,一个是frpc 客户端连接 frps 的主端口,这个是必须的,还有个是管理端,这个不需要也可以。
在 Lucky 的 Web 服务里新建一条子规则,前端地址填写内网穿透的子域名,后端地址填写 Frp 服务器对外暴露的访问端口,外部用户可以通过此端口访问我们的电脑服务。
本地启动 frpc 客户端
首先去 Github 的下载页面:https://github.com/fatedier/frp/releases 根据的电脑的系统,下载对应的软件,然后编辑下客户端的配置文件:
# -----------------------------------------------------------------------------
# 通用配置
# -----------------------------------------------------------------------------
# Frp 服务端(Server)的 IP 地址,填写为宽带公网 IP
serverAddr = "xxx.xxx.xxx.xxx"
# Frp 服务端监听端口,与 Frp 服务器配置保持一致。
serverPort = 7000
auth.method = "token"
# 身份验证 Token,与 Frp 服务器配置的 auth.token 一致。
auth.token = "xxxxxxxxx"
# -----------------------------------------------------------------------------
# Web 管理界面 (可选)
# -----------------------------------------------------------------------------
# 客户端本地状态页面的监听地址和端口。
webServer.addr = "127.0.0.1"
webServer.port = 7400
# -----------------------------------------------------------------------------
# 代理配置
# -----------------------------------------------------------------------------
[[proxies]]
# 代理名称。
name = "面试鸭后端代理"
# 代理类型,例如 tcp, udp, http, https。
type = "tcp"
# 本地服务 IP 地址。通常为 127.0.0.1。
localIP = "127.0.0.1"
# 本地服务运行的端口。
localPort = 8013
# Frp 服务器对外暴露的端口,用户通过此端口访问,并且我们需要把这个端口在 Lucky 里配置反向代理。
remotePort = 28001
# -----------------------------------------------------------------------------
# 传输配置 (可选)
# -----------------------------------------------------------------------------
# 启用数据加密。
transport.useEncryption = true
# 启用数据压缩。
transport.useCompression = true
然后运行 frpc
./frpc -c frpc.toml然后我们打开刚刚配置的域名,可以看到后端已经可以访问了~
frp 控制台
其实在刚才的frps.toml里已经配置了控制台的端口和相关参数:
webServer.addr = "0.0.0.0"
webServer.port = 7500 # 管理面板端口
webServer.user = "admin" # 管理员账号
webServer.password = "xxxxxxxxx" # 管理员密码
webServer.pprofEnable = false # 性能分析工具,一般不需要开我们只需要在 Lucky 的 Web 服务里再新建一条子规则,后端端口指定为 内网IP:7500,服务类型为反向代理。配置完成后打开刚刚填写的子域名,输入 frps 配置文件里的账号密码,就可以看到管理页面了,里面列出了每个内网服务的网络数据。
结语
到这里,一套基于家庭宽带的公网IP服务+内网穿透实现就算完整跑通了。从了解国内常见的 NAT 类型、确认自己的宽带是否具备公网 IP,然后申请,再到配置光猫和路由器的拨号方式,最后利用 Lucky 做反向代理和域名访问,我们把原本需要云服务器才能实现的功能搬进了家里,可以让 NAS 上的各个服务直接从公网访问。
虽然这个文章已经能满足大多数用户的需求,但是如果你的宽带没有公网 IPv4,导致以上方式无法直接使用。但这个并不意味着你就无法远程访问家里的 NAS 或服务。现在的宽带都默认配置了公网的 IPv6,只要稍微配置一下,同样能实现从外网访问家庭网络,而且链路更短、性能更好。
苏ICP备16040035号-5