前言

自建Nas最大的痛点之一,就是要自己解决远程访问的问题,我打算用两到三篇文章,来详细讲述一下我尝试过几个远程访问解决方案的部署过程和遇到的坑。

我尝试的第一个方案就便是frp,什么是frp,我从官网找到一些简介:

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、QUIC、KCP 以及 Websocket 等多种协议。

  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 支持 P2P 通信,流量不经过服务器中转,充分利用带宽资源。

  • 多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP 协议转换,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。

  • 高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。

  • 服务端和客户端 UI 页面。

看完官方简介,大概了解到,frp是一个高性能的反向代理应用,专门用于内网穿透,以解决内部服务可以外部访问的需求。

他的工作原理大概是这样子,该程序主要分为两部分:

  1. frpc(客户端):部署在内网设备,负责将来自frps的外部请求转发到内网设备上,将内部服务的响应转发到frps上。

  2. frps(服务端):部署在公网服务器上,负责接收外部请求,并将其转发到对应的frpc上。

基本架构如下图:

由此可见,使用frp最重要的一点,就是需要使用者有一个具有公网IP的云服务器去部署frp服务端。正好当时花两百多买到一个超值的腾讯云轻量云服务器(2c4G40G8M)三年使用权,本着不浪费资源的原则,就尝试的在云服务器上部署了frp服务,没想到,这一用就是三年。

开始部署

下图是我们部署的一个流程图

下载frp

打开frp的Github Releases页面,按照你的操作系统,下载对应的编译程序。

以我的情况为例:我的云服务器和本地Nas都是CentOS7,那么我只需要下载frp_0.61.2_linux_amd64.tar.gz即可。

假如你的云服务器是Linux系统,本地Nas是windows系统,那么你就需要先下载frp_0.61.2_windows_amd64.zip用于本地Nas安装,再下载frp_0.61.2_linux_amd64.tar.gz用于安装到云服务器上。

ps:frp_0.61.2_(系统类型)_(cpu架构).tar.gz

下载后解压压缩包,我们可以看到压缩包中有四个文件

其中frps.toml表示服务端配置文件,frpc.toml表示客户端配置文件。

配置frp

使用文本编辑器打开frps.toml(什么?你不知道什么toml?赶紧看看这篇文章恶补一下),修改服务端配置。各位可以参考这个标准配置,按照自己实际情况修改。

#  服务器监听端口,随意修改,注意开放安全组和系统防火墙
bindPort = 7000

# 用于内网 HTTP 代理穿透,随意修改,注意开放安全组和系统防火墙
vhostHTTPPort = 18080

# 用于内网 HTTPS 代理穿透,随意修改,注意开放安全组和系统防火墙
vhostHTTPSPort = 14443

# 子域名支持
# 可以通过 `subDomainHost` 解析动态子域名
# 例如:如果 `subDomainHost` 配置为 "example.com"
# 那么客户端可以使用 `test.example.com` 访问内网服务
# 如果你没有域名或不使用此功能,请删除此行!
# 如果你要用IP直连例如:168.0.0.1:8848,就把这行删掉,不要配置!\
# 请替换为你的真实域名
subDomainHost = "xxxx.xx"  

# =============================================
# Web 控制台(Dashboard)配置(不建议开放,容易被FOFA等工具扫到)
# =============================================

# 监控界面监听地址(`0.0.0.0` 代表所有 IP 可访问)
# webServer.addr = "0.0.0.0"
# Web 管理面板端口(可在浏览器访问,默认 7500)
# 你可以通过 `http://你的公网IP:7500` 访问 FRP 管理面板
# webServer.port = 7500
# Web 控制台管理账号(可自定义)
# webServer.user = "admin"
# Web 控制台密码(请自行修改)
# webServer.password = "xxxx"

# =============================================
# 身份验证(Authentication)配置
# =============================================

#  认证方式(防止未经授权的客户端连接)
# 目前 FRP 支持 `token` 和 `oidc` 方式,我们选用token
auth.method = "token"

