上次服务器迁移到内网环境后遗留了一个基础的能力,就是非内网环境下的开发调试问题,所以开了第二篇文章,用来记录下。
业界开源的穿透工具很多,诸如 ngrok、frp、lanproxy、goproxy、nps 等,对这几个主流的工具从是否有API,客户端单独key,子域名,收费模式,采用语言等维度做了下简单分析。
| 是否有API | 客户端单独key | 子域名 | 收费模式 | 采用语言 | stars | |
|---|---|---|---|---|---|---|
| ngrok | 支持 | 单独(未验证) | 支持 | 有免费版和付费版 | Go | 24k |
| frp | 不支持 | 统一 | 支持 | 免费开源 | Go | 81.3k |
| lanproxy | 不支持 | 单独 | 支持 | 商业授权收费 | Java | 5.6k |
| goproxy | 支持 | 无(未验证) | 不支持(未验证) | 免费开源 | Go | 15.3k |
| nps | 支持 | 单独 | 支持 | 免费开源 | Go | 29.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