Frp

简单、高效的内网穿透工具


介绍

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

功能特性

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

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

安装

根据操作系统和架构,从 Github 的 Release 页面下载最新的程序。

解压缩下载的压缩包,将其中的 frpc 拷贝到内网服务所在的机器上,将 frps 拷贝到具有公网 IP 的机器上,放置在任意目录。

$ wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
$ tar -xzvf frp_0.43.0_linux_amd64.tar.gz
$ sudo mv frp_0.43.0_linux_amd64/frps /usr/local/bin/
$ sudo mv frp_0.43.0_linux_amd64/frpc /usr/local/bin/
$ sudo mkdir /etc/frps
$ sudo mv frp_0.43.0_linux_amd64/frps.ini /etc/frps/
$ sudo mv frp_0.43.0_linux_amd64/frps_full.ini /etc/frps/
$ /usr/local/bin/frps -c /etc/frps/frps.ini

文件涵义

.
├── frpc            客户端程序
├── frpc_full.ini   客户端完整配置文件
├── frpc.ini        客户端简易配置文件
├── frps            服务端程序
├── frps_full.ini   服务端完整配置文件
└── frps.ini        服务端简易配置文件

frp 采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。

开始使用

编写配置文件,先通过 ./frps -c ./frps.ini 启动服务端,再通过 ./frpc -c ./frpc.ini 启动客户端。如果需要在后台长期运行,建议结合其他工具使用,例如 systemdsupervisor

如果是 Windows 用户,需要在 cmd 终端中执行命令。

配置文件如何编写可以参考 示例 中的内容。

systemd

$ vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description=frp server
After=network.target syslog.target
Wants=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart=/path/to/frps -c /path/to/frps.ini
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

为了能在服务运行失败后能一直重试,需要加上以下三行

Restart=always
RestartSec=5
StartLimitIntervalSec=0
$ systemctl enable frps
$ systemctl start frps
$ systemctl status frps

通过 SSH 访问局域网中的计算机

这个示例通过简单配置 TCP 类型的代理让用户访问到内网的服务器。

  1. 在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

    [common]
    bind_port = 7000
    
  2. 在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000
    

    local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

  3. 分别启动 frps 和 frpc。

  4. 通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 test@x.x.x.x

    frp 会将请求 x.x.x.x:6000 的流量转发到内网机器的 22 端口。

参考资料

文档: https://gofrp.org/

源代码: https://github.com/fatedier/frp