FRP 基础使用

很久以前在上内网渗透的时候和学生讲过,FRP 之前也更新了,我也整理一下笔记。

Github 地址:https://github.com/fatedier/frp

官方文档地址:https://gofrp.org/zh-cn/docs/overview/

1 FRP 介绍

frp 是一款高性能的反向代理应用,专注于内网穿透。支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。

通过在具有公网 IP 的节点上部署 frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性:

  • 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
  • TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
  • 代理组间的负载均衡。
  • 端口复用:多个服务可以通过同一个服务端端口暴露。
  • P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
  • 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS / HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。
  • 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
  • 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。

2 FRP 安装与简单使用

2.1 安装

frp 采用 Go 语言编写,支持跨平台,只需下载适用于您平台的二进制文件即可执行,无需额外依赖。

可以从 GitHub 的 Release 页面中下载最新版本的客户端和服务器二进制文件:

image-20260107161114034

image-20260107161155327

2.2 简单使用

在使用前通常需要两台机器,分别作为客户端和服务端。

  1. 将 frpc 复制到内网服务所在的机器上。
  2. 将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

[!Note]

这里采用 VMware 虚拟机进行演示:

Kali Linux IP(Client):10.0.0.129

Windows IP(Server):10.0.0.1

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

默认 frps.toml 配置如下:

1
bindPort = 7000					# 服务端监听客户端连接的端口

默认 frpc.toml 配置如下:

1
2
3
4
5
6
7
8
9
10
11
# 【全局配置】服务端连接信息
serverAddr = "127.0.0.1" # frp 服务端的 IP 地址
serverPort = 7000 # frp 服务端的端口

# 【代理规则部分】具体的端口映射规则
[[proxies]] # 定义一个代理规则
name = "test-tcp" # 代理规则的名称
type = "tcp" # 代理的类型
localIP = "127.0.0.1" # 映射的本地服务的 IP 地址
localPort = 22 # 映射的本地服务的端口
remotePort = 6000 # frp 服务端对外开放的端口

根据 frpc.toml 的配置来看,Kali 和 Windows 肯定是连不上的,需要将 serverAddr 进行修改:

1
serverAddr = "10.0.0.1"

使用以下命令启动服务器:

1
start /B frps.exe -c frps.toml

image-20260107162653636

使用以下命令启动客户端:

1
./frpc -c ./frpc.toml

image-20260107162717682

使用 CMD 尝试在 Windows 上使用本地 6000 端口连接 Kali 的 SSH 服务:

1
ssh root@10.0.0.1 6000

image-20260107162911951

看着好像失败了,大概率是 Kali 没开 SSH 服务:

1
systemctl start ssh

再次尝试:

image-20260107163009718

连上了,但是 Kali 本身是不允许 root 用户远程登录的,这里大家可以自己试试。

3 FRP 持久化运行

如果需要在后台长期运行,建议结合其他工具,如 systemdsupervisor

systemd 是 Linux 主流系统自带的,更推荐。frp 文档中也是在 Linux 系统下使用 systemd 来管理 frps 服务,包括启动、停止、配置后台运行和设置开机自启动。

