内网穿透
快来分享你的内容吧~
- 2025-04-22·全栈开发
2024-12-05·后端前言大家好,我是程序员 cq。之前面试鱼厂的时候,我简历上的 OJ 项目没有部署到服务器上,鱼皮大大让我部署一下,他要浏览我的网站看看都有哪些功能,我面露难色,我的 2 核 4G 服务器早就已经到期了,虽然我还有一个 2 核 2G 的服务器,但是我的这个 OJ 项目又是个微服务,还有其他的 Nacos、RabbitMQ 等中间件,根本就跑不起来。内网穿透初体验好吧,没有条件,创造条件,我直接用内网查看全文拾壹情:如果确定只有自己本机一台物理机的话,并且目的是为了让别人能够简单浏览并操作,最快最简单的方法,就是用vscode,穿透自己前端端口,穿透后端端口,前端访问后端穿透之后的公网端口,就可以了,唯一的问题就是别人第一次进入这个页面会有微软官方警告
664599分享- 2023-03-31·新媒体运营#提问# 经验 各位鱼友们,求推荐性价比高且好用的动态域名内网穿透工具,企业用的,要映射web端口和udp 协议的端口,端口数量9个左右程序员鱼皮:花生壳,natapp610分享
居然不用买云服务器,家庭宽带轻松实现内网穿透
前言 -- 大家好,我是顾。 最近入手了一台极空间 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,只要稍微配置一下,同样能实现从外网访问家庭网络,而且链路更短、性能更好。
配置 FRP 服务端和客户端实现内网穿透(Ubuntu 系统)
## 1. **下载 FRP 服务端(frps)** - 打开终端,下载最新版本的 FRP(以 0.58.1 版本为例,版本号可能需要更新,检查 https://github.com/fatedier/frp/releases 获取最新版本)。 bash ```bash wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz ``` - 解压文件: bash ```bash tar -zxvf frp_0.58.1_linux_amd64.tar.gz ``` - 进入解压后的目录: ```bash cd frp_0.58.1_linux_amd64 ``` - 确保目录中包含 frps 和 frps.ini 文件。 <img src="https://pic.code-nav.cn/post_picture/1844317623355760641/5wA2i7l6p5yMCIk6.png" alt="mlucui.png" width="100%" /> - 如果没有ini文件手动创建一个 ```bash sudo nano frps.ini ``` ------ 2. **移动文件到系统目录(可选,方便管理)** - 将 frps 和 frps.ini 移动到合适的系统目录,例如 /usr/local/frp: bash ```bash sudo mkdir /usr/local/frp sudo mv frps frps.ini /usr/local/frp/ cd /usr/local/frp ``` ------ 3. **编辑 frps.ini 配置文件** - 编辑 frps.ini 文件: ```bash sudo nano frps.ini ``` - 根据图片中的配置,写入以下内容: 这个配置是客户端连接所需要的 ```ini [common] bind_addr = 0.0.0.0 bind_port = 7000 token = token123456 heartbeat_interval = 30 heartbeat_timeout = 90 ``` - 保存并退出(Ctrl+O,Enter,Ctrl+X)。 ------ 4. **测试运行 frps** - 运行以下命令启动 frps: ```bash sudo ./frps -c frps.ini ``` - 如果启动成功,你会看到 frps 的日志输出,表明服务端正在监听 7000 端口。 - 按 Ctrl+C 停止测试运行。 ------ \5. **设置防火墙和端口** - 确保 7000 端口已开放: ```bash sudo ufw allow 7000/tcp ``` - 如果使用云服务器(如阿里云、腾讯云),需要在控制台的安全组规则中开放 7000 端口。 - 验证端口是否开放: ```bash sudo netstat -tuln | grep 7000 ``` ------ 6. **设置 frps 开机自启** - 创建 systemd 服务文件: ```bash sudo nano /etc/systemd/system/frps.service ``` - 添加以下内容: ```ini [Unit] Description=FRP Server Service After=network.target [Service] Type=simple ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini Restart=on-failure [Install] WantedBy=multi-user.target ``` - 保存并退出。 - 重新加载 systemd 配置并启用服务: ```bash sudo systemctl daemon-reload sudo systemctl enable frps sudo systemctl start frps ``` - 检查服务状态: ```bash sudo systemctl status frps ``` <img src="https://pic.code-nav.cn/post_picture/1844317623355760641/dmeYWg99MFMuBhxZ.webp" alt="41pofy.png" width="100%" /> 7. **验证服务端** - 确保服务端运行正常,检查日志: ```bash journalctl -u frps -f ``` - 如果日志显示监听 7000 端口,说明服务端已成功启动。 ------ 8. **注意事项** - **权限**:如果遇到权限问题,可以调整 frps 文件权限: ```bash sudo chmod +x /usr/local/frp/frps ``` - **安全性**:token 应妥善保管,避免泄露。 - **网络**:确保服务端 IP(49.232.210.219)可被客户端访问。 服务端配置完成后,客户端可以连接到这个服务端。 ## 2. **下载 FRP 客户端(frps)** 1. 下载仓库地址:[Releases · luckjiawei/frpc-desktop](https://github.com/luckjiawei/frpc-desktop/releases) <img src="https://pic.code-nav.cn/post_picture/1844317623355760641/D9FSysZQtPDgybie.webp" alt="ztl74i.png" width="100%" /> 2. 配置连接服务端 <img src="https://pic.code-nav.cn/post_picture/1844317623355760641/YMaoCN1uCyNoFaPy.webp" alt="" width="100%" /> 3. 启动程序 进主页启动 如果连接成功,程序不会中断,日志会显示连接状态: 如果启动失败,常见问题包括: - 配置错误:检查 frpc.ini 中的 IP、端口和 token 是否与服务端一致。 - 4. 完成配置后,内网穿透即生效。我在本机使用 Nginx 部署的项目,然后可以通过服务器公网访问。  
服务器资源不够,又想让 hr 访问网站怎么办
## 前言 大家好,我是程序员 cq。 之前面试鱼厂的时候,我简历上的 OJ 项目没有部署到服务器上,鱼皮大大让我部署一下,他要浏览我的网站看看都有哪些功能,我面露难色,我的 2 核 4G 服务器早就已经到期了,虽然我还有一个 2 核 2G 的服务器,但是我的这个 OJ 项目又是个微服务,还有其他的 Nacos、RabbitMQ 等中间件,根本就跑不起来。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/OLgVPWFWOyce0agu.webp" alt="" width="440px" /> ## 内网穿透初体验 好吧,没有条件,创造条件,我直接用内网穿透不就好了? 对于内网穿透,我之前其实用的最多的就是 natapp,网址:[https://natapp.cn/](https://natapp.cn/) 正好这个网址提供了免费的内网穿透隧道: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/RAbpGYXPrHp4fzDp.webp" alt="" width="100%" /> 我看到这里,果断白嫖,反正也不用钱,先用一下让被人能访问到才是最重要的。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/HWblCKUFqPxnsmUL.webp" alt="" width="100%" /> 我先配置下前端,先保证页面能访问到。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/5eJuw6e3chWXfsoC.webp" alt="" width="100%" /> 本地把 authToken 配置好之后,直接一键启动就好: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/Qqyr3YUQVFe4wRQx.webp" alt="" width="100%" /> 访问网站: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/IxMTrfowe3rmVKh9.webp" alt="" width="100%" /> 怎么回事,为什么会出现 <font style="color:rgb(0, 0, 0);">Invalid Host header?</font> <font style="color:rgb(0, 0, 0);"></font> <font style="color:rgb(0, 0, 0);">简单查了一下,原来是因为我把本地的 127.0.0.1 映射到 </font>`ag8qr7.natappfree.cc`,浏览器请求这个域名时,Host 头 是 `ag8qr7.natappfree.cc`,但是我本地启动的 Webpack Dev Sever 并不知道 `ag8qr7.natappfree.cc` 是可信的来源,所以直接拒绝请求了。 解决方法很简单,在 `vue.config.js` 中设置这个 Host 允许访问就好了: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/dLIx6rkS5Y4V0RMY.webp" alt="" width="100%" /> 重启后,再次访问 [http://ag8qr7.natappfree.cc](http://ag8qr7.natappfree.cc/#/) ,等待了两分钟后,终于看到页面了! <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/9lpCTpBd1f8dvDq5.webp" alt="" width="100%" /> 流程跑通之后,我本以为后面就好做了,只需要再对后端做个内网穿透就好了,但是我万万没想到,natapp 只提供了一个免费的 http 内网穿透: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/Na6UNCikYfURmIlR.webp" alt="" width="100%" /> 好好好,那我买好吧,看下价格一个月要 9 块钱。我再看下我的 2 核 2G 服务器,一年也才 46,比我的服务器还贵,而且还有流量限制。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/MRNwanAWiFKy6Y8T.webp" alt="" width="100%" /> 买个屁,我直接自己搭建一个内网穿透不就得了。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/7GAkWNqh3jf5hG7d.webp" alt="" width="227px" /> ## 自建内网穿透服务 于是我就在 github 上找 star 最多的内网穿透工具,果然找到了一个内网穿透的服务:[https://github.com/fatedier/frp](https://github.com/fatedier/frp) 还可以看到他们的官方文档:[https://gofrp.org/zh-cn/](https://gofrp.org/zh-cn/) ### 服务器搭建内网穿透服务 #### 1)下载 frps 下载链接:[https://github.com/fatedier/frp/releases](https://github.com/fatedier/frp/releases) 由于我的服务器是 AMD 架构的,所以选择了红框内的文件。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/U9UWj7SknhYSt8nu.webp" alt="" width="100%" /> 可以直接在服务器中下载这个文件 ```bash cd /www/server/frp wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz ``` #### 2)服务器解压文件 执行下面这个代码即可解压 ```bash tar -zxvf frp_0.61.0_linux_amd64.tar.gz ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/rFJjcvOZ9TGGAX7j.webp" alt="" width="100%" /> #### 3)进入 `frp_0.61.0_linux_amd64` 目录,可以看到里面的文件列表 ```bash cd frp_0.61.0_linux_amd64 ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/mKowkjlpB5fUh343.webp" alt="" width="100%" /> #### 4)启动服务 解压后什么都不用管,直接启动就好: ```bash ./frps -c frps.toml ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/MlZQiauJdJ3Smv4y.webp" alt="" width="100%" /> ### 本地启动内网穿透服务 #### 1)本地下载 frp 由于我是 mac 系统,所以我下载了第一个,如果是 Windows 系统,一般下载第二个就好。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/UUtyzwlGjg1uu0e8.webp" alt="" width="100%" /> #### 2)编辑 frpc.toml serverAddr 设置为我们刚刚服务器的 ip 地址。 localPort 设置为本地的要被代理的端口,这里我设置为本地前端端口 8080。 remotePort 设置为远程要暴露出去的端口,这里我和本地的端口都设置为 8080。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/PnG10DSQt3uoKoXh.webp" alt="" width="100%" /> #### 3)运行 frpc 服务 ```bash ./frpc -c frpc.toml ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/kPECX4psJOioRnIo.webp" alt="" width="100%" /> 此时再访问页面: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/pX8Ah9FyX87imAz9.webp" alt="" width="100%" /> 搞定,流程跑通了。 ## 使用自建内网穿透暴露服务 刚刚已经可以用服务器 ip 访问本地的前端了,现在我们只需要再代理一下后端就好了。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/8U7UkWx3P5CYY9qM.webp" alt="" width="100%" /> 后端正常启动,此时把前端的请求接口地址改为代理后的接口地址就好了: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/sY3lgXvn8SykRMj5.webp" alt="" width="100%" /> 此时再访问我们的项目: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/QOXX7AqvHvu0bK08.webp" alt="" width="100%" /> 大功告成,这样别人直接访问我们提供的 ip 地址,就可以看到我们的项目了。服务器在这中间起到的作用就只是一个转发请求,我们的 Nacos、RabbitMQ 、代码沙箱、各种微服务也都不需要在服务器上部署了。 至此,我已经可以给鱼皮大大看我的项目了(如果当时真的这么顺利就好了)。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/6hL42gve80SyLaLK.webp" alt="" width="100%" /> 在鱼皮大大要看我的项目的时候,我其实只用了 natapp 尝试了内网穿透,发现只能代理一个服务的时候已经慌了,我担心搞的时间太久,会给人的印象不好,于是我只能先让鱼皮大大看下我代码的提交记录,以此证明这个项目我是真实的扩展了很多功能。 虽然最后只提供了代码的提交记录,但是我后面还是自己尝试了搭建内网穿透服务,虽然这次别人没有看到我的项目,但是我要保证后面的面试中,可以让面试官在线浏览我的 OJ 项目。 ## frp 高级操作 ### frps 后台运行 其实刚刚大家也都能看到,我们启动服务器的内网穿透服务,是在前台运行的,一不小心就关闭了。不过我们可以使用 `systemd` 来管理我们的 frps 进程,详细文档可以看这里:[https://gofrp.org/zh-cn/docs/setup/systemd/](https://gofrp.org/zh-cn/docs/setup/systemd/) #### 1)创建 frps.service 文件 ```bash sudo vim /etc/systemd/system/frps.service ``` 写入以下内容: ```shell [Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /path/to/frps -c /path/to/frps.toml [Install] WantedBy = multi-user.target ``` #### 2)使用 systemd 命令管理 frps 服务 ```bash # 启动frp sudo systemctl start frps # 停止frp sudo systemctl stop frps # 重启frp sudo systemctl restart frps # 查看frp状态 sudo systemctl status frps ``` #### 3)设置开机自启动 ```bash sudo systemctl enable frps ``` 这样 frps 就可以实现开机自启动,而且可以在后台运行。 ### 配置控制台 在服务器的 frps.toml 中加上这两个配置即可: ```toml webServer.addr = "0.0.0.0" webServer.port = 7500 ``` 其实重启服务:`systemctl restart frps` 即可看到我们的控制台页面: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/hlYZCtAUZf9Knj7A.webp" alt="" width="100%" /> <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/kfiqLO7pZ01UgiW9.webp" alt="" width="100%" /> ### 配置域名 自建了内网穿透服务之后,虽然别人可以访问到我本地的服务了,但是访问的是 ip 地址,一点都不优雅,而且如果我的 ip 地址变了,别人也访问不了,所以我们可以配置下域名解析(如果是国内的服务器,这里的域名必须备案)。 正好 frp 支持配置域名,详细文档可以看这里:[https://gofrp.org/zh-cn/docs/examples/vhost-http/](https://gofrp.org/zh-cn/docs/examples/vhost-http/) 我这里可以带大家简单配置下。 #### 1)配置服务器的 frps.toml 增加一行配置: ```toml vhostHTTPPort = 80 ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/sOUkOwnGGtngrirp.png" alt="" width="100%" /> 修改后重启即可:`systemctl restart frps` #### 2)配置本地的 frpc.toml ```toml serverAddr = "服务器 ip" serverPort = 7000 [[proxies]] name = "frontend-http" type = "http" localIP = "127.0.0.1" localPort = 8080 customDomains = ["proxy.yourdomain.com"] ``` 配置好后,重启本地的 frpc 服务。 #### 3)配置域名解析 记录类型选择 A,主机记录填 proxy,记录值填 ip 地址即可。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/BIT0xg9bKDSSn1aZ.webp" alt="" width="100%" /> 点击确认后就配置了域名解析,直接访问这个域名就可以访问本地服务。 ### 配置 https 通过上面的那些操作,我们实现了通过域名访问服务,但是远远不够,我们正常访问的网站都有 https,所以接下来我们可以尝试配置 https。frp 也提供了 https 的配置文档:[https://gofrp.org/zh-cn/docs/examples/https2http/](https://gofrp.org/zh-cn/docs/examples/https2http/) #### 1)配置服务器的 frps.toml 修改一行配置,将 vhostHTTPPort 换成 vhostHTTPSPort ```toml bindPort = 7000 vhostHTTPSPort = 443 ``` <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/Wzfe9MzIgeNIbJFO.png" alt="" width="478px" /> #### 2)修改本地的 frpc.toml ```toml serverAddr = "你的 ip" serverPort = 7000 [[proxies]] name = "frontend-http" type = "https" customDomains = ["proxy.yourdomain.com"] [proxies.plugin] type = "https2http" localAddr = "127.0.0.1:8080" # HTTPS 证书相关的配置 crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" ``` #### 3)获取免费的 ssl 证书 我们可以在腾讯云的 ssl 证书中申请免费证书:[https://console.cloud.tencent.com/ssl](https://console.cloud.tencent.com/ssl) <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/mYvyPG8opi8Ql646.webp" alt="" width="100%" /> 点击申请后,填写要绑定的域名,然后点击提交申请,进行域名验证: <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/aDeqyYnll3x3aR4s.webp" alt="" width="100%" /> 此时我们可以看到主机记录、记录类型还有记录值。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/474AY91UAfctyc1V.webp" alt="" width="100%" /> 根据上面的数据配置好域名解析就可以了(注意这里的域名解析是在域名所在的云服务中配置的): <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/k8fJfYtNo271CSYt.webp" alt="" width="100%" /> #### 4)下载证书 配置完成后腾讯云点击验证域名后,再点击完成,等待片刻后就签发成功了,这时候我们再下载 ssl 证书  只需要下载 Apache 证书即可。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/KTqS9o32oM8mgXQi.webp" alt="" width="100%" /> #### 5)配置 frpc 的证书 将证书放到 frpc.toml 所在的文件夹即可(注意文件名要和 frpc.toml 配置的对应上): <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/oQCLjzQCd1MSdQrc.webp" alt="" width="100%" /> 此时重启 frpc 服务,访问域名即可查看到 https 的服务。 ## 总结 至此,我们搭建好了一个内网穿透服务,而且还可以配置域名和 https,如果自己的服务器资源不够的话,确实可以搭建一个内网穿透服务,保证自己在求职时面试官可以在线浏览我们的网站。 不知道大家还有哪些内网穿透的工具,欢迎大家在评论区分享。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/myxiq9uDQ831D2dZ.webp" alt="" width="259px" />
基于FRP+阿里云轻量服务器实现内网穿透
### 第一步:在阿里云服务器上配置Frp服务端 #### 1. 安装Frp服务端 1. **下载Frp**: - 首先,在阿里云服务器上下载Frp。进入[Frp的GitHub releases页面](https://github.com/fatedier/frp/releases),下载适合你的系统版本(通常选择Linux版本)。 - 或者直接在阿里云服务器上执行以下命令来下载并解压: ```bash wget https://github.com/fatedier/frp/releases/download/v0.39.1/frp_0.39.1_linux_amd64.tar.gz tar -zxvf frp_0.39.1_linux_amd64.tar.gz cd frp_0.39.1_linux_amd64 ``` > 注意!服务端是frps! > 注意!服务端是frps! > 注意!服务端是frps! 2. **配置Frp服务端**: - 编辑`frps.ini`配置文件: ```text [common] # Frp服务端的监听端口 bind_port = 7000 # Frp控制面板端口 dashboard_port = 7500 # 控制面板用户名 dashboard_user = admin # 控制面板密码 dashboard_pwd = password # 自己定义 token = ######## ``` - `bind_port` 是客户端连接到Frp服务器所需的端口,`dashboard_port`是Frp的控制面板端口,可以在浏览器中访问查看连接状态。 - 注释必须换行写,不然会有异常导致启动失败 3. **启动Frp服务端**: - 在当前目录中运行以下命令启动Frp服务端: ```bash ./frps -c frps.ini ``` > ### 使用 `nohup` 后台运行 > > 使用 `nohup` 可以使程序在后台运行,即使关闭终端会话,程序也不会被终止。 > > ```bash > nohup ./frps -c frps.ini > frps.log 2>&1 & > ``` > - `nohup`:保持程序在后台运行。 > - `> frps.log 2>&1`:将输出日志写入 `frps.log` 文件。 > - `&`:让程序在后台运行。 > > **查看日志**:如果需要查看运行日志,可以查看 `frps.log` 文件: > ```bash > tail -f frps.log > ``` > 4. **设置阿里云安全组**: - 登录到[阿里云控制台](https://www.aliyun.com/),进入 **安全组** 设置,添加入站规则以开放以下端口: - `7000`:用于Frp客户端连接 - `7500`:用于访问Frp控制面板(可选,建议用于管理查看连接情况) - `9090`:Frp客户端隧道连接的远程端口(或自行选择的端口) > 轻量级服务器只需要打开防火墙即可 ### 第二步:在内网Ubuntu机器上配置Frp客户端 #### 1. 下载和安装Frp客户端 在内网的Ubuntu机器上,下载并解压与服务器相同版本的Frp客户端: ```bash wget https://github.com/fatedier/frp/releases/download/v0.39.1/frp_0.39.1_linux_amd64.tar.gz tar -zxvf frp_0.39.1_linux_amd64.tar.gz cd frp_0.39.1_linux_amd64 ``` > 注意!客户端是frpc! > 注意!客户端是frpc! > 注意!客户端是frpc! #### 2. 配置Frp客户端 1. **编辑客户端配置文件**`frpc.ini`: - 在客户端目录中创建并编辑`frpc.ini`,按以下配置: ```text [common] # 你的阿里云服务器公网IP server_addr = 阿里云服务器IP # 与服务端一致的连接端口 server_port = 7000 [web] type = tcp # 本地内网应用端口(如Web服务) local_port = 8080 # 公网访问端口(设置为之前在阿里云开放的端 remote_port = 9090 ``` - `local_port`是需要暴露的本地服务端口,例如内网的Web服务使用8080端口。 - `remote_port`则是阿里云服务器上的公网端口,访问该端口将会自动转发到内网机器上的`local_port`。 - 注释必须换行写,不然会有异常导致启动失败 2. **启动Frp客户端**: - 在内网Ubuntu机器上启动Frp客户端,执行: ```bash ./frpc -c frpc.ini ``` - 启动后,Frp会将阿里云服务器的`9090`端口流量转发到内网Ubuntu机器上的8080端口。 ### 第三步:测试和验证 1. **访问内网服务**: - 在外网环境下,通过访问 `http://阿里云服务器IP:9090` 测试连接。如果配置无误,应该可以正常访问内网Ubuntu机器的8080端口服务。 2. **查看Frp控制面板(可选)**: - 在浏览器中访问 `http://阿里云服务器IP:7500`,使用之前设置的用户名和密码登录,可以查看Frp客户端连接状态和流量情况。 ### 第四步:设置Frp自启动(可选) 为方便起见,可以在内网Ubuntu机器上设置Frp客户端开机自启动。 1. **创建Systemd服务**: 在`/etc/systemd/system/`目录下创建`frpc.service`文件: ```bash sudo vim /etc/systemd/system/frpc.service ``` 2. **添加以下内容**: ```text [Unit] Description=Frp Client Service After=network.target [Service] Type=simple # 启动前等待15秒 ExecStartPre=/bin/sleep 15 ExecStart=/path/to/frpc -c /path/to/frpc.ini Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target ``` 将`/path/to/frpc`和`/path/to/frpc.ini`替换为Frp客户端程序和配置文件的实际路径。 3. **启动并启用服务**: ```bash sudo systemctl daemon-reload sudo systemctl start frpc sudo systemctl enable frpc ``` ### 可能遇到的问题 1. **端口未开放**:确保阿里云安全组配置中已开放所需端口。 2. **防火墙问题**:检查Ubuntu内网机器上的防火墙规则,确保8080端口开放。 3. **Frp版本不兼容**:确保客户端和服务端Frp版本一致。 4. **客户端端(frpc)启动异常**:服务端(frps)必须先开启,客户端(frpc)再开启! ### 多个端口映射的配置 以下是一个示例,展示如何配置多个不同的端口映射: ```text [common] server_addr = 阿里云服务器IP # 你的阿里云服务器公网IP server_port = 7000 # 与服务端一致的连接端口 # 第一个端口映射(如Web服务) [web] type = tcp local_port = 8080 # 本地Web服务端口 remote_port = 9090 # 公网访问端口 # 第二个端口映射(如SSH服务) [ssh] type = tcp local_port = 22 # 本地SSH服务端口 remote_port = 9022 # 公网访问端口 # 第三个端口映射(如数据库服务) [database] type = tcp local_port = 3306 # 本地数据库服务端口 remote_port = 9033 # 公网访问端口 # 添加更多的端口映射 # [服务名称] # type = tcp # local_port = 本地服务端口 # remote_port = 公网访问端口 ``` ### 配置说明 - **每个映射块(如 `[web]`、`[ssh]` 等)使用不同的名称**。名称是唯一的,可以根据具体服务自定义。 - **`type`** 指定传输类型,`tcp` 用于普通 TCP 连接,`http` 或 `https` 可用于 HTTP/HTTPS 代理服务。 - **`local_port`** 是内网中实际服务的端口,比如本地的 Web 服务可能运行在 `8080` 端口,而 SSH 服务运行在 `22`端口。 - **`remote_port`** 是对应的公网端口。要在阿里云服务器上开放这些端口,以便外网可以访问。 ### 重启 Frp 客户端 保存配置文件后,启动 Frp 客户端,多个端口映射将自动生效: ```bash sudo systemctl restart frpc.service ``` - 该命令需要设置好开机自启步骤,才能生效 ### 测试访问 - 通过 `http://阿里云服务器IP:9090` 访问本地的 8080 端口服务。 - 通过 `ssh 用户名@阿里云服务器IP -p 9022` 访问内网机器的 SSH 服务(端口 22)。 - 通过 `阿里云服务器IP:9033` 访问内网机器的数据库服务(端口 3306)。 ### 总结 通过上述配置,你的阿里云服务器和内网机器通过Frp连接,成功实现了内网穿透。使用`http://阿里云服务器IP:9090`即可访问内网机器上8080端口的服务。 在 `frpc.ini` 配置文件中,你可以通过添加多个配置块实现多个端口的映射。每个映射可以定义一个 `[代理名称]`块,其中指定 `local_port`(内网端口)和 `remote_port`(映射到公网的端口)。
#提问# 经验 各位鱼友们,求推荐性价比高且好用的动态域名内网穿透工具,企业用的,要映射web端口和udp 协议的端口,端口数量9个左右
