Frp文档说明

作者1127小时前其他17

下载

您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。

部署

  1. 解压下载的压缩包。

  2. 将 frpc 复制到内网服务所在的机器上。

  3. 将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

开始使用!

  1. 编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。

  2. 使用以下命令启动服务器:./frps -c ./frps.toml

  3. 使用以下命令启动客户端:./frpc -c ./frpc.toml

  4. 如果需要在后台长期运行,建议结合其他工具,如 systemd 和 supervisor

如果您是 Windows 用户,需要在命令提示符中执行相同的命令。

有关如何编写配置文件,请参考 示例 部分中的内容。

完整的配置项说明,请参考 Reference 中的内容。


使用 systemd

此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

使用 systemd

此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

在 Linux 系统下,使用 systemd 可以方便地控制 frps 服务端的启动、停止、配置后台运行以及开机自启动。

以下是具体的操作步骤:

  1. 安装 systemd

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

    # 使用 yum 安装 systemd(CentOS/RHEL) 
    yum install systemd  
    
    # 使用 apt 安装 systemd(Debian/Ubuntu) 
    apt install systemd
  2. 创建 frps.service 文件

    使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。

    $ sudo vim /etc/systemd/system/frps.service

    写入内容

    [Unit] 
    # 服务名称,可自定义 
    Description = frp server 
    After = network.target syslog.target 
    Wants = network.target 
     
    [Service] 
    Type = simple 
    # 启动frps的命令,需修改为您的frps的安装路径 
    ExecStart = /path/to/frps -c /path/to/frps.toml 
     
    [Install] 
    WantedBy = multi-user.target
  3. 使用 systemd 命令管理 frps 服务

    # 启动frp 
    sudo systemctl start frps 
    # 停止frp 
    sudo systemctl stop frps 
    # 重启frp 
    sudo systemctl restart frps 
    # 查看frp状态 
    sudo systemctl status frps
  4. 设置 frps 开机自启动

    sudo systemctl enable frps

通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。

工作原理

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

代理

在 frp 中,一个代理对应一个需要公开访问的内网服务。一个客户端可以同时配置多个代理,以满足不同的需求。

代理类型

frp 支持多种代理类型,以适应不同的使用场景。以下是一些常见的代理类型:

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。

  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。

  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。

  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。

  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。

  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

每种代理类型适用于不同的使用情境,您可以根据需求选择合适的代理类型来配置 frp。

-----------------------------------------------------------------------------------

通过 SSH 访问内网机器

通过简单配置 TCP 类型的代理,使用户能够访问内网服务器。

步骤

  1. 在具有公网 IP 的机器上部署 frps

    部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

    bindPort = 7000
  2. 在需要被访问的内网机器上部署 frpc

    部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    
    [[proxies]] 
    name = "ssh" 
    type = "tcp" 
    localIP = "127.0.0.1" 
    localPort = 22 
    remotePort = 6000
  • localIP 和 localPort 配置为需要从公网访问的内网服务的地址和端口。

  • remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。

  • 启动 frps 和 frpc

  • 通过 SSH 访问内网机器

    使用以下命令通过 SSH 访问内网机器,假设用户名为 test:

    ssh -o Port=6000 [email protected]

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

  • 多个 SSH 服务复用同一端口

    通过使用 tcpmux 类型的代理,您可以实现多个 SSH 服务通过同一端口进行暴露。这种方法还适用于任何支持 HTTP Connect 代理连接方式的客户端,以实现端口的复用。

    步骤

  1. 在具有公网 IP 的机器上部署 frps

    修改 frps.toml 文件以包含以下内容(这里使用了最简化的配置):

    bindPort = 7000 
    tcpmuxHTTPConnectPort = 5002
  2. 在内网机器 A 上部署 frpc

    创建 frpc 配置文件,例如 frpc.toml,然后将以下内容添加到配置文件中:

    serverAddr = "x.x.x.x" 
    serverPort = 7000
      
    [[proxies]] 
    name = "ssh1" 
    type = "tcpmux" 
    multiplexer = "httpconnect" 
    customDomains = ["machine-a.example.com"] 
    localIP = "127.0.0.1" 
    localPort = 22
  3. 在内网机器 B 上部署另一个 frpc

    创建 frpc 配置文件,例如 frpc.toml,然后将以下内容添加到配置文件中:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    
    [[proxies]] 
    name = "ssh2" 
    type = "tcpmux" 
    multiplexer = "httpconnect" 
    customDomains = ["machine-b.example.com"] 
    localIP = "127.0.0.1" 
    localPort = 22
  4. 通过 SSH ProxyCommand 访问内网机器 A

    使用 SSH ProxyCommand 访问内网机器 A,假设用户名为 test。使用以下命令:

    ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]

    要访问内网机器 B,只需更改域名,假设用户名仍然为 test:

    ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]

