1. 内网穿透的核心需求与FRP方案选型
当我们需要在外网访问公司内部服务器、调试家中NAS设备或管理树莓派时,常会遇到局域网设备没有公网IP的困境。传统解决方案如申请企业专线成本高昂,而动态DNS又受限于运营商对80端口的封锁。FRP(Fast Reverse Proxy)作为轻量级反向代理工具,通过公网服务器中转流量,完美解决了这一痛点。
我经手过数十个内网穿透项目,对比Ngrok、CPolar等方案后,FRP在以下场景表现尤为突出:
- 需要长期稳定的SSH连接(如远程运维)
- 对传输速度有较高要求(如文件传输)
- 需要自定义域名和端口(规避运营商封锁)
- 多设备穿透需求(支持TCP/UDP多协议)
重要提示:使用前请确保你有公网服务器的管理权限,且目标设备能访问互联网。部分云厂商(如阿里云)需额外配置安全组规则。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 服务端与客户端的部署实战
2.1 服务端配置(以阿里云Ubuntu为例)
首先在公网服务器下载对应架构的FRP:
bash复制wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
tar -zxvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64
修改服务端配置文件frps.ini:
ini复制[common]
bind_port = 7000 # 客户端连接端口
vhost_http_port = 8080 # HTTP穿透端口
dashboard_port = 7500 # 监控面板端口
dashboard_user = admin
dashboard_pwd = yourpassword
token = your_secret_token # 客户端认证密钥
启动服务端并设置开机自启:
bash复制nohup ./frps -c ./frps.ini &
echo "@reboot root cd /root/frp_0.51.3_linux_amd64 && nohup ./frps -c ./frps.ini &" >> /etc/crontab
2.2 客户端配置(Windows/Linux通用)
下载对应客户端后,配置frpc.ini:
ini复制[common]
server_addr = your_server_ip
server_port = 7000
token = your_secret_token
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 公网访问端口
Windows用户可通过创建计划任务实现开机启动:
powershell复制schtasks /create /tn "FRP Client" /tr "C:\frp\frpc.exe -c C:\frp\frpc.ini" /sc onstart /ru SYSTEM
3. 安全加固与性能优化
3.1 安全防护三板斧
- 端口防护:修改默认7000端口,并在云服务器安全组中设置IP白名单
- 双向认证:启用
tls_enable = true并配置TLS证书 - 访问控制:限制单个IP最大连接数:
ini复制[common] max_pool_count = 50 max_ports_per_client = 10
3.2 提升传输效率的技巧
- 启用压缩(带宽节省30%+):
ini复制[ssh] use_compression = true - 调整传输协议参数:
ini复制[common] tcp_mux = true protocol = kcp # 高延迟网络建议启用
4. 典型问题排查手册
4.1 连接失败常见原因
| 现象 | 排查步骤 | 解决方案 |
|---|---|---|
| Connection refused | 1. 检查服务端防火墙 2. 确认frps进程存活 3. 验证token一致性 |
开放对应端口 重启服务端 同步配置文件 |
| 能连接但SSH超时 | 1. 测试本地SSH可用性 2. 检查remote_port冲突 3. 抓包分析流量 |
修改SSH配置 更换远程端口 禁用QoS策略 |
4.2 监控与日志分析
通过dashboard(http://server_ip:7500)实时查看:
- 活跃连接数
- 流量统计
- 错误类型统计
关键日志位置:
- 服务端:
/var/log/frps.log - 客户端:Windows事件查看器/Linux的journalctl
5. 扩展应用场景
5.1 多设备管理方案
通过不同子域名区分设备:
ini复制[web1]
type = http
local_port = 80
custom_domains = dev1.yourdomain.com
[web2]
type = http
local_port = 8080
custom_domains = dev2.yourdomain.com
5.2 结合VS Code远程开发
在settings.json中添加:
json复制"remote.SSH.configFile": "C:\\Users\\yourname\\.ssh\\config",
"remote.SSH.path": "C:\\Windows\\System32\\OpenSSH\\ssh.exe"
SSH配置文件示例:
code复制Host remote_dev
HostName your_server_ip
Port 6000
User root
IdentityFile ~/.ssh/id_rsa
6. 维护与升级策略
长期运行建议:
- 配置日志轮转(防止磁盘写满)
bash复制
log_file = /var/log/frps.log log_level = info log_max_days = 7 - 设置监控告警(通过Prometheus+Alertmanager)
- 版本升级时保留原配置:
bash复制cp frps.ini /tmp/ && rm -rf frp* && wget NEW_VERSION...
我在实际部署中发现,当穿透设备超过20台时,建议采用多级代理架构。例如将不同部门的设备连接到不同的FRP中继服务器,再由主服务器统一暴露端口。这既能分散负载,又便于权限管理。
