当前位置: 首页 > news >正文

从零到一:在主流云服务器上部署高可用FRP内网穿透服务

1. 为什么需要内网穿透服务

刚入行那会儿,我经常被一个场景困扰:出差在外需要访问公司内网的开发环境,或者在家调试部署在内网的服务。传统方案要么需要复杂的VPN配置,要么就得让运维同事临时开个端口映射,效率低不说还容易出安全问题。直到发现了FRP这个神器,才真正解决了这个痛点。

FRP本质上是一个高性能的反向代理工具,它能在公网服务器和内网机器之间建立安全通道。举个例子,你在阿里云有台带公网IP的服务器(FRP服务端),办公室有台跑着MySQL的机器(FRP客户端),通过FRP就能用云服务器的端口直接访问内网数据库。整个过程数据全程加密,比直接暴露数据库端口安全多了。

这种方案特别适合以下场景:

  • 远程开发调试(访问内网GitLab/Jenkins)
  • 物联网设备管理(树莓派等设备穿透)
  • 家庭NAS外网访问
  • 微信小程序开发调试(必须公网域名)

2. 云服务器选购与基础配置

2.1 服务器选型要点

在阿里云或腾讯云选购服务器时,新手常会陷入配置焦虑。实测发现FRP服务端对资源消耗极低,我的生产环境用1核2G的轻量应用服务器,同时维持200+稳定连接CPU使用率都不超过30%。关键要注意这几点:

  • 带宽:建议选3Mbps以上,实测1Mbps带宽同时传大文件会卡顿
  • 流量包:FRP流量=实际数据传输量×2(双向代理),每月1TB流量够中小规模使用
  • 地域:选择离目标用户最近的地域(国内推荐华东/华南区域)

特别提醒:腾讯云轻量服务器默认没开IPv6,如果需要得在购买时勾选。阿里云ECS记得选"按量付费"镜像,避免被预装软件干扰。

2.2 安全组配置避坑指南

安全组相当于云服务器的虚拟防火墙,这里我踩过的坑够写本书。以阿里云为例,必须放行这些端口:

端口类型端口范围协议用途说明
控制端口7000-7001TCPFRP服务端控制通道
数据传输60000-61000TCP/UDPFRP动态映射端口范围
SSH管理22TCP服务器远程管理

腾讯云有个特殊设定:安全组规则要同时应用到"入方向"和"出方向"。有次调试两小时才发现是出方向没放行,血泪教训啊!

配置完成后,马上用这个命令测试:

telnet your_server_ip 7000

如果连接失败,八成是安全组没配好。记得云控制台修改规则后要手动重启实例才能生效。

3. FRP服务端深度配置

3.1 安装与基础配置

现在FRP已经发展到v0.51.0版本,但我不建议盲目追新。生产环境用v0.44.0最稳定,新版本有时会引入兼容性问题。安装过程其实就三步:

# 下载解压 wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz tar -zxvf frp_0.44.0_linux_amd64.tar.gz -C /usr/local/ # 精简文件 cd /usr/local/frp_0.44.0_linux_amd64 rm -f frpc* # 服务端只需要frps相关文件 # 基础配置 vim frps.ini

配置文件核心参数这样写:

[common] bind_port = 7000 vhost_http_port = 8080 vhost_https_port = 8443 token = your_strong_password_here max_pool_count = 100 tls_only = true

重点说下token,这相当于FRP的通信密码。有次我用了简单密码,结果被爆破导致服务器沦为肉鸡。建议用这个命令生成强密码:

openssl rand -base64 32

3.2 高可用方案实现

单节点FRP服务最怕半夜宕机,我设计了一套双机热备方案:

方案一:DNS轮询

  • 在两台不同可用区的服务器部署FRP
  • 用云解析DNS设置A记录轮询
  • 客户端配置两个server_addr

方案二:Keepalived+VIP

# 主服务器配置 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 virtual_ipaddress { 192.168.0.100/24 dev eth0 } } # 备服务器只需改priority为90

实测方案二切换速度更快(3秒内),但需要云平台支持自定义VIP。阿里云要开专有网络VPC,腾讯云则要申请弹性网卡。

4. 客户端配置实战

4.1 Linux客户端配置

客户端配置比服务端更讲究场景化。以常见的SSH穿透为例:

