frp 学习以及实践
公司内部有一台 GPU ,需要供外网访问,想到了一个非常流行的开源项目 frp ,今天来学习一下 frp 。
要实现公司内部GPU服务器供外网访问,FRP(Fast Reverse Proxy)是一个很好的解决方案。FRP 是一个高性能的反向代理应用,可以帮助你轻松地将内网服务暴露到公网。
这一期是一个简单的使用教程,下一期将会学习 frp 项目,学习源码架构设计
学习 FRP
- 理解FRP的基本概念:了解FRP的工作原理,包括客户端(frpc)和服务端(frps)之间的交互方式。
- 阅读官方文档:FRP的GitHub页面提供了详细的安装指南和配置说明,这是学习FRP的最佳起点。
- 掌握基本配置:学习如何配置FRP的服务端和客户端,理解不同配置项的含义和用途。
- 了解安全设置:熟悉如何通过加密和认证提高FRP的安全性。
- 探索高级功能:了解FRP的负载均衡、HTTP/HTTPS支持等高级功能。
实践 FRP
搭建FRP服务端:
- 在一台具有公网IP的服务器上部署FRP服务端(frps)。
- 配置
frps.ini
文件,设置监听端口、认证方式等。
需要注意的是,新版本的已经没有用
ini
文件了,而使用的配置FRP客户端:
- 在内网的GPU服务器上部署FRP客户端(frpc)。
- 根据需要访问的服务(例如SSH、HTTP),在frpc.ini中配置相应的代理。
启动和测试:
- 启动FRP服务端和客户端。
- 从外网测试是否能成功访问内网的GPU服务器。
监控和维护:
- 监控FRP服务的运行状态,确保稳定性。
- 定期更新FRP以获得新功能和安全修复。
安全加固:
- 使用加密和认证来保护FRP通道。
- 考虑设置防火墙规则,限制访问FRP服务的IP范围。
解决可能的问题:
- 如果遇到连接问题,检查防火墙设置和网络配置。
- 查看FRP的日志文件以获取错误信息,帮助定位问题。
安装与配置 FRP(Fast Reverse Proxy)
FRP 是一个高性能的反向代理应用,用于实现内网穿透。此文档指导您如何安装、配置,并理解 FRP 的基本工作原理。
我用的是最新版的,并且希望后期能阅读源码并且调试
准备两台机器,在公司配置一台肉机(又称堡垒机或跳板机),为这一台服务器(或PC)买一个公网IP(或使用公司线有公网IP),若想最大程度提高公网IP的使用率,在肉鸡前也可以设置一台代理服务器,使用请求转发的形式,将形如ssh等远程访问的请求转发到肉鸡上。此时我们可以先访问肉鸡(ssh或其他),登录到肉鸡后再访问公司内部的PC。
补充:内网穿透指的是通过互联网访问局域网的一种技术手段
在进行 FRP 部署前,您需要准备两台机器:一台位于公司内部网络的机器(称为“跳板机”或“肉机”),另一台具有公网 IP 地址的服务器。若需提高公网 IP 使用效率,可在跳板机前设置代理服务器进行请求转发。通过这种配置,您可先访问跳板机,然后从跳板机访问公司内部网络的其他计算机。
frp的作用和原理:
除了常规内网穿透方式以外,使用frp技术进行内网穿透也是非常好用的,frp而且最大的优势在于可以蹭公网IP。
frp是如何实现的:首先frp分客户端和服务端,通过分别在客户端和服务端安装配置frp,达到内网穿透的效果。一般被访问的PC上安装客户端程序,在拥有公网ip(或与互联网连通)的PC上安装服务器程序。拓扑图如下:
FRP 通过客户端和服务端的配合实现内网穿透,允许用户借助公网 IP 访问内部网络资源。
FRP 部署步骤
获取 FRP:
$ git clone https://github.com/fatedier/frp; cd frp $ make build
此步骤在服务器和客户端都需要执行。
在服务器上运行 FRP 服务端:
$ ./bin/frps -c ./conf/frps.toml
-c
参数用于指定配置文件路径。
$ ./bin/frps -c ./conf/frps.toml
2023/11/25 10:42:55 [I] [root.go:104] frps uses config file: ./conf/frps.toml
2023/11/25 10:42:55 [I] [service.go:206] frps tcp listen on 0.0.0.0:7000
2023/11/25 10:42:55 [I] [root.go:113] frps started successfully
2023/11/25 10:43:13 [I] [service.go:558] [7ac9081dcfd23eeb] client login info: ip [14.155.89.68:56775] version [0.52.3] hostname [] os [linux] arch [amd64]
2023/11/25 10:43:13 [I] [tcp.go:82] [7ac9081dcfd23eeb] [test-tcp] tcp proxy listen port [6000]
2023/11/25 10:43:13 [I] [control.go:394] [7ac9081dcfd23eeb] new proxy [test-tcp] type [tcp] success
2023/11/25 10:43:17 [I] [proxy.go:204] [7ac9081dcfd23eeb] [test-tcp] get a user connection [14.155.89.68:56779]
2023/11/25 10:43:19 [I] [proxy.go:204] [7ac9081dcfd23eeb] [test-tcp] get a user connection [221.12.131.95:29892]
$ ./bin/frps -c ./conf/frps.toml
- 这是启动
frps
的命令,其中-c
参数指定配置文件./conf/frps.toml
。
- 这是启动
2023/11/25 10:42:55 [I] [root.go:104] frps uses config file: ./conf/frps.toml
- 日志记录了
frps
正在使用指定的配置文件。
- 日志记录了
2023/11/25 10:42:55 [I] [service.go:206] frps tcp listen on 0.0.0.0:7000
- 服务器开始在 TCP 端口 7000 上监听,
0.0.0.0
表示监听所有网络接口。
- 服务器开始在 TCP 端口 7000 上监听,
2023/11/25 10:42:55 [I] [root.go:113] frps started successfully
- 表明
frps
服务器已成功启动。
- 表明
2023/11/25 10:43:13 [I] [service.go:558] [7ac9081dcfd23eeb] client login info: ip [14.155.89.68:56775] version [0.52.3] hostname [] os [linux] arch [amd64]
- 一名客户端已连接到服务器。客户端的 IP 地址是
14.155.89.68
,端口号是56775
。客户端使用的frp
版本是0.52.3
,操作系统是 Linux,处理器架构是 amd64。
- 一名客户端已连接到服务器。客户端的 IP 地址是
2023/11/25 10:43:13 [I] [tcp.go:82] [7ac9081dcfd23eeb] [test-tcp] tcp proxy listen port [6000]
- 服务器为名为
test-tcp
的 TCP 代理创建了监听端口6000
。
- 服务器为名为
2023/11/25 10:43:13 [I] [control.go:394] [7ac9081dcfd23eeb] new proxy [test-tcp] type [tcp] success
- 成功创建了新的 TCP 代理
test-tcp
。
- 成功创建了新的 TCP 代理
2023/11/25 10:43:17 [I] [proxy.go:204] [7ac9081dcfd23eeb] [test-tcp] get a user connection [14.155.89.68:56779]
test-tcp
代理收到了来自 IP 地址14.155.89.68
,端口56779
的用户连接。
2023/11/25 10:43:19 [I] [proxy.go:204] [7ac9081dcfd23eeb] [test-tcp] get a user connection [221.12.131.95:29892]
- 另一个用户连接到
test-tcp
代理,IP 地址是221.12.131.95
,端口号是29892
- 另一个用户连接到
服务端日志解读:
frps tcp listen on 0.0.0.0:7000
表示服务端开始在 TCP 端口 7000 上监听。- 客户端连接信息、代理创建成功等日志项表明 FRP 服务端正常运行。
在客户端运行 FRP 客户端:
- 客户端配置同样需要指定配置文件。
- 客户端成功连接后,您可以通过设置的端口和地址访问内网资源。
下面是在客户端(对应的是 OpenIM Server 的对应的 GPU 服务)
$ ./bin/frps -c ./conf/frps.toml
System 部署
通过 Systemd 服务管理,可以实现 FRP 服务的自动启动和重启,从而解决了使用 nohup
在后台运行时电脑重启导致服务中断的问题。
服务端 Server 部署
重命名并移动 FRP 文件: 将 FRP 服务端程序和配置文件重命名并移动到系统目录,以便于管理。
$ cp ./bin/frps /usr/bin/frpservice $ sudo cp ./conf/frps.toml /etc/frpservice.toml
创建 Systemd 服务文件: 使用文本编辑器创建一个新的服务文件
frpservice.service
。$ sudo vim /lib/systemd/system/frpservice.service
服务文件内容: 在服务文件中添加以下内容:
[Unit] Description=frpservice After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/bin/frpservice -c /etc/frpservice.toml ExecReload=/usr/bin/frpservice reload -c /etc/frpservice.toml [Install] WantedBy=multi-user.target
启用并启动服务: 使服务文件具有执行权限,启用并启动 FRP 服务。
$ sudo chmod 777 /lib/systemd/system/frpservice.service $ systemctl enable frpservice.service $ systemctl start frpservice.service
FRP 的 Web 访问
FRP 支持通过 Web 访问内网资源,可以使用格式 http://域名或IP:remote_port
访问。
客户端配置
在客户端配置 FRP:
配置文件中需指定本地 Web 服务的端口(如 80)和远程访问端口(如 8080)。
[web] type = tcp local_ip = 127.0.0.1 local_port = 80 remote_port = 8080
客户端 Systemd 部署
为客户端的 FRP 也创建一个 Systemd 服务,以便实现自动启动和重启。
重命名并移动 FRP 客户端文件: 将客户端程序和配置文件移动到系统目录。
$ sudo cp ./bin/frpc /usr/bin/frpcservice $ sudo cp ./conf/frpc.ini /etc/frpcservice.ini
创建 Systemd 服务文件: 编辑客户端的服务文件
frpcservice.service
。$ sudo vim /lib/systemd/system/frpcservice.service
服务文件内容: 类似服务端,添加以下内容:
[Unit] Description=frpcservice After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/bin/frpcservice -c /etc/frpcservice.ini [Install] WantedBy=multi-user.target
启用并启动服务: 同服务端操作,赋予执行权限,启用并启动服务。
$ sudo chmod 777 /lib/systemd/system/frpcservice.service $ systemctl enable frpcservice.service $ systemctl start frpcservice.service
查看日志
直接查看控制台输出
如果您直接在控制台运行 FRP,日志将直接输出到控制台。这适用于在测试或调试时运行 FRP。
使用日志文件
FRP 支持将日志输出到文件。您可以在 FRP 的配置文件中设置日志文件的路径。例如,对于服务端(frps
),可以在 frps.ini
文件中设置:
[common]
log_file = /var/log/frps.log
对于客户端(frpc
),在 frpc.ini
文件中设置:
log_file = /var/log/frpc.log
设置后,您可以使用任何文本编辑器或命令行工具(如 cat
, less
, tail
)查看这些日志文件。例如:
tail -f /var/log/frps.log
使用 Systemd 服务的日志
如果您通过 Systemd 服务运行 FRP,可以使用 journalctl
命令查看日志。例如,如果您的服务名为 frpservice
,可以使用以下命令:
journalctl -u frpservice
为了实时跟踪日志,可以添加 -f
参数:
journalctl -fu frpservice
日志级别
确保在 FRP 的配置文件中设置了适当的日志级别。日志级别决定了记录哪些类型的信息,例如 info
, warn
, error
等。
日志切割和管理
对于长期运行的服务,考虑使用日志切割工具(如 logrotate
)来管理日志文件的大小和数量,避免日志文件过大。