通过按照以上步骤进行配置,您可以实现多个 SSH 服务复用同一端口,以便在具有公网 IP 的机器上进行访问。

通过自定义域名访问内网的 Web 服务

通过简单配置 HTTP 类型的代理,您可以让用户通过自定义域名访问内网的 Web 服务。

HTTP 类型的代理非常适合将内网的 Web 服务通过自定义域名提供给外部用户。相比于 TCP 类型代理,HTTP 代理不仅可以复用端口,还提供了基于 HTTP 协议的许多功能。

HTTPS 与此类似,但是需要注意,frp 的 https 代理需要本地服务是 HTTPS 服务,frps 端不会做 TLS 终止。也可以结合 https2http 插件来实现将本地的 HTTP 服务以 HTTPS 协议暴露出去。

步骤

  1. 配置 frps.toml

    在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080:

    bindPort = 7000 
    vhostHTTPPort = 8080

    如果需要配置 HTTPS 代理,还需要设置 vhostHTTPSPort

  2. 配置 frpc.toml

    在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:

    serverAddr = "x.x.x.x" 
    serverPort = 7000 
     
    [[proxies]] 
    name = "web" 
    type = "http" 
    localPort = 80 
    customDomains = ["www.yourdomain.com"] 
     
    [[proxies]] 
    name = "web2" 
    type = "http" 
    localPort = 8080 
    customDomains = ["www.yourdomain2.com"]
  3. 启动 frps 和 frpc

  4. 域名解析

    将 www.yourdomain.com 和 www.yourdomain2.com 的域名 A 记录解析到服务器的 IP 地址 x.x.x.x。如果服务器已经有对应的域名,您还可以将 CNAME 记录解析到原始域名。另外,通过修改 HTTP 请求的 Host 字段也可以实现相同的效果。

  5. 通过浏览器访问

    使用浏览器访问 http://www.yourdomain.com:8080 即可访问内网机器上的 80 端口服务,访问 http://www.yourdomain2.com:8080 可以访问内网机器上的 8080 端口服务。

转发 DNS 查询请求

本示例演示如何通过简单配置 UDP 类型的代理来实现 DNS 查询请求的转发。

DNS 查询请求通常使用 UDP 协议,而 frp 支持对内网 UDP 服务的穿透,配置方式与 TCP 类似。

步骤

  1. 配置 frps.toml

    在 frps.toml 文件中添加以下内容:

    bindPort = 7000
  2. 配置 frpc.toml

    在 frpc.toml 文件中添加以下内容:

    serverAddr = "x.x.x.x" 
    serverPort = 7000 
     
    [[proxies]] 
    name = "dns" 
    type = "udp" 
    localIP = "8.8.8.8" 
    localPort = 53 
    remotePort = 6000

    请注意,这里示例中反代了 Google 的 DNS 查询服务器的地址,仅用于测试 UDP 代理,并没有实际意义。

  3. 启动 frps 和 frpc

    分别启动 frps 和 frpc。

  4. 测试 DNS 查询请求

    使用以下命令通过 dig 工具测试 UDP 包转发是否成功,预期会返回 www.baidu.com 域名的解析结果:

    dig @x.x.x.x -p 6000 www.baidu.com

