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

基于frp与Nginx的HTTPS子域名内网穿透实战

1. 为什么需要内网穿透?

很多朋友可能都遇到过这样的困扰:家里或者公司内网搭建了一些服务,比如NAS存储、智能家居控制面板、开发测试环境等,但这些服务只能在局域网内访问。一旦出门在外,想查看家里的监控或者访问公司内部系统就变得非常困难。这就是内网穿透要解决的问题。

我去年帮朋友的公司部署了一套内部管理系统,他们办公室用的是动态IP,每次重启路由器公网IP就会变,导致远程办公非常不便。后来我们采用了frp+Nginx的方案,完美解决了这个问题。现在他们的员工在任何地方都能安全访问内网服务,而且用的是熟悉的域名方式访问,体验和访问普通网站完全一样。

2. 环境准备与工具介绍

2.1 硬件与网络需求

要实现这个方案,你需要准备以下几样东西:

  • 一台具有公网IP的云服务器(阿里云、腾讯云等都行)
  • 一个已经备案的域名
  • 需要暴露的内网服务(比如本地开发的Web应用)
  • 内网中能够长期运行的设备(比如树莓派、旧电脑等)

我建议云服务器选择1核2G以上的配置,因为Nginx和frp对资源消耗都不大。域名备案通常需要3-20个工作日,建议提前准备。内网设备最好能7×24小时运行,确保服务持续可用。

2.2 软件工具选择

frp是一个用Go语言开发的高性能反向代理工具,它分为服务端(frps)和客户端(frpc)。服务端运行在公网服务器上,客户端运行在内网设备上。两者通过TCP长连接保持通信,当外部请求到达服务端时,frps会通过这个长连接将请求转发给frpc,再由frpc转发给内网服务。

Nginx则是我们熟知的Web服务器和反向代理工具。在这里它主要承担三个角色:

  1. 将HTTP请求转发到frp服务端口
  2. 处理HTTPS加密通信
  3. 实现基于域名的虚拟主机路由

3. frp服务端配置详解

3.1 安装与基础配置

首先在云服务器上下载frp。我习惯放在/opt目录下:

wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz tar -zxvf frp_0.30.0_linux_amd64.tar.gz cd frp_0.30.0_linux_amd64

编辑frps.ini配置文件:

[common] bind_port = 7000 vhost_http_port = 8080 vhost_https_port = 8443 token = your_secure_token_here subdomain_host = frp.yourdomain.com dashboard_port = 7500 dashboard_user = admin dashboard_pwd = admin123

这里有几个关键参数需要注意:

  • bind_port是frp控制通道端口,保持默认7000即可
  • vhost_http_portvhost_https_port是实际处理HTTP/HTTPS请求的端口
  • token是客户端连接时的认证凭证,建议设置复杂一些
  • dashboard相关参数开启了frp的管理界面,方便监控连接状态

3.2 启动与防火墙设置

使用以下命令启动frps:

nohup ./frps -c ./frps.ini > frps.log 2>&1 &

别忘了在云服务器安全组和本地防火墙中开放相关端口:

  • 7000(frp控制端口)
  • 8080(HTTP转发端口)
  • 8443(HTTPS转发端口)
  • 7500(管理界面端口)

4. 域名解析与SSL证书配置

4.1 DNS解析设置

在域名管理后台添加两条A记录:

  1. frp.yourdomain.com → 云服务器IP
  2. *.frp.yourdomain.com → 云服务器IP

这样无论是a.frp.yourdomain.com还是b.frp.yourdomain.com,都会解析到你的云服务器。

4.2 使用Let's Encrypt获取免费SSL证书

我推荐使用certbot工具自动获取和续期证书:

sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d frp.yourdomain.com -d *.frp.yourdomain.com

证书会自动配置到Nginx中,并且每90天会自动续期。这是目前最方便的HTTPS解决方案,完全免费且自动化程度高。

5. frp客户端配置实战

5.1 基础客户端配置

在内网设备上下载对应版本的frp,然后编辑frpc.ini:

[common] server_addr = your.server.ip server_port = 7000 token = your_secure_token_here [web_app] type = http local_port = 8000 subdomain = app [home_assistant] type = http local_port = 8123 subdomain = ha

这个配置定义了两个服务:

  • app.frp.yourdomain.com 映射到内网的8000端口
  • ha.frp.yourdomain.com 映射到内网的8123端口

5.2 客户端自启动设置

为了让frpc能随系统启动,可以创建systemd服务:

sudo vim /etc/systemd/system/frpc.service

添加以下内容:

[Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/path/to/frpc -c /path/to/frpc.ini [Install] WantedBy=multi-user.target

然后启用服务:

sudo systemctl enable frpc sudo systemctl start frpc

6. Nginx高级配置技巧

6.1 基础反向代理配置

编辑Nginx配置文件(通常在/etc/nginx/conf.d/下新建一个frp.conf):

server { listen 80; server_name *.frp.yourdomain.com frp.yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name *.frp.yourdomain.com frp.yourdomain.com; ssl_certificate /etc/letsencrypt/live/frp.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/frp.yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

这个配置实现了:

  1. HTTP自动跳转到HTTPS
  2. 通配符域名支持
  3. 请求转发到frp的HTTP端口(8080)
  4. 完整的HTTPS加密

6.2 性能优化配置

在高并发场景下,可以添加以下优化参数:

proxy_http_version 1.1; proxy_set_header Connection ""; proxy_buffering off; proxy_request_buffering off; proxy_read_timeout 300s; proxy_send_timeout 300s;

这些配置可以显著提升长连接性能,特别适合WebSocket应用。

7. 安全加固与故障排查

7.1 安全最佳实践

  1. 定期更换token:frp的token相当于密码,建议每3个月更换一次
  2. 限制访问IP:在frps.ini中添加allow_ports限制可转发的端口范围
  3. 启用TLS加密:在[common]部分添加tls_enable = true启用端到端加密
  4. 禁用dashboard:生产环境建议关闭dashboard或设置强密码

7.2 常见问题排查

问题1:客户端连接失败

  • 检查token是否一致
  • 确认服务器防火墙和安全组设置
  • 查看frps和frpc的日志文件

问题2:能连接但无法访问服务

  • 检查本地服务是否正常运行
  • 确认Nginx配置中的proxy_pass地址正确
  • 查看frp管理界面确认连接状态

问题3:HTTPS证书警告

  • 确保证书包含所有子域名(通配符或SAN证书)
  • 检查证书是否过期
  • 确认Nginx配置中证书路径正确

在实际部署过程中,我遇到过Nginx偶尔返回502错误的情况,后来发现是frpc进程占用了太多内存。解决方案是在frpc.ini中添加了pool_count = 5限制连接池大小,问题就解决了。

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

相关文章:

  • WRF新手必看:Single Domain Case模拟全流程详解(附常见错误排查)
  • 万象熔炉 | Anything XL参数调优:高CFG(12.0)在精细控制下的适用边界
  • 如何验证BGE-Reranker-v2-m3是否正常工作?测试脚本教程
  • MATLAB仿真研究:支路电气介数与HVDC、FACTS-TCSC、FACTS-UPFC模型的...
  • Linux进程与程序的本质区别及内存布局解析
  • 为什么PatchCore能吊打传统方法?深入拆解工业异常检测三大利器
  • Pixel Dimension Fissioner 开发环境配置:Ubuntu系统一站式部署教程
  • Hackintool:黑苹果系统配置的全能解决方案
  • 告别手动建模!用Cursor+Blender MCP实现AI一句话生成3D模型(附保姆级避坑指南)
  • 如何5分钟定位Windows热键冲突?Hotkey Detective终极指南
  • OpenClaw模型微调:GLM-4.7-Flash适配专属自动化场景
  • 大语言模型跨界时间序列预测:Time-LlaMA背后的三大核心技术解析
  • GLM-4-9B-Chat-1M长文本处理实战:基于Python的百万字符上下文分析
  • Kali 2025实战:一站式部署Pikachu靶场环境指南
  • Qwen3.5-9B视觉语言统一模型:多模态推理服务稳定性优化
  • 零成本解决团队协作难题:OpenProject如何提升项目管理效率
  • Ubuntu20.04下CUDA11.8与PyTorch2.0环境配置全攻略
  • 新手避坑指南:STM32按键控制LED时常见的3个硬件问题及解决方法
  • 多模态扩展:OpenClaw整合Qwen3-32B实现截图内容分析
  • Phi-3 Forest Lab环境部署:Ubuntu 22.04 + CUDA 12.1 + Phi-3 Mini全链路验证
  • PVE小白必看:手把手教你用Proxmox VE 5.4.1安装MikroTik RouterOS软路由(附L5授权保留技巧)
  • 手把手教你用dcluster+supersonic搭建企业级ChatBI系统(附避坑指南)
  • 国风美学生成模型v1.0硬件指南:STM32在交互装置中触发模型生成的联动设计
  • Qwen3-TTS-VoiceDesign部署案例:边缘设备Jetson Orin Nano CPU模式轻量部署方案
  • 4090 vs A100:大模型推理性价比实战对比(附完整测试代码)
  • 双RTX 4090部署TranslateGemma:企业级翻译系统快速搭建指南
  • PICO 4 Ultra开发者必看:解决Android 14下Unity外部存储读写权限的两种实战方案
  • 不花冤枉钱!用Tinkercad+Micro:bit免费玩转硬件编程(附传感器模拟教程)
  • 影墨·今颜助力操作系统课程设计:AI生成概念图解
  • 教师必备!这款免费Word插件让你的教案制作效率提升300%(附安装包)