摘要:作者:陌溪 陌溪的学习笔记:note.moguit.cn 大家好,我是 陌溪 。...
作者:陌溪
陌溪的学习笔记:note.moguit.cn
大家好,我是 陌溪 。
上篇文章我们讲到,我是如何利用小主机搭建了 PVE 虚拟系统,并安装 CentOS 镜像,搭建自己的专属服务器,在里面部署 蘑菇博客 ,支持在本地局域网进行访问。
文章发布后,也受到了官方的推荐,不少小伙伴纷纷评论留言,想了解如何被外网访问到,本篇文章将会介绍几种被外网访问的方式:
首先,先看一下陌溪家里的网络拓扑图,光猫放在楼下老哥这里。通过光猫拨号上网,再连接出两台路由器,并组成两个局域网。
陌溪家是通过路由器中的 DHCP 服务器功能,划分出了一个子网: 192.168.10.1~ 192.168.10.199 。家中只要有设备连接上了路由器,就会自动从这个网段分配一个IP地址,让其能愉快的进行网速冲浪。
通过小主机的 PVE 系统,安装蘑菇的:开发环境、测试环境、演示环境、线上环境、 NAS 系统和 Win11系统【没有谁能拒绝 all in one 吧】。
但是,不少的小伙伴期望能支持小主机在公网进行访问,也有不少小伙伴在留言了一些解决方案:
使用 Frp 搭建内网穿透
使用 Ngrok 免费隧道
申请公网IP
使用 WireGuard、ZeroTier 组网
下面,将会讲解如何让我们搭建的小主机能通过公网进行访问。
因为公网IP不好申请,我们先介绍的是对小白相对友好的一些方案。其中有些方法需要自己有一台云服务器,用于提供公网IP和流量转发。并且对配置要求也不高,只需要带宽不是小水管就行。
使用FRP搭建内网穿透
Frp简介
首先,我们使用 Frp 来搭建我们的内网穿透服务。 Frp 是一款在 Github 上非常热门的项目,使用 Golang 语言开发,目前已经有 82k 的 star 数,社区也很活跃。
Github地址:
https://github.com/fatedier/frp 文档地址:
https://gofrp.org/zh-cn/docs/Frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP 、 UDP 、 HTTP 、 HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有 公网IP 节点的中转暴露到公网。
通过在具有公网 IP 的节点上部署 Frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性:
多种协议支持:客户端服务端通信支持 TCP 、 QUIC 、 KCP 和 Websocket 等多种协议。
TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
代理组间的负载均衡。
端口复用:多个服务可以通过同一个服务端端口暴露。
P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
客户端插件:提供多个原生支持的客户端插件,如静态文件查看、 HTTPS/HTTP 协议转换、 HTTP 、 SOCKS5 代理等,以便满足各种需求。
服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。
frp 主要由两个组件组成:客户端( frpc ) 和 服务端( frps )。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps , frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。
如何搭建Frp
首先就需要准备好一台云服务器,用于提供 公网IP 和流量转发。至于购买哪家的云服务产品,本着能省则省的原则,这个当然是哪家便宜用哪家呢。
陌溪在网上冲浪的时候,发现华为云目前提供了 2核2G 2M 的机器,只需要 38元 ,已经是目前大厂云厂商里最便宜了,相当于购买了一个固定的公网IP。
华为云优惠地址:http://mrw.so/5UiYML
其次是腾讯云,提供的是 2核2G 4M 的带宽,一年99元,也算比较实惠的了,带宽更大,网站访问起来更快。
腾讯云优惠地址:
https://curl.qcloud.com/BoYpZdLh陌溪手上目前有闲置的腾讯云的服务器,刚好可以用来作为内网穿透的机器,首先需要在云服务器上设置安全组,我这里为了演示方便,就把所有的端口都放开了,小伙伴可以自行根据自己的需求,开放指定的端口即可。
安装服务端
首先来安装服务端,服务端需要在具有公网IP的设备上进行安装,陌溪目前的云服务器是预装了 CentOS 7.x 系统。
这里需要使用到 docker 来进行安装,关于 docker 的安装教程就不在本篇讲解了,小伙伴可以自行百度搜索。
首先使用远程连接工具连接到云服务器,然后使用下面的命令,创建 frp 的服务端配置文件:
vi /root/frps.ini
然后填写配置信息,这里会启动两个端口号: 7000 :用于和内网设备数据交互; 7500 :提供 frp 图形化界面,同时需要配置面板访问的账号和密码,以及 token 是内网设备和 frp 服务端建立连接时的密码。
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板账号设置
dashboard_user = admin
# 登录面板的密码
dashboard_pwd = mogu2024
# 身份验证
token = mogu2024
使用下面 docker 命令,下载我们的frp服务端。其中,这里使用到了蘑菇的阿里云镜像仓库地址,官方的镜像地址因为被墙的原因,可能很多小伙伴目前无法访问了。
docker run --restart=always --network host -d -v /root/frps.ini:/etc/frp/frps.ini --name frps registry.cn-shenzhen.aliyuncs.com/mogublog_business/frps
细心的小伙伴,可能会发现:命令行中使用了 --network host 定网络模式为host模式。
众所周知, Docker 使用了Linux的Namespaces技术来进行资源隔离,如 PID Namespace 隔离进程, Mount Namespace 隔离文件系统, Network Namespace 隔离网络等。一个 Network Namespace 提供了一份独立的网络环境,包括网卡、路由、 Iptable 规则等都与其他的 Network Namespace 隔离。
如果使用 host 模式时,容器中的应用都直接绑定在宿主机的端口上,没有经过 NAT 转换,但容器的其他如文件系统等还是隔离的。
安装完成后,输入下面命令,即可查看容器运行状态
docker ps -a
可以看到,现在运行了一个 frps 的容器
同时, frp 还提供了图形化的界面,我们使用 http://your_ip:7500 即可打开对应的图形化界面。输入上面配置文件中,配置的账号和密码登录即可。
如果能看到下面的页面,说明就我们的服务端就安装成功了
客户端安装
客户端需要在我们的内网的机器上进行安装,在上一期的文章中,我们通过PVE系统安装了一个CentOS服务器,并搭建了蘑菇系统。
我们接着打开之前的机器,然后使用 SSH 工具进行连接。
首先,需要在这台机器上,创建 frp 的客户端配置文件:
vi /root/frpc.ini
然后填写下面的配置,这里需要注意的是 server_addr 填写的是服务器端的地址,然后 token 是服务端配置的token令牌,用于客户端和服务端建立连接。
[common]
# server_addr为云服务器IP地址
server_addr = xxx.xxx.xxx.xxx
# server_port为服务端监听端口,bind_port
server_port = 7000
# 服务端设置的token
token = mogu2024
[vue_mogu_web]
type = tcp
local_ip = 127.0.0.1
local_port = 9527
remote_port = 9527
[vue_mogu_admin]
type = tcp
local_ip = 127.0.0.1
local_port = 9528
remote_port = 9528
[mogu_gateway]
type = tcp
local_ip = 127.0.0.1
local_port = 8607
remote_port = 8607
[mogu_data]
type = tcp
local_ip = 127.0.0.1
local_port = 8600
remote_port = 8600
上面配置是将这台机器中的四个端口,映射到服务端的四个端口上。
配置完成后,执行下面命令下载客户端的docker镜像,并加载上面的配置文件,启动 frp 的客户端。
docker run --restart=always --network host -d -v /root/frpc.ini:/etc/frp/frpc.ini --name frpc registry.cn-shenzhen.aliyuncs.com/mogublog_business/frpc
我们再打开 frp 的图形化界面,选中: Proxies → TCP ,可以看到这几个端口都已经注册上来了
访问公网IP的 9527 和 9528 端口,即可看到本地虚拟机部署的页面。
到这里,使用frp进行内网穿透小主机就完毕了,关于frp的更多玩法,小伙伴们也可以参考frp的官方文档进行体验~
另外,如果小伙伴对于穿透后如何进行域名解析感兴趣,也可以进行留言或者点赞,后续可以单独写一篇文章来分享~
使用ngrok搭建内网穿透
关于内网穿透工具有很多,有 付费版本 【花生壳、向日葵】也有 免费版 的,这里使用的一款免费的内网穿透工具 ngrok ,提供了
下面是关于 ngrok 的相关介绍:
提供免费内网穿透服务,免费服务器支持绑定自定义域名
管理内网服务器,内网web进行演示
快速开发微信程序和第三方支付平台调试
本地WEB外网访问、本地开发微信、TCP端口转发
无需任何配置,下载客户端之后直接一条命令让外网访问您的内网不再是距离
ngrok 提供了免费的穿透服务
官网:http://www.ngrok.cc/
然后就进入 创建隧道 的页面,找到免费的隧道,再填写相关的信息
访问的协议
域名的前缀
需要映射的端口号
然后点击添加即可,再添加成功的页面,能够看到隧道 id 和 赠送域名,然后复制 隧道id 到后面使用
然后下载 ngrok 软件,选中 Linux64Bit 版本下载,也可以右键获取到对用的下载链接
下载:
http://www.ngrok.cc/download.html然后在本地服务器上下载对用的压缩包
wget https://www.ngrok.cc/sunny/linux_amd64.zip?v=2.1
下载完成后,使用下面命令解压
unzip linux_amd64.zip
然后进入到 linux_amd64目录,执行脚本
# 启动单个隧道
./sunny --server=服务器地址 --key=隧道ID
# 启动多个隧道
./sunny --server=服务器地址 --key=隧道ID,隧道ID
# 后台启动
nohup sunny --server=服务器地址 --key=隧道ID > /dev/null 2>1
然后执行完,看到启动成功代表已经成功运行了
访问对应的 URL,也可以正常的打开蘑菇社区的页面了~
如果要映射多个端口的话,那么就需要开通多个隧道了。 ngrok 的原理其实和上面frp是一样的,无非就是 ngrok 官网帮助我们搭建了一套服务端,我们只需要在客户端注册即可。
不过,官方提供的免费的隧道限制了速度,并且经常不稳定,如果是测试使用的话,那可以采用这个方式,如果需要长期运行,也可以在海鲜市场或者淘宝上,购买别人搭建好的服务端,一般都是共享带宽能达到 200M 以上,一年应该也是 100块 左右,也会提供公网IP和固定数量的端口号【要增加需要额外付费】。
如果,小伙伴对于带宽速度有要求,可以考虑一些上面的这种方式,原来其实和上面第一种 frp 方式是差不多的。
申请公网IP进行穿透
上面提到的方式,或多或少都需要在新增一台额外的服务器,才能够首先内网穿透。如果小伙伴们自己家里办了宽带,并且所在地区能申请的公网IP的话,使用运营商提供的公网IP来访问也是不错的方式。
根据不同的运营商内部政策可能不一样,现在基本上很难给开通 IPV4 的公网 IP 了。但有些地区是会给分配 IPV6 的地址,但作为 Web 服务器所需的 80 和 443 端口号都是封禁的。
因为陌溪使用的宽带,是使用楼下老哥的号码办理的,并且楼下老哥也不是搞技术的,都不知道什么是公网IP,所以最终我也没去折腾这个方案。
大致的流程是:打电话给运营商,把我们的光猫改成桥接模式,让路由器进行拨号上网,分配一个公网IP地址,再把宽带播放上网的账号和密码发短信到自己的手机上。
当然,这个修改桥接模式也可以自己登录到光猫的后台系统,去改对应的宽带设置,这里需要使用超级管理员账号登录,一般光猫背面的是普通的账号,需要找运营商获取超级管理员,并且密码也是动态的。
也可以强制重置超级
只要切换到桥接模式后,路由器就不能正常上网了,如果按照陌溪的网络拓扑图,就需要两个路由器分别去拨号上网【切过去后,楼下老哥就无法愉快的冲浪了~】。
输入运营商发给你的宽带账号和密码,就可以进行拨号上网了。【因为不是陌溪自己的宽带,我也不知道宽带账号和密码是啥】
如果这里的 IP 地址变成了公网IP,那说明网络IP申请成功了。同理,IPV6的公网IP也是一样的方式。
最后再配置一下端口转发,将这个IP地址的端口,转发到内网某个IP下的内部端口,就实现了我们的穿透。
如果有公网IP,但是不能访问的话,那记得看看是否开启了防火墙,需要对这些端口放行掉。
因为陌溪没有申请到公网IP,所以就无法继续演示了~
将虚拟机网络进行组网
上面提到的三种方法,就是我们常用的内网穿透的方式了,但是前面提到的方式,都是基于端口映射的方式,在实际使用中可能经常要去配置不同的端口号映射。但这种方案还是不够酸爽,无法访问家庭内网任意设备的任意端口。
这个时候就需要通过组网的方式,将我们局域网的设备和云服务器处于一个网段内,并且互相通过内网IP都可以 ping 通,如果我们需要将内网的服务允许外网用户访问,那么只需要在一台云服务器上安装 nginx ,然后通过 nginx 反向代理到对应的虚拟机网络即可。
一般,我们常用的一些组网方式有以下几种:
Wireguard 组网
Tailscale 组网
ZeroTier 组网
如果小伙伴们对这个感兴趣的话也可以在评论区留言讨论,看看后续是否需要单独再写一篇文章来讲解~
到这里,关于小主机如何在互联网访问的教程就写完了 。
我是陌溪,我们下期再见~
项目推荐
推荐一款陌溪最近在持续更新和打磨的社区项目 《 蘑菇社区 》 , 蘑菇社区 定位是多人内容社区系统,在原有蘑菇博客的基础上,加入了更多的 社区玩法 ,支持: 用户投稿 、个人主页、 用户签到 、 关注/取关 、 收藏/点赞 、 积分模块 、 VIP会员 、 用户动态 (蘑菇圈)、 面经模块 、 课程模块 、 消息通知 、公众号登录/管理、 私信/群聊模块 、 SEO优化 、图片敏感审核、任务模块、成就模块、 勋章模块 、 支付模块 、提现模块、 消息触达 、资源模块、 抽奖模块 等,欢迎点击左下角 阅读原文 了解关于社区项目更多内容~。