转发 Unix 域套接字

通过配置 Unix 域套接字客户端插件,您可以使用 TCP 端口访问内网的 Unix 域套接字服务,例如 Docker Daemon。

步骤

  1. 配置 frps.toml

    在 frps.toml 文件中添加以下内容:

    bindPort = 7000
  2. 配置 frpc.toml

    在 frpc.toml 文件中添加以下内容,确保设置正确的 Unix 域套接字路径:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    
    [[proxies]] 
    name = "unix_domain_socket" 
    type = "tcp" 
    remotePort = 6000 
    
    [proxies.plugin] 
    type = "unix_domain_socket" 
    # Unix 域套接字路径 
    unixPath = "/var/run/docker.sock"
  3. 启动 frps 和 frpc

  4. 使用 curl 查看 Docker 版本信息

    curl http://x.x.x.x:6000/version

对外提供简单的文件访问服务

通过配置 static_file 客户端插件,您可以将本地文件暴露在公网上,以供其他人访问。

通过使用 static_file 插件,您可以轻松地提供一个基于 HTTP 的文件访问服务,让其他人可以访问您指定的文件。

步骤

  1. 配置 frps.toml

    在 frps.toml 文件中添加以下内容:

    bindPort = 7000
  2. 配置 frpc.toml

    在 frpc.toml 文件中添加以下内容,确保设置合适的文件路径、用户名和密码:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    
    [[proxies]] 
    name = "test_static_file" 
    type = "tcp" 
    remotePort = 6000 
    
    [proxies.plugin] 
    type = "static_file" 
    # 本地文件目录,对外提供访问 
    localPath = "/tmp/file" 
    # URL 中的前缀,将被去除,保留的内容即为要访问的文件路径 
    stripPrefix = "static" 
    httpUser = "abc" 
    httpPassword = "abc"

    请根据实际情况修改 localPathstripPrefixhttpUser 和 httpPassword

  3. 启动 frps 和 frpc

  4. 通过浏览器访问文件

    使用浏览器访问 http://x.x.x.x:6000/static/,以查看位于 /tmp/file 目录下的文件。系统会要求输入您设置的用户名和密码。

为本地 HTTP 服务启用 HTTPS

使用 https2http 插件将本地 HTTP 服务转换为 HTTPS 服务,以供外部访问。

步骤

  1. 配置 frps.toml

    bindPort = 7000 
    vhostHTTPSPort = 443
  2. 配置 frpc.toml

    serverAddr = "x.x.x.x" 
    serverPort = 7000
      
    [[proxies]] 
    name = "test_htts2http" 
    type = "https" 
    customDomains = ["test.yourdomain.com"] 
     
    [proxies.plugin] 
    type = "https2http" 
    localAddr = "127.0.0.1:80"  
    # HTTPS 证书相关的配置 
    crtPath = "./server.crt" 
    keyPath = "./server.key" 
    hostHeaderRewrite = "127.0.0.1" 
    requestHeaders.set.x-from-where = "frp"

    请注意,您需要根据您的域名和证书路径自行更改上述配置。

  3. 启动 frps 和 frpc

  4. 访问 HTTPS 服务

    打开您的 Web 浏览器,访问 https://test.yourdomain.com

通过按照以上步骤进行配置,您将能够为本地 HTTP 服务启用 HTTPS,以实现安全的外部访问。

安全地暴露内网服务

通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。

某些内网服务,如果直接暴露在公网上,可能存在安全风险。使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端。

