frp 内网穿透工具详细使用指南

一、frp 简介

frp 是一个高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,能够帮助用户轻松实现内网穿透。它的核心思想是将内网服务通过一台具有公网 IP 的服务器暴露出去,流量经过服务器转发或通过 P2P 直连。

项目地址https://github.com/fatedier/frp

主要特性

  • 支持多种代理类型(TCP、UDP、HTTP、HTTPS、STCP、XTCP)

  • 支持负载均衡、健康检查

  • 提供身份验证和 TLS 加密

  • 支持 P2P 点对点穿透(XTCP)

  • 提供可视化仪表盘,便于监控

组件说明

  • frps:服务端程序,部署在具有公网 IP 的服务器上

  • frpc:客户端程序,部署在需要穿透的内网机器上


二、基础环境搭建

2.1 准备工作
  • 一台具有公网 IP 的服务器(VPS 或云主机)

  • 内网中需要暴露服务的目标机器

  • GitHub Releases 下载对应系统架构的最新版本

注意:目前 frp 已全面采用 TOML 格式作为配置文件,取代了旧版的 INI 格式。本文基于 v0.60.0 及以上版本编写 。

2.2 服务端部署(公网服务器)

下载并解压 frp

复制代码
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz
tar -xzvf frp_0.60.0_linux_amd64.tar.gz
cd frp_0.60.0_linux_amd64

编辑服务端配置文件 frps.toml

复制代码
# frps.toml
bindPort = 7000                # 服务端监听端口,客户端通过此端口连接
auth.method = "token"          # 认证方式
auth.token = "your-strong-token"  # 客户端连接密码

# 可选:开启仪表盘监控
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"

# 如需支持 HTTP/HTTPS 穿透,需设置以下端口
vhostHTTPPort = 80
vhostHTTPSPort = 443

启动服务端

复制代码
./frps -c frps.toml

# 后台运行(使用 screen 或 systemd)
# 或直接使用 nohup
nohup ./frps -c frps.toml &

防火墙放行端口(以 Ubuntu 为例):

复制代码
ufw allow 7000/tcp    # frp 通信端口
ufw allow 7500/tcp    # 仪表盘端口
ufw allow 80/tcp      # HTTP 穿透端口
ufw allow 443/tcp     # HTTPS 穿透端口

如果是云服务器,还需在安全组中放行相应端口 。

2.3 客户端部署(内网机器)

在内网目标机器上下载对应版本的 frp,然后编辑客户端配置文件 frpc.toml

基础配置示例

复制代码
# frpc.toml
serverAddr = "your-server-ip"     # 公网服务器 IP 或域名
serverPort = 7000                 # 与服务端 bindPort 一致
auth.method = "token"
auth.token = "your-strong-token"  # 与服务端 token 一致

# 定义代理规则(将在后续章节详细说明)
# [[proxies]]
# name = "proxy-name"
# type = "tcp"
# localIP = "127.0.0.1"
# localPort = 22
# remotePort = 6000

启动客户端

复制代码
./frpc -c frpc.toml

# 或后台运行
nohup ./frpc -c frpc.toml &

三、核心代理类型详解

frp 支持多种代理类型,适用于不同场景。下面逐一介绍每种类型的使用方法。

3.1 TCP 代理:暴露 SSH、RDP 等服务

TCP 是最基础的代理类型,适用于任何基于 TCP 的协议。以暴露内网 SSH 服务为例 :

客户端配置 (frpc.toml)

复制代码
serverAddr = "your-server-ip"
serverPort = 7000
auth.token = "your-strong-token"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000   # 公网服务器上监听的端口

配置说明:

  • localIPlocalPort:内网服务的地址和端口

  • remotePort:公网服务器上开放的端口,访问此端口即相当于访问内网的 localPort

访问方式

复制代码
ssh -p 6000 username@your-server-ip

类似地,可以暴露 RDP 服务(Windows 远程桌面):

复制代码
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 7001

访问时使用 mstsc 连接 your-server-ip:7001 即可 。

3.2 UDP 代理:转发 DNS、游戏流量等

UDP 代理配置与 TCP 类似,只需将 type 改为 udp

示例:暴露内网 DNS 服务

复制代码
[[proxies]]
name = "dns"
type = "udp"
localIP = "192.168.1.100"
localPort = 53
remotePort = 5353
3.3 HTTP/HTTPS 代理:暴露 Web 服务

HTTP 代理支持域名路由,可以通过不同域名访问不同的内网 Web 服务 。

服务端配置 (frps.toml) 需开启虚拟主机端口:

复制代码
bindPort = 7000
vhostHTTPPort = 80        # 开启 HTTP 支持
vhostHTTPSPort = 443      # 开启 HTTPS 支持

客户端配置:暴露内网 Web 服务(假设运行在 80 端口)

复制代码
[[proxies]]
name = "web"
type = "http"
localPort = 80
localIP = "127.0.0.1"
customDomains = ["www.your-domain.com"]  # 绑定的域名

访问方式

将域名 www.your-domain.com 解析到公网服务器 IP,浏览器访问 http://www.your-domain.com 即可到达内网 Web 服务 。

HTTPS 配置 :如果需要 HTTPS,可以使用 type = "https" 配合插件将 HTTPS 转为 HTTP :

