前言
咕咕最近搬家了,也搬出来了之前吃灰了两三年的NAS——威联通TS453B Mini,想着折腾折腾。
NAS其实简单理解为一个可以装载很多块硬盘的小电脑,也有自己的操作系统,最基础的作用是备份文件和照片。
不过咕咕这边装了移动送的宽带,并没有公网IP,如何从外面访问家里的NAS就成了一个问题,咕咕尝试过威联通自带的qlink,实在是太慢了,基本上没法用,网上也有介绍用 Zerotier的,似乎也有些局限性。
突然想到自己不是有服务器吗?服务器就自带公网IP,不如好好把它利用起来,采用frp做内网穿透试试。
(其实咕咕很早以前就用树莓派玩过frp,那个时候也是刚刚接触服务器的时间段:【保姆级】树莓派FRP教程)
经过一番折腾,咕咕用docker搭建frp,搭配之前介绍的Nginx Proxy Manager,已经完美实现了用单独的域名访问NAS上搭建的单独的服务,并且不用带端口号,支持https(理论上只要是有内网IP的项目,都可以在任何能上网的地方通过域名访问到)
这周就来和大家简单分享一下咕咕的折腾经验,不涉及复杂的知识,旨在用最简单的方法让大家实现随时随地内网访问。
1. frp是啥?
具体可以看这里:https://gofrp.org/docs/concepts/
简单来说,大家如果不求甚解,只需要知道下面这些就行:
- frp是fast reverse proxy的缩写,是一个专注于内网穿透的高性能的反向代理应用
- frp项目的作者是中国人!
- frp支持 TCP、UDP、HTTP、HTTPS 等多种协议,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
- frp是go语言写的,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。
- frp有服务端(frps,s指service,通常搭建在有公网IP的设备上)和客户端(frpc,c指client,通常搭建在内网设备上)
基本原理:frp 主要由 客户端(frpc) 和 服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
2. 为什么要用 frp ?
因为利用它,我们可以把原来不能在互联网上访问的内网服务,以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
这样,你就可以在任何有网的情况下访问到你家里的设备上搭建的服务了!(相当于你自己在家搭建了一台服务器)
3. 相关地址
GitHub地址:https://github.com/fatedier/frp(60.1k star)
官方文档地址:https://gofrp.org/docs/concepts/
4. 效果展示
见视频。
在任何有网的地方通过域名访问内网服务:
5. 搭建环境
- 服务器:
腾讯香港轻量应用服务器24元/月VPS一台本期搭建用的是腾讯轻量购买链接的服务器,(最好是选非大陆(香港)的服务器)如果是小白刚开始玩的话,还可以购买Racknerd的服务器,最低一年不到100块(不过搭建Docker还是建议选择1G内存以上的机器)(Racknerd服务器介绍:点击查看) - 系统:Debian 10或者11(DD脚本 非必需DD用原来的系统也OK,之后教程都是用Debian或者Ubuntu搭建~)
- 安装好Docker、Docker-compose(相关脚本)
- 【非必需但建议】域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
- 【非必需本教程选用】安装好Nginx Proxy Manager(相关教程)
服务器要求:最好选线路好一些的,比如美西,或者香港。带宽最好也大一些的。国内机器线路好但是带宽太小了,咕咕没有用国内的机器。
6. 搭建视频
YouTube:https://youtu.be/XKnbA4b55Kw
哔哩哔哩【高清版本可以点击去吐槽到B站观看】:
7. 搭建方式(服务端 frps)
安装系统(腾讯云轻量应用服务器)
腾讯云轻量服务器最大的特点就是“轻量”,相比CVM,更适合小白上手,这边我们之间选择Docker基础镜像,就可以省去后面安装Docker的步骤(如果你非要用国内的服务器,这边装的Docker镜像还会帮你配置好国内镜像源,让你加速访问docker镜像资源)。
登陆(腾讯云轻量应用服务器)
7.1 服务器前期配置
服务器初始设置,参考:
这边由于我们用的是腾讯云轻量应用服务器,系统默认就帮我们创建了名字是lighthouse
的用户,系统后台也有防火墙(默认就开了几个常用的端口)
对小白用户来说,可以不用再去管繁琐的服务器安全的配置,大大降低了服务器防护的门槛。
【Docker系列】不用宝塔面板,小白一样可以玩转VPS服务器!
sudo -i # 切换到root用户
apt update -y # 升级packages
apt install wget curl sudo vim git -y # Debian系统比较干净,安装常用的软件
注意:VPS的内存如果过小,建议设置一下SWAP,一般为内存的1-1.5倍即可,可以让系统运行更流畅!
设置SWAP可以用脚本:
wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh && chmod +x box.sh && clear && ./box.sh
选择18
,然后输入你想要扩容的数值即可。
使用腾讯云轻量应用服务器的小伙伴可以直接跳到5.2.4
7.2 安装Docker(使用腾讯云轻量应用服务器可跳过这一部分)
7.2.1 非大陆服务器Docker安装
wget -qO- get.docker.com | bash
docker -v #查看docker版本
systemctl enable docker # 设置开机自动启动
修改Docker配置(可选)(来自烧饼博客)
以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训):
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF
然后重启 Docker 服务:
systemctl restart docker
7.2.2 非大陆服务器Docker-compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version #查看docker-compose版本
7.2.3 国内服务器安装docker
curl -sSL https://get.daocloud.io/docker | sh
docker -v #查看docker版本
systemctl enable docker # 设置开机自动启动
修改Docker配置(可选)(来自烧饼博客)
以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘(泪的教训):
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF
然后重启 Docker 服务:
systemctl restart docker
7.2.4 国内服务器安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version #查看docker-compose版本
7.3 安装NginxProxyManager
参考这边的内容:https://blog.laoda.de/archives/nginxproxymanager
7.4 创建安装目录
创建一下安装的目录:
sudo -i
mkdir -p /root/data/docker_data/frps
cd /root/data/docker_data/frps
这边frp其实不需要用docker安装,直接到GitHub上下载你系统对应的软件包解压就可以使用,不过配置后台自动运行会麻烦一些,这边为了简单起见,咕咕直接用@snowdreamtech 编译好的docker镜像,采用docker的方式来安装frp的服务端和客户端,这样后台运行,重启啥的可能会更方便一些,配置也更简单一些。
源码安装可以参考GitHub:https://github.com/fatedier/frp
Docker方法安装:
cd /root/data/docker_data/frps
touch frps.ini
vim docker-compose.yml
英文输入法下,按i
version: '3.3'
services:
frps:
restart: always
network_mode: host
volumes:
- './frps.ini:/etc/frp/frps.ini'
container_name: frps
image: snowdreamtech/frps
按一下esc
,然后:wq
保存退出,之后,
docker-compose up -d
Ok,这样我们就搭建好了frp的服务端了,不过,现在我们frps.ini
里面啥也没有,需要我们来配置一下,这边贴一个咕咕的配置文件给大家参考,满足基本使用。
[common]
#frp 监听端口,与客户端绑定端口
bind_port= 5443
kcp_bind_port = 5443
#dashboard用户名
dashboard_user= gugu
#dashboard密码
dashboard_pwd= passwd
#dashboard端口,启动成功后可通过浏览器访问如http://ip:9527
dashboard_port= 9527
#设置客户端token,对应客户端有页需要配置一定要记住,如果客户端不填写你连不上服务端
token = 8ad3d1x429a2d
cd /root/data/docker_data/frps
vim frps.ini
然后粘贴上面的内容,之后在英文输入法下,按一下esc
,然后:wq
保存退出。
最后,重启一下frps服务即可
docker-compose restart
好了,这边frp服务端我们就已经搞定了。(如果有更高级的需求,可以自行参考官方文档来添加内容。)
接下来如果你是腾讯云服务器,还需要去打开防火墙。
7.5 打开服务器防火墙并访问网页
这边由于咕咕后续会用到很多端口,一一打开有点麻烦,咕咕演示的是全部开启端口(Racknerd之类的服务器商家默认就是全部开启的,不需要额外打开)
腾讯云打开方法如下:
这边我们填8099
确定即可(如果你在dockercompose文件里换了8081
,这边就需要填8081
,以此类推)
这边我们是全开,就这样填:
因为IP+端口方式,记起来很麻烦,咕咕建议大家再搞搞一个域名,容易记,看起来也更正规一点。这样可以做https,会让网页更安全。
而且namesilo上面xyz后缀的域名一年就7块钱,可以年抛。
如果想要长期使用,还是建议买com后缀的域名,更加正规一些,可以输入laodade
来获得1美元的优惠(不知道现在还有没有)
namesilo自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些丑古老 = =)
【域名购买】Namesilo优惠码和域名解析教程(附带服务器购买推荐和注意事项)
我们接着往下看!
7.6 更新
7.6.1 docker-compose更新
cd /root/data/docker_data/frps
docker-compose down
cp -r /root/data/docker_data/frps /root/data/docker_data/frps.archive # 其实就是备份一下frps.ini这个文件
docker-compose pull
docker-compose up -d
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入y
利用Docker搭建的应用,更新非常容易~
7.7 卸载
docker stop frps
docker rm -f frps # 停止容器,此时不会删除映射到本地的数据
rm -rf /root/data/docker_data/frps # 完全删除映射到本地的数据
可以卸载得很干净。
8. 搭建方式(客户端 frpc)
8.1 NAS
其实核心是一样的,只不过修改一下配置文件。
这边贴一个docker-compose.yml
文件和frpc.ini
的文件
version: '3.3'
services:
frpc:
restart: always
network_mode: host
volumes:
- './frpc.ini:/etc/frp/frpc.ini'
container_name: frpc
image: snowdreamtech/frpc
# frpc.ini
[common]
server_addr = 43.132.202.152
server_port = 5443
token = 8ad3d1x429a2d
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 222
# 这个自定义,之后再ssh连接的时候要用
remote_port = 6000
[qb]
type = tcp
local_ip = 127.0.0.1
local_port = 8092
remote_port = 6001
[jellyfin]
type = tcp
local_ip = 127.0.0.1
local_port = 32771
remote_port = 6002
[NAS]
type = tcp
local_ip = 127.0.0.1
local_port = 5000
remote_port = 6003
[nextcloud]
type = tcp
local_ip = 127.0.0.1
local_port = 4433
remote_port = 6004
[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
[vnc]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 5900
use_encryption = true
use_compression = true
8.2 软路由
安装docker即可,仿照上面操作。
支持的架构:amd64, arm32v6, arm32v7, arm64v8, i386
如果不方便装docker-compose,可以直接用docker命令行来:
首先:
mkdir -p /etc/frp
cd /etc/frp
vim frpc.ini
输入例如:
# frpc.ini
[common]
server_addr = 43.132.202.152
server_port = 5443
token = 8ad3d1x429a2d
[router]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 6005
之后在英文输入法下,按一下esc
,然后:wq
保存退出。
然后运行:
docker run --restart=always --network host -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
9. 反向代理
9.1 利用Nginx Proxy Manager
在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
之后,登陆Nginx Proxy Manager(不会的看这个:安装Nginx Proxy Manager(相关教程))
注意:
Nginx Proxy Manager(以下简称NPM)会用到
80
、443
端口,所以本机不能占用(比如原来就有Nginx)
以反代nas为例子,直接丢几张图:
注意填写对应的
域名
、IP
和端口
IP填写:
如果Nginx Proxy Manager和Memos在同一台服务器上,可以在终端输入:
ip addr show docker0
查看对应的Docker容器内部IP。
否则直接填frps
所在的服务器IP就行。
再次打开,勾选这些:
然后就可以用域名来安装访问nas了。
9.2 其他服务
其他服务也是类似的方法,详见视频。
10. 结尾
祝大家用得开心,有问题可以去GitHub提Issues,也可以在评论区互相交流探讨。
同时,项目处于刚开始阶段,有能力给项目做贡献的同学,也欢迎积极加入到项目中来,贡献自己的一份力量!
参考资料
GitHub地址:https://github.com/fatedier/frp(60.1k star)
官方文档地址:https://gofrp.org/docs/concepts/
文章里用到的docker镜像地址:https://hub.docker.com/r/snowdreamtech/frpc
评论区