手把手教你用frp把家里的NAS或树莓派服务“搬到”公网(CentOS7实战)

张开发
2026/4/18 5:07:15 15 分钟阅读

分享文章

手把手教你用frp把家里的NAS或树莓派服务“搬到”公网(CentOS7实战)
家庭服务器公网化实战基于frp的安全内网穿透方案深夜加班时想调取家中NAS的电影资源出差在外需要查看智能家居摄像头画面这些需求的核心在于如何安全地将家庭内网服务暴露到公网。本文将手把手带您实现这一目标无需复杂网络知识只需一台云服务器和基础Linux操作能力。1. 环境准备与基础概念在开始配置前我们需要明确几个关键组件家庭服务器可以是树莓派、旧电脑改造的NAS或专业存储设备运行着Jellyfin、Nextcloud等自托管服务云服务器建议选择1核1G以上配置位于距离您较近的机房如阿里云香港节点域名虽然非必须但使用域名能大幅提升使用体验后文会介绍免费方案提示云服务器选择时注意带宽限制1Mbps带宽仅适合基础文件传输视频流建议5Mbps以上frp工作原理简析公网用户 -- [云服务器:frps] -- [家庭网络:frpc] -- 本地服务关键端口规划表服务类型默认端口建议修改范围frp服务端通信700050000-60000HTTP代理80保留HTTPS代理443保留WebSocket自定义5000-100002. 云服务器端配置详解2.1 安全加固基础在安装frp前建议先完成这些安全措施# 创建专用用户 sudo useradd -m frpuser -s /sbin/nologin sudo passwd -l frpuser # 配置SSH密钥登录 sudo sed -i s/#PasswordAuthentication yes/PasswordAuthentication no/ /etc/ssh/sshd_config sudo systemctl restart sshd2.2 frp服务端安装使用最新版本示例为v0.51.3mkdir -p /opt/frp cd /opt/frp 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[common] bind_port 58723 # 替换为自定义高端口 token your_secure_token_123 # 必须设置认证令牌 vhost_http_port 80 vhost_https_port 443 max_pool_count 10 # 限制连接数提升安全性 # 可视化面板可选 dashboard_port 7500 dashboard_user admin dashboard_pwd dashboard_password_4562.3 系统服务集成创建systemd服务更可靠sudo tee /etc/systemd/system/frps.service EOF [Unit] DescriptionFrp Server Service Afternetwork.target [Service] Userfrpuser Restarton-failure ExecStart/opt/frp/frp_0.51.3_linux_amd64/frps -c /opt/frp/frp_0.51.3_linux_amd64/frps.ini [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now frps3. 家庭客户端高级配置3.1 多服务分流方案典型frpc.ini配置示例[common] server_addr your.server.ip server_port 58723 token your_secure_token_123 # Jellyfin媒体服务 [jellyfin] type http local_ip 192.168.1.100 local_port 8096 custom_domains media.yourdomain.com # Nextcloud文件同步 [nextcloud] type https local_ip 192.168.1.100 local_port 443 custom_domains cloud.yourdomain.com # 智能家居控制台 [homeassistant] type tcp local_ip 192.168.1.200 local_port 8123 remote_port 58123 # 公网访问端口3.2 WebSocket优化配置针对实时视频流等场景[surveillance] type tcpmux custom_domains cam.yourdomain.com multiplexer httpconnect local_ip 192.168.1.50 local_port 8888性能调优参数根据网络状况调整[common] tcp_mux true pool_count 3 health_check_type tcp health_check_interval_s 104. 安全增强与域名整合4.1 免费域名方案使用Cloudflare API实现动态DNS#!/bin/bash API_KEYyour_api_key ZONE_IDyour_zone_id RECORD_NAMEhome.yourdomain.com CURRENT_IP$(curl -s http://ipv4.icanhazip.com) RECORD_IP$(curl -s -X GET https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name$RECORD_NAME \ -H Authorization: Bearer $API_KEY \ -H Content-Type: application/json | jq -r .result[0].content) if [ $CURRENT_IP ! $RECORD_IP ]; then RECORD_ID$(curl -s -X GET https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name$RECORD_NAME \ -H Authorization: Bearer $API_KEY \ -H Content-Type: application/json | jq -r .result[0].id) curl -s -X PUT https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID \ -H Authorization: Bearer $API_KEY \ -H Content-Type: application/json \ --data {\type\:\A\,\name\:\$RECORD_NAME\,\content\:\$CURRENT_IP\} fi4.2 HTTPS加密方案使用Lets Encrypt免费证书sudo apt install certbot sudo certbot certonly --standalone -d media.yourdomain.com -d cloud.yourdomain.comNginx反向代理配置示例server { listen 443 ssl; server_name media.yourdomain.com; ssl_certificate /etc/letsencrypt/live/media.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/media.yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }5. 运维监控与故障排查5.1 状态监控方案frp内置面板结合Prometheus# frps.ini添加 enable_prometheus true prometheus_port 7400常用监控命令# 查看连接状态 ss -antp | grep frp # 实时流量监控 iftop -i eth0 -f port 58723 or port 80 # 日志分析 journalctl -u frps -f -n 505.2 常见问题处理指南连接超时检查云服务器安全组规则确认端口已开放证书错误定时更新Lets Encrypt证书certbot renew带宽不足限制客户端上传速度local_ip 127.0.0.1 bandwidth_limit 2MB内存泄漏定期重启服务sudo systemctl restart frps实际部署中发现为每个服务配置独立子域名比使用端口分流更稳定。当家庭网络变动时frpc的自动重连机制通常能在30秒内恢复服务配合微信通知脚本可以实时掌握连接状态。

更多文章