[common] server_addr = frp.yourdomain.com server_port = 7000 token = your_strong_password_here [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 use_compression = true

遇到过的典型问题:

  1. 端口冲突:多个客户端用相同remote_port会报错
  2. 权限问题:客户端用非root用户运行时可能无法绑定特权端口
  3. 连接闪断:网络波动时添加health_check_type = tcp参数

4.2 Windows服务化部署

给客户部署时,最怕他们不小心关了CMD窗口。用NSSM工具可以完美解决:

# 下载NSSM wget https://nssm.cc/release/nssm-2.24.zip -OutFile nssm.zip # 注册服务 .\nssm install FRPClient

在GUI界面设置:

  • Path: C:\frp\frpc.exe
  • Arguments: -c C:\frp\frpc.ini
  • Startup: Automatic (Delayed)

有个坑要注意:如果Windows Defender开了实时防护,可能会拦截FRP连接。要么加白名单,要么暂时关闭防护。

5. 高级优化技巧

5.1 流量压缩与加密

内网穿透最怕被人抓包,这几个参数能大幅提升安全性:

# 服务端frps.ini tls_only = true tls_cert_file = /path/to/server.crt tls_key_file = /path/to/server.key # 客户端frpc.ini protocol = kcp use_encryption = true use_compression = true

生成证书的命令:

openssl req -x509 -newkey rsa:4096 -nodes -out server.crt -keyout server.key -days 3650

5.2 日志与监控方案

曾经有台服务器FRP莫名崩溃,后来加了这套监控方案:

  1. 日志轮转
# /etc/logrotate.d/frp /var/log/frp.log { daily rotate 7 compress delaycompress missingok notifempty }
  1. Prometheus监控
# frps.ini新增 enable_prometheus = true prometheus_port = 7400

配合Grafana看板,可以实时监控连接数、流量等指标。当连接数突增时,很可能是遭遇了扫描攻击。

6. 常见故障排查

问题一:客户端显示连接成功但无法访问

  • 检查服务端安全组和iptables规则
  • tcpdump -i any port 7000抓包分析
  • 客户端加admin_addr = 127.0.0.1开启调试接口

问题二:连接频繁断开

  • 调整心跳参数:
[common] heartbeat_interval = 30 heartbeat_timeout = 90
  • 如果是移动网络,考虑改用KCP协议

问题三:带宽跑满

  • 客户端限制速率:
[common] bandwidth_limit = 10MB bandwidth_limit_mode = client
  • 服务端用tc命令做QoS限速

最后提醒下,FRP虽然强大但不是万能的。对于需要低延迟的场景(如游戏联机),还是建议用专业的内网穿透方案。我自己的经验是,把FRP当作开发调试工具来用最合适,生产环境用之前一定要做好压力测试。

http://www.jsqmd.com/news/517223/

相关文章:

  • 基于STM32的校园无人超市嵌入式系统设计
  • 老马失前蹄,竟然在数据库外键上翻车了,重温外键级联
  • Nanbeige 4.1-3B惊艳效果:流式渲染速度与显存占用的帕累托最优解
  • Pixel Dimension Fissioner 系统集成案例:在WSL2中开发并调试模型应用
  • 告别乱码:一劳永逸的 VS Code 终端编码统一方案
  • 快速 vs. 准确:衡量量化向量搜索的召回率
  • 多模态学习避坑指南:当BERT遇到CNN时常见的7个数据陷阱
  • 信捷HMI与西门子S7-1200通信实战:从IP配置到Wireshark抓包全流程
  • WSL文件系统深度解析:如何在Windows和Linux间无缝操作文件
  • vue2两个组件间如何传递消息
  • 告别复杂配置!SDXL 1.0电影级绘图工坊一键部署指南,纯本地运行,数据安全
  • RustFS:构建云原生时代的高性能、安全对象存储实践
  • 【ROS2】机械臂抓取——gazebo_grasp_plugin参数调优与实战避坑
  • Rust 升级受阻:深入解析 rustup update stable 网络连接失败
  • STEP3-VL-10B开箱即用:Supervisor自动启动,无需复杂配置
  • PP-DocLayoutV3与YOLOv8协同:实现文档中插图的细粒度分类
  • 技术解析 2DGS vs 3DGS | SIGGRAPH 2024 新方法如何用‘二维圆盘’实现精准表面重建
  • 选对城市对年轻人的发展到底有多重要?
  • Qwen2.5-VL-7B实战:Ollama部署教程,5步搞定视觉对话AI
  • Harmonyos应用实例166:垂径定理互动演示
  • K8S持久化存储新选择:阿里云OSS CSI驱动深度配置与性能调优
  • 海康二次开发入门指南1-Visual Studio环境搭建
  • Live Avatar数字人快速部署:CLI命令行模式批量生成教程
  • 迪文屏K600+数据库读写避坑指南:从指令解析到.DAT文件导出全流程
  • Android NFC卡模拟实战:从零搭建虚拟门禁卡(附完整代码)
  • CogVideoX-2b快速上手:无需代码,网页点一点就能创作视频
  • 内核探秘:四种高效读取进程内存的技术对比与实践
  • nlp_structbert_sentence-similarity_chinese-large 性能实测:不同GPU型号下的推理速度与成本分析
  • Faiss GPU编译实战:解决CUDA error 209与显卡计算能力不匹配问题
  • AI头像生成器优化指南:如何描述才能生成更精准的头像绘图提示词?