Frp文档说明
下载
您可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件。所有文件都打包在一个压缩包中,还包含了一份完整的配置参数说明。
部署
解压下载的压缩包。
将
frpc复制到内网服务所在的机器上。将
frps复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。
开始使用!
编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
使用以下命令启动服务器:
./frps -c ./frps.toml。使用以下命令启动客户端:
./frpc -c ./frpc.toml。如果需要在后台长期运行,建议结合其他工具,如 systemd 和
supervisor。
如果您是 Windows 用户,需要在命令提示符中执行相同的命令。
有关如何编写配置文件,请参考 示例 部分中的内容。
完整的配置项说明,请参考 Reference 中的内容。
使用 systemd
此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。
使用 systemd
此示例演示如何在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。
在 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
写入内容
[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
使用 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
通过遵循上述步骤,您可以轻松地使用 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 类型的代理,使用户能够访问内网服务器。
步骤
在具有公网 IP 的机器上部署 frps
部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:
bindPort = 7000
在需要被访问的内网机器上部署 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 代理连接方式的客户端,以实现端口的复用。
步骤
在具有公网 IP 的机器上部署 frps
修改 frps.toml 文件以包含以下内容(这里使用了最简化的配置):
bindPort = 7000 tcpmuxHTTPConnectPort = 5002
在内网机器 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
在内网机器 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
通过 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 协议暴露出去。
步骤
配置 frps.toml
在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080:
bindPort = 7000 vhostHTTPPort = 8080
如果需要配置 HTTPS 代理,还需要设置
vhostHTTPSPort。配置 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"]
启动 frps 和 frpc
域名解析
将
www.yourdomain.com和www.yourdomain2.com的域名 A 记录解析到服务器的 IP 地址x.x.x.x。如果服务器已经有对应的域名,您还可以将 CNAME 记录解析到原始域名。另外,通过修改 HTTP 请求的 Host 字段也可以实现相同的效果。通过浏览器访问
使用浏览器访问
http://www.yourdomain.com:8080即可访问内网机器上的 80 端口服务,访问http://www.yourdomain2.com:8080可以访问内网机器上的 8080 端口服务。
转发 DNS 查询请求
本示例演示如何通过简单配置 UDP 类型的代理来实现 DNS 查询请求的转发。
DNS 查询请求通常使用 UDP 协议,而 frp 支持对内网 UDP 服务的穿透,配置方式与 TCP 类似。
步骤
配置 frps.toml
在 frps.toml 文件中添加以下内容:
bindPort = 7000
配置 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 代理,并没有实际意义。
启动 frps 和 frpc
分别启动 frps 和 frpc。
测试 DNS 查询请求
使用以下命令通过
dig工具测试 UDP 包转发是否成功,预期会返回www.baidu.com域名的解析结果:dig @x.x.x.x -p 6000 www.baidu.com
转发 Unix 域套接字
通过配置 Unix 域套接字客户端插件,您可以使用 TCP 端口访问内网的 Unix 域套接字服务,例如 Docker Daemon。
步骤
配置 frps.toml
在 frps.toml 文件中添加以下内容:
bindPort = 7000
配置 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"
启动 frps 和 frpc
使用 curl 查看 Docker 版本信息
curl http://x.x.x.x:6000/version
对外提供简单的文件访问服务
通过配置 static_file 客户端插件,您可以将本地文件暴露在公网上,以供其他人访问。
通过使用 static_file 插件,您可以轻松地提供一个基于 HTTP 的文件访问服务,让其他人可以访问您指定的文件。
步骤
配置 frps.toml
在 frps.toml 文件中添加以下内容:
bindPort = 7000
配置 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"
请根据实际情况修改
localPath、stripPrefix、httpUser和httpPassword。启动 frps 和 frpc
通过浏览器访问文件
使用浏览器访问
http://x.x.x.x:6000/static/,以查看位于/tmp/file目录下的文件。系统会要求输入您设置的用户名和密码。
为本地 HTTP 服务启用 HTTPS
使用 https2http 插件将本地 HTTP 服务转换为 HTTPS 服务,以供外部访问。
步骤
配置 frps.toml
bindPort = 7000 vhostHTTPSPort = 443
配置 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"
请注意,您需要根据您的域名和证书路径自行更改上述配置。
启动 frps 和 frpc
访问 HTTPS 服务
打开您的 Web 浏览器,访问
https://test.yourdomain.com。
通过按照以上步骤进行配置,您将能够为本地 HTTP 服务启用 HTTPS,以实现安全的外部访问。
安全地暴露内网服务
通过创建一个只有授权用户能够访问的 SSH 服务代理,实现内网服务的安全暴露。
某些内网服务,如果直接暴露在公网上,可能存在安全风险。使用 stcp(secret tcp) 类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端。
步骤
配置 frps.toml
在 frps.toml 文件中添加以下内容:
bindPort = 7000
部署 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
在访问者机器上部署并配置 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
通过 SSH 访问内网机器
使用以下命令通过 SSH 访问内网机器,假设用户名为 test:
ssh -o Port=6000 [email protected]
点对点内网穿透
这个示例将演示如何通过点对点 (P2P) 连接来访问内网服务,流量不会通过服务器中转。
frp 提供了一种新的代理类型 xtcp,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。
与 stcp 类似,使用 xtcp 需要在两端都部署 frpc 以建立直接连接。
需要注意的是,xtcp 并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp 代理。
步骤
配置需要暴露到外网的机器上的 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
在想要访问内网服务的机器上部署 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
通过 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)
在 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"启动 frpc
sudo frpc -c frpc.toml
注意:创建 TUN 接口需要 root 权限
客户端配置 (机器 B)
在 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"启动 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 TCP, UDP 类型的代理。
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 所在的服务端监听对应的远程端口,将远程端口接收到的连接和本地服务的端口关联,透传流量,从而实现让用户在外部访问到内部服务。