步骤

  1. 配置 frps.toml

    在 frps.toml 文件中添加以下内容:

    bindPort = 7000
  2. 部署 frpc 客户端并配置

    在需要将内网服务暴露到公网的机器上部署 frpc,并创建如下配置:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    [[proxies]] 
    name = "secret_ssh" 
    type = "stcp" 
    # 只有与此处设置的 secretKey 一致的用户才能访问此服务 
    secretKey = "abcdefg" 
    localIP = "127.0.0.1" 
    localPort = 22
  3. 在访问者机器上部署并配置 frpc

    在想要访问内网服务的机器上也部署 frpc,并创建如下配置:

    serverAddr = "x.x.x.x" 
    serverPort = 7000  
    [[visitors]] 
    name = "secret_ssh_visitor" 
    type = "stcp" 
    # 要访问的 stcp 代理的名字 
    serverName = "secret_ssh" 
    secretKey = "abcdefg" 
    # 绑定本地端口以访问 SSH 服务 
    bindAddr = "127.0.0.1" 
    bindPort = 6000
  4. 通过 SSH 访问内网机器

    使用以下命令通过 SSH 访问内网机器,假设用户名为 test:

    ssh -o Port=6000 [email protected]

点对点内网穿透

这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。

frp 提供了一种新的代理类型 xtcp,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。

与 stcp 类似,使用 xtcp 需要在两端都部署 frpc 以建立直接连接。

需要注意的是,xtcp 并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp 代理。

步骤

  1. 配置需要暴露到外网的机器上的 frpc.toml 文件

    在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口以及共享密钥 (secretKey),以及本地服务的 IP 地址和端口:

    serverAddr = "x.x.x.x" 
    serverPort = 7000 
    # 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器 # 
    natHoleStunServer = "xxx"  
    [[proxies]] name = "p2p_ssh" 
    type = "xtcp" 
    # 只有共享密钥 (secretKey) 与服务器端一致的用户才能访问该服务 
    secretKey = "abcdefg" 
    localIP = "127.0.0.1" 
    localPort = 22
  2. 在想要访问内网服务的机器上部署 frpc

    在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器地址和端口,共享密钥 (secretKey) 以及要访问的 P2P 代理的名称:

    serverAddr = "x.x.x.x" serverPort = 7000 # 如果默认的 STUN 服务器不可用,可以配置一个新的 STUN 服务器 # natHoleStunServer = "xxx"  [[visitors]] name = "p2p_ssh_visitor" type = "xtcp" # 要访问的 P2P 代理的名称 serverName = "p2p_ssh" secretKey = "abcdefg" # 绑定本地端口以访问 SSH 服务 bindAddr = "127.0.0.1" bindPort = 6000 # 如果需要自动保持隧道打开,将其设置为 true # keepTunnelOpen = false
  3. 通过 SSH 访问内网机器

    使用 SSH 命令访问内网机器,假设用户名为 test

    ssh -oPort=6000 [email protected]

虚拟网络 (VirtualNet)

使用 virtual_net 插件创建虚拟网络连接,实现客户端之间的 IP 层通信。

注意:VirtualNet 是一个 Alpha 阶段的特性,目前不稳定,其配置方式和功能可能会在后续版本中随时调整变更。请勿在生产环境中使用此功能,仅建议用于测试和评估目的。

概述

虚拟网络(VirtualNet)功能是 frp v0.62.0 中引入的 Alpha 特性,它允许 frp 通过 TUN 接口创建和管理客户端与访问者之间的虚拟网络连接,实现设备间的完整网络连通性。

本示例将展示如何配置和使用 VirtualNet 功能。更多详细信息和工作原理,请参考 虚拟网络 (VirtualNet) 特性文档。

启用 VirtualNet

首先,由于 VirtualNet 目前是一个 Alpha 特性,您需要在配置中通过特性门控来启用它:

# frpc.toml featureGates = { VirtualNet = true }

示例配置

以下示例展示如何在两台机器之间建立虚拟网络连接:

服务端配置 (机器 A)

  1. 在 frpc.toml 中配置虚拟网络地址

    # frpc.toml (服务端) 
    serverAddr = "x.x.x.x" 
    serverPort = 7000 
    featureGates = { VirtualNet = true }  
    # 配置虚拟网络接口 
    virtualNet.address = "100.86.0.1/24"  
    [[proxies]] 
    name = "vnet-server" 
    type = "stcp" 
    secretKey = "your-secret-key" 
    [proxies.plugin] 
    type = "virtual_net"
  2. 启动 frpc

    sudo frpc -c frpc.toml

    注意:创建 TUN 接口需要 root 权限

