Lucky
快来分享你的内容吧~
居然不用买云服务器,家庭宽带轻松实现内网穿透
前言 -- 大家好,我是顾。 最近入手了一台极空间 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](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](https://openwrt.org/zh/start))是一种专门为路由器等网络硬件设备设计的操作系统。路由器原有的固件通常功能非常简单,是被厂商严格限制住的。它只允许你进行一些基础操作,比如设置无线密码或查看连接设备,你无法自由地添加新的功能或修改系统的底层运行方式。 OpenWrt 则是一个针对嵌入式设备的 Linux 操作系统。安装了 OpenWrt 之后,我们就能获得对路由器内部的完全控制权限。这样我们可以对路由器安装各种插件,比如广告屏蔽,流量监控,挂载网盘、内网穿透等等。  OpenWrt 使得我们的路由器有强大的扩展性和定制能力。不过国内出厂搭载OpenWrt 系统的很少,基本上都是基于这个系统定制魔改的,所以市面上也出现了很多刷机的,有些发烧友们也整理出了市面上可以刷机的路由器:[https://mao.fan/select](https://mao.fan/select) 当然,如果家里只是普通上网需求,用普通的路由器也能满足,但是必须要支持开启防火墙,端口转发等功能,如果防火墙还能做到只开放某个端口,或者根据规则进行限制,那会更好了。因为一旦你拥有了公网 IP,家里的网络就直接暴露在公网环境中,所有设备都处在可被访问的状态。如果没有必要的安全措施,有可能就会被攻击。因此,必须确保路由器具备可靠的防火墙能力,能够对外部流量进行过滤和限制,可以避免你的设备直接当成靶子了。 检测 -- 全部设置完成之后,我们就可以检测一下了~ 首先我们看下 NAT 是否是全锥形 NAT,也就是 NAT1 ,打开上面的检测网站:[https://mao.fan/mynat](https://mao.fan/mynat) ,然后关闭所有的代理,点击检测:  哈哈完美~ 说明我的网络能够直接被外网访问了,下面来测试下: 在路由器管理页面——端口转发(不同路由器叫法可能不同),设置一下外部端口,以及要转发到的内网地址和内网端口,如果你的路由器还带有防火墙功能,还需要在防火墙中放行同样的端口,否则外部流量会被直接拦截,端口转发也无法生效。 不过需要注意的是,端口并不是随便填就行的。像 80、443、8080这些常见的 Web 服务端口,很多运营商都会默认做限制,外部访问往往会被屏蔽,导致你在家里搭建的服务根本无法从公网访问。所以在端口转发时,最好避开这些敏感端口,选择一些不常被限制的高位端口,会更稳定、更容易成功。   配置完成后,来自公网的访问就能够直接地被转发到你家内部的设备上。我们打开浏览器看下:  成功了,说明公网 IP 生效了。 ### 测速 另外我们可以测测这个宽带的公网IP的速度如何,我们在 NAS 的 Docker 里安装下iperf3,他是一个带宽的测速工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。  注意需要在路由器中配置下端口转发,`5201`转发到 NAS 的局域网IP:5201。 然后在我们的电脑上运行: ```properties 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 支持很多平台的域名,这里我选择腾讯云。  可以直接在 [腾讯云域名注册](https://console.cloud.tencent.com/domain) 购买一个你喜欢的域名。  购买完成后需要在腾讯云的[访问管理](https://console.cloud.tencent.com/cam/capi)里获取腾讯云的 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 官网](https://zerossl.com/) 并登录。 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](https://nas.xxx.com:20000),就可以访问到NAS 的设置页面。而且我们在地址栏的前面可以看到,是有锁的,说明是开启了 SSL 了。  ### 接入 CDN 防护 目前的域名后面总是有个端口,太不优雅了,而且这个地址也是没有任何防护功能的,会直接暴露家庭公网 IP 的地址,如果被不怀好意的人看到,总想要试上几试,网络直接被攻击了。 因此我们可以接入个 CDN,正好前些日子我领了个腾讯云 EdgeOne 的码,我就直接接入这个域名了。打开[https://console.cloud.tencent.com/edgeone/analytics/waf-security](https://console.cloud.tencent.com/edgeone/analytics/waf-security) 添加站点。  选择一个套餐,因为我是免费领取的,所以直接选中这个套餐。  然后选择接入模型和加速区域,免费套餐可以选择“全球可用区”。  然后添加要加速的网站,这里我选择 [AI 零代码应用生成平台教程](https://www.codefather.cn/course/1948291549923344386) 这个项目,我刚学完这个项目,拿来部署试试手。这个项目我是部署在极空间 Linux 虚拟机里的,添加到 EO 前,需要先在 Lucky 的Web 服务里添加子规则,类型为反向代理,前端地址填写源站子域名,后端地址填写项目的内网地址,然后点击添加。  回到 EdgeOne 里,加速域名这里填写了ai.xxx.com,在源站配置里填写刚刚在 Lucky 里添加的子域名,回源协议选择`HTTPS`,回源端口填写 DDNS 里的端口,我这里写 20000,回源 HOST 头选择使用源站域名,然后点击下一步进行创建。  然后会在部署中,稍等几分钟,可以看到已经生效了。  接下来我们配置 Https,直接申请免费的证书。  现在等待申请证书,大概 5 分钟左右,免费证书就下来了。  现在打开我们的加速域名,成功~ 简直完美。  内网穿透 ---- 现在解决了从外网访问家庭内网的需求了,那么如果我想用公司的网络进行内网穿透怎么办了,比如我们的业务中可能会涉及到支付,支付回调需要公网地址,现在市面上有很多的内网穿透工具,但是都有限制,比如一个套餐只能设置一个内网端口,或者连接数也有限制等等。  其实我们也可以用开源的内网穿透工具,github 上有个 star 数比较多的:[https://github.com/fatedier/frp](https://github.com/fatedier/frp),这个用的人比较多,功能也很成熟,我们可以根据他们的文档进行搭建,[https://gofrp.org/zh-cn/](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`。 ```properties # 服务端监听地址(必填) # 一般保持为 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](https://github.com/fatedier/frp/releases) 根据的电脑的系统,下载对应的软件,然后编辑下客户端的配置文件: ```properties # ----------------------------------------------------------------------------- # 通用配置 # ----------------------------------------------------------------------------- # 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 ```bash ./frpc -c frpc.toml ```  然后我们打开刚刚配置的域名,可以看到后端已经可以访问了~  ### frp 控制台 其实在刚才的`frps.toml`里已经配置了控制台的端口和相关参数: ```bash webServer.addr = "0.0.0.0" webServer.port = 7500 # 管理面板端口 webServer.user = "admin" # 管理员账号 webServer.password = "xxxxxxxxx" # 管理员密码 webServer.pprofEnable = false # 性能分析工具,一般不需要开 ``` 我们只需要在 Lucky 的 Web 服务里再新建一条子规则,后端端口指定为 内网IP:7500,服务类型为反向代理。配置完成后打开刚刚填写的子域名,输入 frps 配置文件里的账号密码,就可以看到管理页面了,里面列出了每个内网服务的网络数据。  这里得提一下cq写的 [服务器资源不够,又想让 hr 访问网站怎么办](https://www.codefather.cn/post/1864580261620547586) ,这篇文章的 frp 用法写的比较详细,大家可以参考下~ ### 结语 到这里,一套基于家庭宽带的公网IP服务+内网穿透实现就算完整跑通了。从了解国内常见的 NAT 类型、确认自己的宽带是否具备公网 IP,然后申请,再到配置光猫和路由器的拨号方式,最后利用 Lucky 做反向代理和域名访问,我们把原本需要云服务器才能实现的功能搬进了家里,可以让 NAS 上的各个服务直接从公网访问。 虽然这个文章已经能满足大多数用户的需求,但是如果你的宽带没有公网 IPv4,导致以上方式无法直接使用。但这个并不意味着你就无法远程访问家里的 NAS 或服务。现在的宽带都默认配置了公网的 IPv6,只要稍微配置一下,同样能实现从外网访问家庭网络,而且链路更短、性能更好。

