1. 项目概述
frps(Fast Reverse Proxy Server)是一款高性能的反向代理工具,主要用于将内网服务安全地暴露到公网。它能够穿透NAT和防火墙限制,支持TCP、UDP、HTTP和HTTPS等多种协议。在实际应用中,frps通常部署在具有公网IP的服务器上,与内网机器上的frpc客户端配合使用。
这个工具特别适合以下场景:
- 开发调试时需要临时暴露本地服务给外部访问
- 企业内网应用需要提供远程访问能力
- 物联网设备需要从外网进行管理
- 需要绕过网络限制建立点对点连接
2. 环境准备与安装
2.1 系统要求
frps可以运行在大多数Linux发行版上,建议使用以下环境:
- 操作系统:Ubuntu 20.04+/CentOS 7+
- 内存:至少512MB
- 存储:至少100MB可用空间
- 网络:需要开放7000等端口(后续可配置)
2.2 下载frps
首先通过wget获取最新版本的frps:
wget https://github.com/fatedier/frp/releases/download/v0.69.1/frp_0.69.1_linux_amd64.tar.gz解压下载的文件:
tar -zxvf frp_0.69.1_linux_amd64.tar.gz cd frp_0.69.1_linux_amd64解压后会看到以下重要文件:
- frps:服务端主程序
- frps.toml:服务端配置文件
- frps_full.toml:完整配置示例
3. 基础配置与启动
3.1 最小化配置
创建或编辑frps.toml配置文件:
# frps.toml基础配置 bindPort = 7000 auth.token = "your_secure_token_here" # 启用仪表盘 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin"关键参数说明:
bindPort:客户端连接端口,默认7000auth.token:客户端认证令牌,建议使用强密码webServer:管理仪表盘配置
3.2 启动frps服务
直接运行方式(适合测试):
./frps -c ./frps.toml生产环境建议使用systemd管理:
sudo tee /etc/systemd/system/frps.service <<EOF [Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/path/to/frps -c /path/to/frps.toml [Install] WantedBy=multi-user.target EOF然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable frps sudo systemctl start frps4. 高级配置详解
4.1 安全加固配置
# 增强安全性配置 transport.tls.enable = true transport.tls.force = true auth.method = "token" auth.token = "complex_password_here" auth.additionalScopes = ["HeartBeats", "NewWorkConns"] # IP访问限制 webServer.addr = "127.0.0.1" # 限制仪表盘只能本地访问安全建议:
- 总是启用TLS加密
- 使用强密码并定期更换
- 限制管理界面访问IP
- 考虑使用防火墙规则限制访问
4.2 端口管理与限制
# 端口管理配置 allowPorts = [ { start = 10000, end = 20000 }, # 只允许使用10000-20000端口 { single = 8080 }, { single = 8443 } ] # 端口复用配置 vhostHTTPPort = 80 vhostHTTPSPort = 443端口管理技巧:
- 生产环境应该严格限制可用端口范围
- HTTP/HTTPS服务可以使用80/443端口复用
- 避免使用常见服务端口(如22,3306等)
4.3 性能优化配置
# 性能优化配置 transport.tcpMux = true transport.poolCount = 5 transport.useEncryption = true transport.useCompression = true # KCP协议支持(高延迟网络适用) kcpBindPort = 7000性能调优建议:
- 高并发场景增加连接池大小
- 移动网络可启用KCP协议
- 内网环境可以关闭压缩减少CPU消耗
5. 客户端连接配置
5.1 基础客户端配置
对应frpc.toml配置示例:
serverAddr = "your_server_ip" serverPort = 7000 auth.token = "your_secure_token_here" [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 60005.2 多种代理类型示例
HTTP服务代理:
[[proxies]] name = "web" type = "http" localPort = 8080 customDomains = ["example.yourdomain.com"]HTTPS服务代理:
[[proxies]] name = "secure-web" type = "https" localPort = 8443 customDomains = ["secure.yourdomain.com"]UDP服务代理(如DNS):
[[proxies]] name = "dns" type = "udp" localIP = "127.0.0.1" localPort = 53 remotePort = 53536. 监控与维护
6.1 使用内置仪表盘
访问http://server_ip:7500可以查看:
- 客户端连接状态
- 代理流量统计
- 系统资源使用情况
6.2 Prometheus监控集成
启用Prometheus支持:
# frps.toml中追加 webServer.enablePrometheus = true然后可以通过/metrics端点获取监控数据。
6.3 日志管理
建议的日志配置:
# frps.toml中配置 log.to = "file" log.level = "info" log.maxDays = 7日志分析技巧:
- 关注"login failed"消息排查认证问题
- "new proxy"消息确认代理创建
- "port already used"错误检查端口冲突
7. 常见问题排查
7.1 连接问题排查步骤
检查防火墙设置:
sudo ufw status sudo iptables -L -n验证端口连通性:
telnet your_server_ip 7000 nc -zv your_server_ip 7000检查服务状态:
journalctl -u frps -f
7.2 性能问题优化
高负载下可能出现的问题:
- 增加
transport.poolCount - 启用
transport.useCompression - 考虑升级服务器配置
- 分布式部署多个frps实例
7.3 安全性问题处理
安全事件响应流程:
- 立即更改auth.token
- 检查/var/log/frps.log异常登录
- 审查开放的代理服务
- 考虑启用IP白名单
8. 生产环境最佳实践
8.1 高可用部署方案
建议的架构:
[负载均衡器] / | \ [frps-1] [frps-2] [frps-3]每个frps实例使用相同配置,客户端配置多个serverAddr实现自动故障转移。
8.2 自动化部署脚本
使用Ansible部署示例:
- hosts: frp_servers tasks: - name: Download frp get_url: url: https://github.com/fatedier/frp/releases/download/v0.69.1/frp_0.69.1_linux_amd64.tar.gz dest: /tmp/frp.tar.gz - name: Extract frp unarchive: src: /tmp/frp.tar.gz dest: /opt/ remote_src: yes - name: Deploy config template: src: frps.toml.j2 dest: /opt/frp_0.69.1_linux_amd64/frps.toml - name: Install systemd service template: src: frps.service.j2 dest: /etc/systemd/system/frps.service8.3 备份与恢复策略
关键数据备份:
配置文件备份:
cp /path/to/frps.toml /backup/frps_$(date +%Y%m%d).tomlTLS证书备份(如果使用):
tar -czvf frps_certs_$(date +%Y%m%d).tar.gz /path/to/certs/定期验证备份可用性
9. 进阶功能探索
9.1 P2P穿透模式
xtcp配置示例(服务端无需特殊配置):
# frpc.toml [[proxies]] name = "p2p_ssh" type = "xtcp" secretKey = "your_secret" localIP = "127.0.0.1" localPort = 22 # 访问端配置 [[visitors]] name = "p2p_visitor" type = "xtcp" serverName = "p2p_ssh" secretKey = "your_secret" bindAddr = "127.0.0.1" bindPort = 6000P2P使用限制:
- 依赖NAT类型,可能无法在所有网络环境下工作
- 需要保持frps在线作为中继备用
9.2 插件系统使用
静态文件服务器插件示例:
[[proxies]] name = "static_file" type = "tcp" remotePort = 6000 [proxies.plugin] type = "static_file" localPath = "/var/www/files" stripPrefix = "static" httpUser = "user" httpPassword = "pass"9.3 虚拟网络功能
Alpha阶段的VirtualNet功能:
# frps.toml featureGates = { VirtualNet = true } # frpc.toml featureGates = { VirtualNet = true } [[virtualNetworks]] name = "office_network" cidr = "192.168.100.0/24"10. 版本升级与迁移
10.1 版本升级步骤
- 备份现有配置和证书
- 下载新版本并验证校验和
- 停止旧版本服务
- 替换二进制文件
- 检查配置变更(特别是重大版本更新)
- 启动新版本服务
- 监控日志确认正常运行
10.2 配置迁移注意事项
从旧版本迁移时特别注意:
- INI格式已弃用,建议转为TOML
- 认证机制可能变化
- TLS默认开启可能需要调整
- 插件接口可能有变更
11. 资源监控与调优
11.1 系统资源监控
关键监控指标:
- 内存使用:frps内存占用与连接数成正比
- CPU使用:加密/压缩操作会增加CPU负载
- 网络带宽:特别是流量型应用
- 文件描述符:大量连接可能耗尽限制
设置监控告警示例:
# 监控frps内存使用 process_resident_memory_bytes{job="frps"} > 1GB # 监控活跃连接数 frps_proxy_connections > 50011.2 性能调优参数
根据负载调整的参数:
# 高并发调优 transport.maxPoolCount = 100 transport.tcpMuxKeepaliveInterval = 60 # 大流量调优 transport.bandwidthLimit = "10MB" transport.bandwidthLimitMode = "server"12. 安全审计与加固
12.1 定期安全检查清单
- 认证令牌是否足够复杂
- 是否所有代理都必要
- TLS配置是否正确启用
- 仪表盘是否有限制访问
- 系统漏洞是否已修补
12.2 入侵检测配置
示例fail2ban配置:
[frp-auth] enabled = true filter = frp-auth logpath = /var/log/frps.log maxretry = 3 findtime = 3600 bantime = 86400对应的filter规则:
[Definition] failregex = ^.*login failed: .* from <HOST>.*$ ignoreregex =13. 容器化部署方案
13.1 Docker运行示例
基本运行命令:
docker run -d --name frps \ -p 7000:7000 \ -p 7500:7500 \ -v /path/to/frps.toml:/etc/frp/frps.toml \ snowdreamtech/frps13.2 Kubernetes部署
示例Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: frps spec: replicas: 3 selector: matchLabels: app: frps template: metadata: labels: app: frps spec: containers: - name: frps image: snowdreamtech/frps ports: - containerPort: 7000 - containerPort: 7500 volumeMounts: - name: config mountPath: /etc/frp volumes: - name: config configMap: name: frps-config14. 网络架构设计
14.1 企业级部署架构
典型的三层架构:
[公网LB] -> [frps集群] -> [区域frpc] -> [本地服务]设计要点:
- 区域划分降低延迟
- 层级化权限管理
- 集中监控与日志收集
14.2 混合云连接方案
通过frp实现跨云连接:
- 在中心云部署frps
- 各分支机构/私有云运行frpc
- 建立站点到站点的虚拟网络
- 统一身份认证与授权
15. 故障模拟与演练
15.1 常见故障场景
- 网络分区测试
- 高负载下的服务降级
- 证书过期场景
- 配置错误恢复
- 节点故障转移
15.2 混沌工程实践
使用chaosblade进行测试:
# 模拟网络延迟 blade create network delay --time 3000 --interface eth0 --local-port 7000 # 模拟进程退出 blade create process kill --process frps16. 周边生态集成
16.1 与CI/CD集成
在流水线中动态创建代理:
steps: - name: Create temp proxy run: | ./frpc tcp --proxy_name "temp-$BUILD_ID" \ --local_ip 127.0.0.1 --local_port 8080 \ --remote_port 0 --server_addr frps.example.com # 获取分配的端口 PORT=$(grep -oP 'remote_port \K\d+' frpc.log) echo "EXPOSE_PORT=$PORT" >> $GITHUB_ENV - name: Run tests run: | curl http://frps.example.com:$EXPOSE_PORT/test16.2 与监控系统集成
Prometheus监控配置示例:
scrape_configs: - job_name: 'frps' static_configs: - targets: ['frps:7500'] metrics_path: '/metrics'Grafana仪表盘导入ID:11062
17. 性能基准测试
17.1 测试环境配置
测试工具:wrk/siege 测试场景:
- 100并发TCP连接
- 1MB文件HTTP传输
- 混合协议负载
17.2 优化前后对比
典型优化效果:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 吞吐量 | 800 req/s | 2200 req/s |
| 延迟 | 45ms | 18ms |
| CPU使用 | 85% | 60% |
18. 成本分析与优化
18.1 云部署成本估算
AWS示例成本(us-east-1):
- t3.medium实例:$0.0416/hr
- 1TB出站流量:$90
- 总月成本:约$120
18.2 成本优化策略
- 使用预留实例降低30%成本
- 压缩流量减少带宽费用
- 自动伸缩按需扩容
- 选择性价比高的区域
19. 替代方案比较
19.1 同类工具对比
| 特性 | frp | ngrok | Cloudflare Tunnel |
|---|---|---|---|
| 自托管 | ✓ | ✗ | ✗ |
| 协议支持 | 多 | HTTP(S) | HTTP(S) |
| P2P支持 | ✓ | ✗ | ✗ |
| 成本 | 免费 | 付费 | 免费/付费 |
19.2 选型建议
选择frp当:
- 需要完全控制基础设施
- 支持多种协议
- 需要高性能内网穿透
- 有定制化需求
20. 未来发展与路线图
根据社区动态关注:
- v2版本的重构进展
- QUIC协议的深度集成
- 虚拟网络功能完善
- 管理API的增强
- 更细粒度的权限控制
建议定期查看GitHub项目的里程碑和路线图,参与社区讨论贡献需求。