复制代码
[[proxies]]
name = "web-https"
type = "https"
customDomains = ["www.your-domain.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "./server.crt"    # 证书路径
keyPath = "./server.key"    # 私钥路径
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
3.4 STCP 代理:安全的 TCP 服务暴露

STCP (Secret TCP) 用于需要安全访问的场景,只有部署了 frpc 的授权用户才能访问服务 。

适用场景:数据库管理、内部管理系统等不希望直接暴露在公网的服务。

第一步:在服务提供方(内网服务器)配置 frpc.toml

复制代码
serverAddr = "your-server-ip"
serverPort = 7000
auth.token = "your-strong-token"

[[proxies]]
name = "secret_mysql"
type = "stcp"
secretKey = "my-secret-key"    # 共享密钥,访问方需相同
localIP = "127.0.0.1"
localPort = 3306                # MySQL 服务端口

第二步:在访问方机器上配置 frpc.toml

复制代码
serverAddr = "your-server-ip"
serverPort = 7000
auth.token = "your-strong-token"

[[visitors]]
name = "secret_mysql_visitor"
type = "stcp"
serverName = "secret_mysql"     # 对应服务端的 proxy name
secretKey = "my-secret-key"     # 密钥需一致
bindAddr = "127.0.0.1"
bindPort = 3307                  # 本地监听端口

访问方式

在访问方机器上,连接本地的 127.0.0.1:3307 即可访问内网的 MySQL 服务:

复制代码
mysql -h 127.0.0.1 -P 3307 -u root -p

STCP 的特点:服务不直接暴露在公网,只有持有正确 secretKey 的客户端才能访问,大大提高了安全性 。

3.5 XTCP 代理:P2P 点对点穿透

XTCP 是 frp 的一大亮点,它尝试在双方之间建立直接的 P2P 连接。一旦打洞成功,后续流量将不再经过 frp 服务器,大幅提升传输速度且不受服务器带宽限制 。

适用场景:大文件传输、视频流、远程桌面等高带宽需求场景。

注意事项:XTCP 并非适用于所有 NAT 类型,如果打洞失败,会自动降级为 STCP 模式 。

第一步:服务提供方配置

复制代码
serverAddr = "your-server-ip"
serverPort = 7000
# 如果默认 STUN 服务器不可用,可自定义
# natHoleStunServer = "stun.qq.com:3478"

[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

第二步:访问方配置

复制代码
serverAddr = "your-server-ip"
serverPort = 7000

[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
serverName = "p2p_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
# 如果需要自动保持隧道打开,设置为 true
# keepTunnelOpen = true

访问方式

复制代码
ssh -oPort=6000 user@127.0.0.1

建立连接后,可以通过抓包验证流量是否直接通信(不再经过服务器)。


四、高级功能

4.1 负载均衡与健康检查

当内网有多个相同的服务实例时,可以配置负载均衡 。

服务端配置:无需特殊设置。

客户端配置(多个相同服务的代理):

复制代码
# 服务实例 A
[[proxies]]
name = "web-a"
type = "tcp"
localIP = "192.168.1.10"
localPort = 80
remotePort = 8000
# 添加健康检查
healthCheck.type = "tcp"
healthCheck.timeoutSeconds = 3
healthCheck.maxFailed = 3
healthCheck.intervalSeconds = 10

# 服务实例 B
[[proxies]]
name = "web-b"
type = "tcp"
localIP = "192.168.1.11"
localPort = 80
remotePort = 8000
healthCheck.type = "tcp"
healthCheck.timeoutSeconds = 3
healthCheck.maxFailed = 3
healthCheck.intervalSeconds = 10

frp 会自动将请求分发到健康的实例上。

4.2 身份验证与 TLS 加密

Token 验证已在基础配置中展示。

TLS 加密:启用后可以加密 frp 客户端与服务端的通信 。

服务端配置 (frps.toml):

复制代码
# 启用 TLS
transport.tls.force = true

客户端配置 (frpc.toml):

复制代码
transport.tls.enable = true
4.3 通过代理连接服务端

如果客户端网络需要经过代理才能访问公网,可以配置代理 :

复制代码
transport.proxyURL = "socks5://user:pass@proxy-ip:1080"
# 或 HTTP 代理
transport.proxyURL = "http://user:pass@proxy-ip:8080"
4.4 日志配置
复制代码
[log]
log.to = "console"        # 或文件路径,如 "./frpc.log"
log.level = "info"        # 日志级别:trace, debug, info, warn, error
log.maxDays = 3           # 日志保留天数
log.disablePrintColor = false
相关推荐
liann1194 小时前
3.2_红队攻击框架--MITRE ATT&CK‌
python·网络协议·安全·网络安全·系统安全·信息与通信
德迅云安全杨德俊6 小时前
DDoS 解析与防御体系
网络·安全·web安全·ddos
电子科技圈7 小时前
芯科科技在蓝牙亚洲大会展示汽车与边缘AI前沿蓝牙创新技术, 解锁车用、家居、健康及工商业等应用场景
人工智能·科技·嵌入式硬件·mcu·物联网·网络安全·汽车
王大傻09288 小时前
WASC 团队报告的安全威胁分类
网络·安全·web安全
大方子9 小时前
【好靶场】有点儿用的图形验证码
网络安全·好靶场
能年玲奈喝榴莲牛奶9 小时前
记一次挖矿病毒应急
网络安全·应急响应
橘子海全栈攻城狮9 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
网络安全许木10 小时前
自学渗透测试第30天(第一阶段总结与Metasploitable3部署)
网络安全·渗透测试
王大傻092812 小时前
注入攻击的概念
web安全·网络安全
txg66612 小时前
MDVul:用语义路径重塑漏洞检测的图模型能力
人工智能·安全·网络安全