由于大部分 Linux 都自带了 systemd,如需安装直接使用 apt / yum 安装即可。这里将 Kali 作为 Client 进行编写,Server 同理(配置时记得将 # 后面的内容删除):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = FRP Client Service # 服务的描述名称
After = network.target syslog.target # 在网络服务(network.target)和系统日志服务(syslog.target)启动后再启动 frps

[Service]
Type = simple # 最常用,适合前台运行的程序,systemd 会接管其进程
User = root # 运行服务的用户(建议用 root,避免权限问题)
Restart = on-failure # 服务失败时自动重启
RestartSec = 5s # 重启间隔 5 秒
ExecStart = /usr/local/frp/frpc -c /usr/local/frp/frpc.toml # frpc 启动命令
ExecReload = /bin/kill -HUP $MAINPID # 重载配置的命令

[Install]
WantedBy = multi-user.target # 多用户模式下开机自启

编写一下文件:

1
vim /etc/systemd/system/frpc.service

将桌面的文件拷贝到对应路径下:

1
2
mv frp_0.66.0_linux_amd64 frp
mv frp /usr/local/

查看并启用 frpc 服务:

1
2
3
4
systemctl daemon-reload
systemctl start frpc
systemctl status frpc
systemctl enable frpc

image-20260107164800029

3.1 frps.services

frps.services 配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = FRP Server Service
After = network.target syslog.target

[Service]
Type = simple
User = root
Restart = on-failure
RestartSec = 5s
ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.toml
ExecReload = /bin/kill -HUP $MAINPID

[Install]
WantedBy = multi-user.target

3.2 frpc.services

frpc.services 配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = FRP Client Service
After = network.target syslog.target

[Service]
Type = simple
User = root
Restart = on-failure
RestartSec = 5s
ExecStart = /usr/local/frp/frpc -c /usr/local/frp/frpc.toml
ExecReload = /bin/kill -HUP $MAINPID

[Install]
WantedBy = multi-user.target

4 FRP 官方示例

4.1 通过 SSH 访问内网机器

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

1
bindPort = 7000

在需要被访问的内网机器上部署 frpc:部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 10.0.0.1。以下是示例配置:

1
2
3
4
5
6
7
8
9
serverAddr = "10.0.0.1"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
  • localIPlocalPort 配置为需要从公网访问的内网服务的地址和端口。
  • remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。

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

1
ssh kali@10.0.0.1 -p 6000

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

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

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

HTTPS 与此类似,但是需要注意,frp 的 https 代理需要本地服务是 HTTPS 服务,frps 端不会做 TLS 终止。

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

1
2
bindPort = 7000
vhostHTTPPort = 8080

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
serverAddr = "10.0.0.1"
serverPort = 7000

[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["www.yourdomain.com"]

[[proxies]]
name = "web2"
type = "http"
localPort = 8080
customDomains = ["www.yourdomain2.com"]

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

1
2
10.0.0.1 www.yourdomain.com
10.0.0.1 www.yourdomain2.com

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

image-20260107175627599

4.3 身份认证

目前 frpc 和 frps 之间支持两种身份验证方式,tokenoidc,默认为 token。这些认证方式允许您验证客户端与服务端之间的通信,并确保只有授权用户能够建立连接。

Token 身份认证是一种简单的身份认证方式,只需要在 frp 的客户端 frpc 和服务端 frps 配置文件中配置相同的 token 即可。

1
2
3
4
5
6
# frps.toml
bindPort = 7000
auth.token = "abc"

# frpc.toml
auth.token = "abc"

如果双方的 token 不一致则会出现 register control error

image-20260107182633087

frp(Added in v0.64.0)支持使用 tokenSource 从文件中加载认证 token,而不是在配置文件中硬编码。这个功能可以避免在配置文件中直接暴露敏感信息。

tokenSource 与 token 字段互斥,只能选择其中一种方式配置。

1
2
3
# frpc.toml
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/usr/local/frp/client_token"

5 FRP 常用配置

5.1 FRPS

1
2
bindPort = 7000
auth.token = "abc"

5.2 FRPC

1
2
3
4
5
6
7
8
9
10
11
12
13
serverAddr = "127.0.0.1"
serverPort = 7000
auth.token = "abc"

[[proxies]]
name = "admin"
type = "tcp"
remotePort = 8081

[proxies.plugin]
type = "socks5"
username = "admin"
password = "123456"

FRP 支持本地自己互连,这个即可自行形成代理服务器,然后使用 Proxifier / ProxyChains 连接即可:

image-20260107184437450

5.3 多级代理

Server:

1
bindPort = 7000

Target-1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# frpc.toml
serverAddr = "Server-IP"
serverPort = 7000

[[proxies]]
name = "admin"
type = "tcp"
remotePort = 8081

[proxies.plugin]
type = "socks5"
username = "admin"
password = "123456"

# frps.toml
bindPort = 7001

Target-2:

1
2
3
4
5
6
7
8
9
10
11
12
serverAddr = "Target-1"
serverPort = 7001

[[proxies]]
name = "admin"
type = "tcp"
remotePort = 8082

[proxies.plugin]
type = "socks5"
username = "admin"
password = "123456"

由于 ProxyChains 不支持代理链,这里可以使用 Proxifier 添加多级代理。

6 FRP 图形化工具

6.1 frpc-desktop

Github 地址:https://github.com/luckjiawei/frpc-desktop

渗透啥的肯定是以 Cli 为主,这里用用看 frpc-desktop,下载对应 frp 后进行基础配置:

image-20260107190123683

连接 frp 服务器:

image-20260107190130512

可以动态添加所需代理服务:

image-20260107190332818

image-20260107190433984

不过好像不支持 Socks5 隧道(也可能是我没找到)

6.2 frpmgr

Github 地址:https://github.com/koho/frpmgr

进行基础配置:

image-20260107190925319

配置 frp 服务器:

image-20260107191019832

运行 frpc 服务,创建 Socks5 隧道:

image-20260107191025895

image-20260107191136942

测试成功~

image-20260107191304525