服务器迁徙大作战(二):FRP实现内网穿透

1,242 阅读5分钟

上次服务器迁移到内网环境后遗留了一个基础的能力,就是非内网环境下的开发调试问题,所以开了第二篇文章,用来记录下。
业界开源的穿透工具很多,诸如 ngrok、frp、lanproxy、goproxy、nps 等,对这几个主流的工具从是否有API,客户端单独key,子域名,收费模式,采用语言等维度做了下简单分析。

是否有API客户端单独key子域名收费模式采用语言stars
ngrok支持单独(未验证)支持有免费版和付费版Go24k
frp不支持统一支持免费开源Go81.3k
lanproxy不支持单独支持商业授权收费Java5.6k
goproxy支持无(未验证)不支持(未验证)免费开源Go15.3k
nps支持单独支持免费开源Go29.5k

基于以上基本数据,无脑选择了 frp, 毕竟开源免费,高度自定义配置,大众的选择应该靠谱。

介绍

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。基于Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。

更过原理可参考 [链接](frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。 由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。)

安装

官方文档移步

下载

github.com/fatedier/fr…
解压缩下载的压缩包,将其上传到跳板机器和内网机器中,放置在任意目录,并解压,解压后应包含以下文件:

frpc   // 客户端的启动服务
frpc.toml   // 客户端的配置文件
frps // 服务端的启动服务
frps.toml  // 服务端的配置文件
LICENSE

配置

frp 从 0.52 版本开始建议采用toml 格式的配置。

服务端配置

编辑 frps.toml 文件,示例如下:

[common]
bindAddr = "0.0.0.0"   // 
bindPort = "7000"      //  frp监听的端口,默认是7000,可以改成其他的
auth.token = "xxxxxxxxxxxxxxxxxxx" // 鉴权的token,此token 和客户端的配置同一个
webServer.addr = "0.0.0.0"  // 要可视化的访问后台管理面板最好是配置 0.0.0.0
webServer.port = 7200  // 服务端的服务绑定在端口,通过此端口能直接访问后台的管理面板
webServer.user = "xxxxxx"  // 后台管理系统的用户名
webServer.password = "xxxxx" // 后台管理系统的密码
log.to = "/home/frp_0.58.0_linux_amd64/log/frps.log"

vhostHTTPPort = 81
vhostHTTPSPort = 444

配置完成后可以通过 frps verify -c ./frps.toml 校验配置是否有问题,如果正常,则是提示如下信息,如果异常则会提示对应信息。

frps: the configuration file ./frps.toml syntax is ok

更详细的配置: 详细配置项

客户端配置

编辑 frpc.toml 文件,示例如下:

serverAddr = "xxxxxxx"   // 部署服务端的地址(公网机器的地址)
serverPort = 7000 // 服务端监听的 frp 的端口
auth.token = "ZeDRRsf" // 服务端配置的 auth.token

// 服务端的  10020 端口转发到内网的 10020,用户访问公网的 10020 时,TCP 会转发到 内网的 10020 端口
[[proxies]]    // 必须这样写
name = "managerweb"   // 配置名 自己定义
type = "tcp"  // 协议类型
localIP = "127.0.0.1"
localPort = 10020  // 内网机器的端口
remotePort = 10020  // 服务端端口

// 多个端口配置类似的配置
[[proxies]]    // 必须这样写
name = "managerweb"   // 配置名 自己定义
type = "tcp"
localIP = "127.0.0.1"
localPort = 10021
remotePort = 10021

更详细的配置: 详细配置项
配置完成后可以通过 frps verify -c ./frpc.toml 校验配置是否有问题,如果正常,则是提示如下信息,如果异常则会提示对应信息。

frps: the configuration file ./frpc.toml syntax is ok

服务启动

客户端和服务端都需要启动对应的服务,服务端启动 frps, 客户端启动 frpc。推荐使用 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

安装 systemd

如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:

# 使用 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

写入内容(注意区分客户端和服务端的启动脚本,服务端是 frps + frps.toml,客户端是 frpc + frpc.toml)

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径 如果是启动客户端服务,则是 frpc、frpc.toml
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

效果

通过 {frp服务端的地址}:{端口} 即可访后台的管理系统,查看生效的转发。
frp服务端的地址:公网机器的地址
端口: frps.toml 中配置的 webServer.port

image.png