frp 学习以及实践

公司内部有一台 GPU ,需要供外网访问,想到了一个非常流行的开源项目 frp ,今天来学习一下 frp 。

要实现公司内部GPU服务器供外网访问,FRP(Fast Reverse Proxy)是一个很好的解决方案。FRP 是一个高性能的反向代理应用,可以帮助你轻松地将内网服务暴露到公网。

这一期是一个简单的使用教程,下一期将会学习 frp 项目,学习源码架构设计

学习 FRP

  1. 理解FRP的基本概念:了解FRP的工作原理,包括客户端(frpc)和服务端(frps)之间的交互方式。
  2. 阅读官方文档:FRP的GitHub页面open in new window提供了详细的安装指南和配置说明,这是学习FRP的最佳起点。
  3. 掌握基本配置:学习如何配置FRP的服务端和客户端,理解不同配置项的含义和用途。
  4. 了解安全设置:熟悉如何通过加密和认证提高FRP的安全性。
  5. 探索高级功能:了解FRP的负载均衡、HTTP/HTTPS支持等高级功能。

实践 FRP

  1. 搭建FRP服务端

    • 在一台具有公网IP的服务器上部署FRP服务端(frps)。
    • 配置 frps.ini文件,设置监听端口、认证方式等。

    需要注意的是,新版本的已经没有用 ini 文件了,而使用的

  2. 配置FRP客户端

    • 在内网的GPU服务器上部署FRP客户端(frpc)。
    • 根据需要访问的服务(例如SSH、HTTP),在frpc.ini中配置相应的代理。
  3. 启动和测试

    • 启动FRP服务端和客户端。
    • 从外网测试是否能成功访问内网的GPU服务器。
  4. 监控和维护

    • 监控FRP服务的运行状态,确保稳定性。
    • 定期更新FRP以获得新功能和安全修复。
  5. 安全加固

    • 使用加密和认证来保护FRP通道。
    • 考虑设置防火墙规则,限制访问FRP服务的IP范围。
  6. 解决可能的问题

    • 如果遇到连接问题,检查防火墙设置和网络配置。
    • 查看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上安装服务器程序。拓扑图如下:

image-20231125104523412

FRP 通过客户端和服务端的配合实现内网穿透,允许用户借助公网 IP 访问内部网络资源。

FRP 部署步骤

  1. 获取 FRP:

    $ git clone https://github.com/fatedier/frp; cd frp
    $ make build
    

    此步骤在服务器和客户端都需要执行。

  2. 在服务器上运行 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]
  1. $ ./bin/frps -c ./conf/frps.toml

    • 这是启动 frps 的命令,其中 -c 参数指定配置文件 ./conf/frps.toml
  2. 2023/11/25 10:42:55 [I] [root.go:104] frps uses config file: ./conf/frps.toml

    • 日志记录了 frps 正在使用指定的配置文件。
  3. 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 表示监听所有网络接口。
  4. 2023/11/25 10:42:55 [I] [root.go:113] frps started successfully

    • 表明 frps 服务器已成功启动。
  5. 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。
  6. 2023/11/25 10:43:13 [I] [tcp.go:82] [7ac9081dcfd23eeb] [test-tcp] tcp proxy listen port [6000]

    • 服务器为名为 test-tcp 的 TCP 代理创建了监听端口 6000
  7. 2023/11/25 10:43:13 [I] [control.go:394] [7ac9081dcfd23eeb] new proxy [test-tcp] type [tcp] success

    • 成功创建了新的 TCP 代理 test-tcp
  8. 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 的用户连接。
  9. 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
  10. 服务端日志解读:

    • frps tcp listen on 0.0.0.0:7000 表示服务端开始在 TCP 端口 7000 上监听。
    • 客户端连接信息、代理创建成功等日志项表明 FRP 服务端正常运行。
  11. 在客户端运行 FRP 客户端:

    • 客户端配置同样需要指定配置文件。
    • 客户端成功连接后,您可以通过设置的端口和地址访问内网资源。

下面是在客户端(对应的是 OpenIM Server 的对应的 GPU 服务)

$ ./bin/frps -c ./conf/frps.toml 

System 部署

通过 Systemd 服务管理,可以实现 FRP 服务的自动启动和重启,从而解决了使用 nohup 在后台运行时电脑重启导致服务中断的问题。

服务端 Server 部署

  1. 重命名并移动 FRP 文件: 将 FRP 服务端程序和配置文件重命名并移动到系统目录,以便于管理。

    $ cp ./bin/frps /usr/bin/frpservice
    $ sudo cp ./conf/frps.toml /etc/frpservice.toml
    
  2. 创建 Systemd 服务文件: 使用文本编辑器创建一个新的服务文件 frpservice.service

    $ sudo vim /lib/systemd/system/frpservice.service
    
  3. 服务文件内容: 在服务文件中添加以下内容:

    [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
    
  4. 启用并启动服务: 使服务文件具有执行权限,启用并启动 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 访问。

客户端配置

  1. 在客户端配置 FRP:

    配置文件中需指定本地 Web 服务的端口(如 80)和远程访问端口(如 8080)。

    [web]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 80
    remote_port = 8080
    

客户端 Systemd 部署

为客户端的 FRP 也创建一个 Systemd 服务,以便实现自动启动和重启。

  1. 重命名并移动 FRP 客户端文件: 将客户端程序和配置文件移动到系统目录。

    $ sudo cp ./bin/frpc /usr/bin/frpcservice
    $ sudo cp ./conf/frpc.ini /etc/frpcservice.ini
    
  2. 创建 Systemd 服务文件: 编辑客户端的服务文件 frpcservice.service

    $ sudo vim /lib/systemd/system/frpcservice.service
    
  3. 服务文件内容: 类似服务端,添加以下内容:

    [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
    
  4. 启用并启动服务: 同服务端操作,赋予执行权限,启用并启动服务。

    $ 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)来管理日志文件的大小和数量,避免日志文件过大。