Frp
概述
FRP(Fast Reverse Proxy)是一款高性能的内网穿透工具,支持 TCP、UDP、HTTP、HTTPS 等多种协议,可将内网服务暴露至公网。
典型应用场景:
- 访问内网服务器的 SSH、RDP 等远程管理服务
- 将内网 Web 服务(如 Jenkins、GitLab)对外发布
- 穿透 NAT 或防火墙限制,实现外网访问
下载安装
1. 下载 FRP
访问官方下载页面:https://github.com/fatedier/frp/releases
根据系统架构选择对应安装包,以 Linux amd64 为例:
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz2. 解压并进入目录
tar -xf frp_0.65.0_linux_amd64.tar.gz
cd frp_0.65.0_linux_amd643. 目录结构说明
解压后仅需保留以下核心文件(其余可删除):
| 文件名 | 作用 | 适用端 |
|---|---|---|
frps |
服务端主程序 | 服务端 |
frps.toml |
服务端配置文件(v0.50+ 新版格式) | 服务端 |
frpc |
客户端主程序 | 内网设备 |
frpc.toml |
客户端配置文件(v0.50+ 新版格式) | 内网设备 |
兼容性说明:v0.50 以下版本使用
.ini格式配置文件,新版本推荐使用.toml格式,功能更丰富。
服务端部署
1. 配置 frps.toml
在服务端创建配置文件 frps.toml:
# 绑定监听地址(0.0.0.0 表示监听所有网卡)
bindAddr = "0.0.0.0"
bindPort = 20001
# Dashboard Web 控制台配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "your_password"
# 认证配置(防止未授权客户端连接)
auth.method = "token"
auth.token = "aabbcc112233"
# 端口范围限制(仅允许分配此范围内的端口)
allowPorts = [
{ start = 20000, end = 20010 }
]2. 启动服务端
临时启动(测试用)
./frps -c ./frps.toml后台启动(生产环境)
创建 Systemd 服务文件:
cat > /etc/systemd/system/frps.service << 'EOF'
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
ExecStart = /data/frp_0.65.0_linux_amd64/frps -c /data/frp_0.65.0_linux_amd64/frps.toml
Restart = always
RestartSec = 5
[Install]
WantedBy = multi-user.target
EOF启动并设置开机自启:
systemctl daemon-reload
systemctl start frps
systemctl enable frps
systemctl status frps3. 防火墙放行
# 放行服务端口
firewall-cmd --add-port=20001/tcp --permanent
firewall-cmd --add-port=7500/tcp --permanent
firewall-cmd --reload客户端部署
1. 配置 frpc.toml
在客户端(内网设备)创建配置文件 frpc.toml:
# 服务端信息(替换为实际公网 IP)
serverAddr = "your_server_public_ip"
serverPort = 20001
# 连接协议
transport.protocol = "tcp"
# 认证信息(需与服务端一致)
auth.method = "token"
auth.token = "aabbcc112233"
# 代理配置
[[proxies]]
name = "ssh_tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 20002
[[proxies]]
name = "web_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5001
remotePort = 200032. 启动客户端
临时启动(测试用)
./frpc -c ./frpc.toml后台启动(生产环境)
创建 Systemd 服务文件:
cat > /etc/systemd/system/frpc.service << 'EOF'
[Unit]
Description = frp client
After = network.target network-online.target
Wants = network-online.target
[Service]
Type = simple
User = root
Restart = always
RestartSec = 5
ExecStart = /data/frp_0.65.0_linux_amd64/frpc -c /data/frp_0.65.0_linux_amd64/frpc.toml
ExecReload = /bin/kill -HUP $MAINPID
KillMode = process
LimitNOFILE = 1048576
[Install]
WantedBy = multi-user.target
EOF启动并设置开机自启:
systemctl daemon-reload
systemctl start frpc
systemctl enable frpc
systemctl status frpc验证连接
方法一:通过 Web 控制台
在浏览器中访问 http://<服务端IP>:7500,输入配置的用户名和密码,查看客户端连接状态和代理列表。
方法二:通过命令测试
# 在服务端查看连接状态
./frps -c ./frps.toml
# 在客户端测试代理是否生效
curl http://127.0.0.1:20002 # 测试 SSH 代理
ssh -p 20002 root@<服务端IP> # 通过代理 SSH 连接常用管理命令
| 操作 | 服务端命令 | 客户端命令 |
|---|---|---|
| 启动 | systemctl start frps |
systemctl start frpc |
| 停止 | systemctl stop frps |
systemctl stop frpc |
| 重启 | systemctl restart frps |
systemctl restart frpc |
| 查看状态 | systemctl status frps |
systemctl status frpc |
| 查看日志 | journalctl -u frps -f |
journalctl -u frpc -f |
| 开机自启 | systemctl enable frps |
systemctl enable frpc |
高级配置示例
HTTP 域名转发
[[proxies]]
name = "web_domain"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["example.com", "www.example.com"]HTTPS 转发(需配置 TLS)
[[proxies]]
name = "web_https"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["example.com"]UDP 转发
[[proxies]]
name = "dns_forward"
type = "udp"
localIP = "127.0.0.1"
localPort = 53
remotePort = 20004负载均衡(多节点)
[[proxies]]
name = "web_load_balance"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 20005
loadBalancer.group = "web-group"
loadBalancer.mode = "round-robin"常见问题
Q:客户端连接失败,提示"connection refused"?
- 检查服务端
bindPort是否被防火墙拦截 - 确认客户端
serverAddr和serverPort与服务端一致 - 检查云服务商安全组是否放行对应端口
Q:认证失败,提示"auth token mismatch"?
确认客户端 auth.token 与服务端 auth.token 完全一致(区分大小写)。
Q:端口转发正常,但无法访问目标服务?
- 确认目标服务(如 SSH、Nginx)在客户端本地正常运行
- 检查
localIP是否正确(通常为127.0.0.1或0.0.0.0) - 确认
remotePort在服务端allowPorts范围内
Q:如何查看实时日志排查问题?
# 服务端
journalctl -u frps -f
# 客户端
journalctl -u frpc -fQ:服务端如何限制客户端 IP?
在 frps.toml 中添加白名单:
# 允许的客户端 IP
allowClientIPs = ["192.168.1.0/24", "10.0.0.0/8"]