【内网穿透实战】基于Frp与Docker Compose,打造高可用群晖远程访问方案
1. 为什么需要内网穿透家里有群晖NAS的朋友都知道想要在外网访问家里的NAS资源是个头疼事。运营商不给公网IPQuickConnect速度又慢得像蜗牛这时候就需要内网穿透技术来帮忙了。我最早用花生壳后来试过Ngrok最后发现还是Frp最稳。Frp是个开源的内网穿透工具用Go语言写的性能好还跨平台。最重要的是它能穿透各种协议不管是HTTP、HTTPS还是TCP都能搞定特别适合群晖这种多功能NAS。2. 准备工作2.1 硬件需求首先你得有台云服务器做Frp服务端配置不用太高1核1G就够用。我用的是腾讯云轻量服务器年费才99块钱性价比超高。群晖这边建议用Docker跑Frp客户端这样管理起来方便还能随时调整配置。我用的是DS920系统是DSM 7.2。2.2 软件准备服务器端需要安装Docker和Docker Compose开放7000端口Frp默认通信端口准备个域名可以用免费的二级域名群晖这边需要开启SSH功能控制面板→终端机和SNMP安装Docker套件准备Frpc配置文件3. 服务端配置3.1 Docker Compose部署Frps我习惯用Docker Compose管理服务配置文件清晰又好维护。新建个docker-compose.yml文件version: 3 services: frps: image: snowdreamtech/frps container_name: frps restart: always ports: - 7000:7000 # 客户端连接端口 - 7500:7500 # 控制台端口 volumes: - ./frps.ini:/etc/frp/frps.ini3.2 Frps配置文件同目录下创建frps.ini[common] bind_port 7000 dashboard_port 7500 dashboard_user admin dashboard_pwd your_strong_password token your_secure_token # 启用Prometheus监控 enable_prometheus true # 限制单个IP最大连接数 max_pool_count 50启动服务docker-compose up -d4. 客户端配置4.1 群晖Docker部署Frpc在群晖的Docker里搜索stilleshan/frpc镜像这个镜像专为群晖优化过。或者用SSH登录群晖直接拉取镜像docker pull stilleshan/frpc4.2 Frpc配置文件新建frpc.ini配置文件重点来了[common] server_addr your_server_ip server_port 7000 token your_secure_token # SSH映射 [ssh] type tcp local_ip 192.168.1.100 # 群晖内网IP local_port 22 remote_port 2222 # DSM管理界面 [dsm] type tcp local_ip 192.168.1.100 local_port 5001 remote_port 443 # 文件管理 [dsfile] type tcp local_ip 192.168.1.100 local_port 5001 remote_port 5001 # WebDAV [webdav] type tcp local_ip 192.168.1.100 local_port 5006 remote_port 50074.3 启动Frpc容器在群晖Docker里创建容器时记得把配置文件挂载进去容器路径/frp/frpc.ini本地路径选择你存放frpc.ini的位置建议开启自动重启选项这样NAS重启后Frpc会自动恢复。5. 进阶配置5.1 Nginx反向代理直接用IP端口访问太不优雅了用Nginx做个反向代理server { listen 443 ssl; server_name nas.yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://127.0.0.1:5001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }5.2 健康检查在Frpc配置里加上健康检查服务挂了自动重启[dsm] ... health_check_type tcp health_check_timeout_s 3 health_check_max_failed 3 health_check_interval_s 105.3 带宽限制防止被恶意消耗流量[dsm] ... bandwidth_limit 10MB6. 常见问题解决问题1连接超时检查服务器安全组规则确认Frps和Frpc的token一致试试telnet your_server_ip 7000看端口通不通问题2DSM页面加载不全在群晖控制面板→网络→DSM设置里把HTTP连接自动重定向到HTTPS关掉检查Nginx配置是否正确传递了Host头问题3速度慢试试更换服务器的地域选离你近的机房调整Frp的tcp_mux false试试检查是不是被运营商QoS了7. 安全加固建议定期更换token至少每季度换一次限制访问IP在Frps配置里加allow_ports和allow_ips启用TLS在[common]段加tls_enable true监控流量通过Dashboard观察异常连接关闭不需要的服务比如用不到FTP就别映射21端口实测下来这套方案在我家500M宽带下外网访问DSM页面加载速度在2秒内传文件能跑满上传带宽30Mbps左右。最关键的是稳定性好连续运行半年没出过问题。最后提醒下内网穿透毕竟是把家里网络暴露在公网一定要做好安全防护。我就在这上面栽过跟头有次弱密码被爆破吓得我赶紧上了Fail2ban。现在除了强密码定期更换还加了Google Authenticator二次验证这才放心。