目 录CONTENT

文章目录

【好玩儿的Docker项目】家里没有公网IP?FRP+NPM+VPS = 随时随地用域名访问家里的任何设备!内网穿透,从未如此简单!

咕咕
2022-09-18 / 2 评论 / 6 点赞 / 5358 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

前言

咕咕最近搬家了,也搬出来了之前吃灰了两三年的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 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

architecture

2. 为什么要用 frp ?

因为利用它,我们可以把原来不能在互联网上访问的内网服务,以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

这样,你就可以在任何有网的情况下访问到你家里的设备上搭建的服务了!(相当于你自己在家搭建了一台服务器)

3. 相关地址

GitHub地址:https://github.com/fatedier/frp(60.1k star)

官方文档地址:https://gofrp.org/docs/concepts/

4. 效果展示

见视频。

在任何有网的地方通过域名访问内网服务:

image-20220917134814429

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)

安装系统(腾讯云轻量应用服务器)

e59713fba8726d3cb55ae11bca83fe3c.png

腾讯云轻量服务器最大的特点就是“轻量”,相比CVM,更适合小白上手,这边我们之间选择Docker基础镜像,就可以省去后面安装Docker的步骤(如果你非要用国内的服务器,这边装的Docker镜像还会帮你配置好国内镜像源,让你加速访问docker镜像资源)。

登陆(腾讯云轻量应用服务器)

2722040ee311eb4a9ebf2a4945bf38f4.png

c0b5d360053746c4095d592967ee401f.png

e0ba858f021b846ad0abc27acf5008c2.png

7.1 服务器前期配置

服务器初始设置,参考:

新买了一台服务器“必须”要做的6件小事

保护好你的小鸡!保姆级服务器安全教程!

这边由于我们用的是腾讯云轻量应用服务器,系统默认就帮我们创建了名字是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
image-20220528185512488

选择18,然后输入你想要扩容的数值即可。

image-20220528185604586

使用腾讯云轻量应用服务器的小伙伴可以直接跳到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之类的服务器商家默认就是全部开启的,不需要额外打开)

腾讯云打开方法如下:

image-20220630215240864 image-20220630220546335

这边我们填8099 确定即可(如果你在dockercompose文件里换了8081,这边就需要填8081,以此类推)

image-20220819145844555

这边我们是全开,就这样填:

image-20220917140731007

因为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

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程

image-20220917141236156

之后,登陆Nginx Proxy Manager(不会的看这个:安装Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称NPM)会用到80443端口,所以本机不能占用(比如原来就有Nginx)

以反代nas为例子,直接丢几张图:

image-20220502123517401

image-20220917141317093

注意填写对应的域名IP端口

IP填写:

如果Nginx Proxy Manager和Memos在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的Docker容器内部IP。

否则直接填frps所在的服务器IP就行。

image-20220403104353185

再次打开,勾选这些:

image-20220917141413268

然后就可以用域名来安装访问nas了。

image-20220917134814429

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

6
广告 广告

评论区