客户端配置 (机器 B)

  1. 在 frpc.toml 中配置访问者

    # frpc.toml (客户端) 
    serverAddr = "x.x.x.x" 
    serverPort = 7000 
    featureGates = { VirtualNet = true }  
    # 配置虚拟网络接口 
    virtualNet.address = "100.86.0.2/24"  
    [[visitors]] 
    name = "vnet-visitor" 
    type = "stcp" 
    serverName = "vnet-server" 
    secretKey = "your-secret-key" 
    bindPort = -1 
    [visitors.plugin] 
    type = "virtual_net" 
    destinationIP = "100.86.0.1"
  2. 启动 frpc

    sudo frpc -c frpc.toml

测试连接

成功配置后,您可以从机器 B 通过虚拟 IP 地址访问机器 A:

# 在机器 B 上执行 ping 100.86.0.1

如果连接正常,您将看到来自 100.86.0.1 的响应。

限制和要求

  • Alpha 阶段特性:VirtualNet 是实验性功能,配置和 API 可能在未来版本中变化,不建议在生产环境中使用

  • 权限要求:创建 TUN 接口需要提升的权限(root/管理员)

  • 平台支持:目前仅支持 Linux 和 macOS

  • 默认状态:作为 Alpha 特性,VirtualNet 默认是禁用的

TCP & UDP

了解 frp TCPUDP 类型的代理。

TCP 和 UDP 是 frp 中两种最基础的代理类型,用于代理监听在 TCP 和 UDP 端口的服务。

TCP 代理

[[proxies]] 
name = "ssh" 
type = "tcp" 
localIP = "127.0.0.1" 
localPort = 22 
remotePort = 6000

UDP 代理

[[proxies]] 
name = "dns" 
type = "udp" 
localIP = "127.0.0.1" 
localPort = 53 
remotePort = 6000

通过 type 指定代理类型。

frp 会为本地服务的端口,在 frps 所在的服务端监听对应的远程端口,将远程端口接收到的连接和本地服务的端口关联,透传流量,从而实现让用户在外部访问到内部服务。


相关文章

Nginx配置通用反向代理指定域名到指定服务

Nginx配置通用反向代理指定域名到指定服务

前言首先我们先看一下要达到的效果,我们希望访问某一个域名自动指向本地启动的某一个端口的服务(我们就以域名 <number>.localapp.com 为例),效果如下:8080.local...

如何安全快速地将硬盘接入iStoreOS系统

如何安全快速地将硬盘接入iStoreOS系统

大家好,今天我要给大伙分享一个超级实用的操作指南,就是如何安全快速地将硬盘接入 iStoreOS 系统!这是决定了iStoreOS能否成为家用服务器的关键一步,没有这一步,iStoreOS也就只能和O...

一些网址搜集

Jack's 新学习基地https://nstudy.org/openwrt固件下载地址https://firmware-selector.openwrt.org/ 7~10代核显驱动:htt...

MacOS程序员配置清单

作为一个程序员,我来分享一下我的装机经历。网络工具原神,启动!安装原神并启动(上网助手),这个不细说。zerotier(局域网内网穿透)proxyman(抓包)homebrew官网 Mac所...

UNRAID 上部署多个 Streamlit 应用

✅ 部署多个 Streamlit 实例的关键点项目要做的事情示例(第二个实例)📁 应用目录每个应用要有独立的目录/mnt/user/appdata/streamlit_app2/📄 app.py 内容...

UNRAID 系统中安装 Docker 版的 MySQL

在 UNRAID 系统中安装 Docker 版的 MySQL,可以通过图形界面(Unraid Web UI)轻松完成。下面是 详细的步骤和方法:✅ 前提条件已安装并运行 UNRAID 系统UNRAID...