#  Token 认证(客户端需要匹配相同 token 才能连接)
# 通俗来说就是密码,写一个你能记住的,尽量长一点
# 示例: 123-abc-123abc 
auth.token = "123-abc-123abc"   # 请自行修改

下面是frpc的配置文件。

serverAddr = "此处引号内填写外网服务器的公网IP"
serverPort = 502                      # 服务端口,同frps中“ 服务器监听端口”一致
token = "123-abc-123abc"              # 密钥,同frps中“ Token 认证”一致

#frpc的web控制端,按需开启
#webServer.addr = "此处引号内填写Nas内网IP"
#webServer.port = 7400
#webServer.user = "admin"
#webServer.password = "237198Hh"

# 配置每个内网服务
# 这里参考我实际使用情况,列出4种服务的配置方式,供各位参考
# 1.ssh转发,即通过SSH访问内网机器。
# 2.将内网服务以https形式转发,即为本地 HTTP 服务启用 HTTPS
# 3.普通Http转发,通过自定义域名访问内网的 Web 服务
# 4.普通Http转发,带访问权限限制,安全暴露内网服务。

# 功能1:转发SSH
[[proxies]]
name = "ssh"                    # 服务名称,随便写,自己能看懂就行
type = "tcp"                    # 默认,不要改
localIP = "10.10.10.10"         # 本地服务IP
localPort = 22                  # 本地ssh端口
remotePort = 16000              # 远程访问端口

# 功能2:将内网服务以https形式转发
[[proxies]]
name = "1panel"                      # 服务名称,随便写,自己能看懂就行
type = "https"                       # 默认,不要改
customDomains = ["xxx.larpx.cn"]     # 服务子域名
# 使用http2https插件
[proxies.plugin]          
type = "https2http"                  
localAddr = "10.10.10.10:8080"      # 本地服务地址
crtPath = "/root/program_center/frp/ssl/xxxxx.larpx.cn.crt"  # 证书文件
keyPath = "/root/program_center/frp/ssl/xxxxx.larpx.cn.key"  # 证书私钥
hostHeaderRewrite = "10.10.10.10"                            # 默认,不要改
requestHeaders.set.x-from-where = "frp"                      # 默认,不要改
 
# 功能3:普通Http转发
[[proxies]]
name = "qinglong"                # 服务名称,随便写,自己能看懂就行
type = "http"                    # 默认,不要改
localIP="10.10.10.10"            # 本地服务IP
localPort = 1700                 # 本地服务端口
customDomains = ["xxx.larpx.cn"] # 访问子域名

# tmm v2
[[proxies]]
name = "xxxx2"                    # 服务名称,随便写,自己能看懂就行
type = "http"                     # 默认,不要改
localIP = "10.10.10.10"           # 本地服务IP
localPort = 5870                  # 本地服务端口
customDomains = ["xxee.larpx.cn"] # 访问子域名
httpUser = "admin"                # 访问该服务的用户名
httpPassword = "admin"            # 访问该服务的密码

 

上传并启动

将frpc和frps分别上传到对应设备,并授予执行权限,怕麻烦直接chmod 777。什么,你不会linux的基本命令,你笨蛋啊,赶紧点开这篇文章学习一下。

这里建议linux下使用systemd来管理frp服务,保证服务的高可用性。

首先,安装systemd

# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd

# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd

创建frps.service文件

使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。

$ sudo vim /etc/systemd/system/frps.service

写入内容

[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

使用 systemd 命令管理 frps 服务

# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps

设置 frps 开机自启动

sudo systemctl enable frps

frpc的systemd配置方式同frps类似,这里不过多赘述。服务启动完成后,访问域名测试,查看frpc是否连接到frps。由于我的frp服务已经关停,这里照了一张网图(侵删),供大家参考.

结语

这个配置总体来说没有什么难度,无非就是toml和linux的基本使用,而且frp只有两个配置文件。
希望这个教程对你有帮助,如果喜欢请点个赞吧!