告别Ngrok!用frp实现个人博客/测试环境的HTTPS内网穿透(实战踩坑记录)
从Ngrok迁移到frp:打造安全高效的HTTPS内网穿透方案
为什么选择frp替代Ngrok?
三年前,当我第一次需要将本地开发环境暴露到公网时,Ngrok几乎是唯一的选择。但随着项目复杂度提升,Ngrok的局限性逐渐显现——配置不够灵活、自定义域名需要付费、性能瓶颈难以突破。直到发现frp这个开源神器,才真正解决了我的痛点。
frp作为一款高性能的反向代理工具,相比Ngrok具有三大核心优势:
- 完全开源可控:Ngrok 2.x闭源后,社区版功能受限,而frp始终保持开源,允许深度定制
- 协议支持全面:除基础的HTTP/HTTPS外,还支持TCP/UDP等协议,适用更多场景
- 配置自由度极高:从端口映射到负载均衡,几乎所有参数都可按需调整
特别对于需要HTTPS访问的个人博客或测试环境,frp配合Nginx能实现媲美生产环境的SSL配置。我曾用这套方案为团队搭建过临时演示环境,客户完全没察觉这是通过内网穿透实现的访问。
环境准备与基础配置
服务器端安装
选择云服务商时,建议优先考虑网络延迟低的区域。我的经验是,1核1G配置的服务器就足以支撑中小流量穿透需求。以下是基于Ubuntu 22.04的安装示例:
# 下载最新版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
sudo mv frp_0.51.3_linux_amd64 /usr/local/frp
关键配置文件解析
frps.ini是服务端的核心配置文件,这些参数值得特别关注:
[common]
bind_port = 7000
token = your_strong_password_here
vhost_http_port = 8080
vhost_https_port = 8443
# 安全增强配置
tls_only = true
allow_ports = 40000-50000
安全提示:token务必使用高强度随机字符串,避免使用默认端口可降低被扫描风险
HTTPS配置实战
证书申请与Nginx集成
使用Let's Encrypt申请通配符证书是最经济的选择:
sudo certbot certonly --manual --preferred-challenges=dns \
-d '*.yourdomain.com' --server https://acme-v02.api.letsencrypt.org/directory
Nginx配置要点:
server {
listen 443 ssl;
server_name *.dev.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/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;
}
}
客户端配置技巧
frpc.ini的HTTPS配置示例:
[web_https]
type = https
local_ip = 127.0.0.1
local_port = 3000
custom_domains = blog.dev.yourdomain.com
# 安全增强
tls_enable = true
protocol = websocket
遇到的一个典型坑点:当同时需要HTTP和HTTPS时,必须在服务端分别配置vhost_http_port和vhost_https_port,否则会出现协议不匹配的错误。
性能优化与稳定性保障
连接保持策略
在移动网络环境下,TCP连接容易中断。通过以下配置可显著提升稳定性:
[common]
login_fail_exit = false
protocol = websocket
heartbeat_interval = 30
heartbeat_timeout = 90
资源监控方案
frp自带的管理面板功能有限,我推荐搭配Prometheus实现深度监控:
# prometheus.yml 配置示例
scrape_configs:
- job_name: 'frp'
static_configs:
- targets: ['frp-server:7500']
监控指标中特别需要关注frp_server_connections和frp_server_traffic_in,它们能直观反映穿透服务的负载情况。
典型应用场景实现
本地开发环境暴露
前端开发者的完美工作流:
- 本地启动React开发服务器(通常为3000端口)
- 配置frpc将端口映射到
dev.yourdomain.com - 团队成员随时访问真实域名测试,无需处理跨域问题
[web_react]
type = http
local_ip = 127.0.0.1
local_port = 3000
custom_domains = react-dev.yourdomain.com
家庭NAS远程访问
通过TCP协议穿透实现安全访问:
[nas_web]
type = tcp
local_ip = 192.168.1.100
local_port = 5000
remote_port = 50000
[nas_ssh]
type = tcp
local_ip = 192.168.1.100
local_port = 22
remote_port = 50001
访问时只需连接nas.yourdomain.com:50000,所有流量都经过TLS加密,比直接暴露SSH端口安全得多。
安全防护进阶方案
防火墙最佳实践
建议在云服务器上配置严格的防火墙规则:
# 只开放必要端口
sudo ufw allow 80,443/tcp
sudo ufw allow 7000/tcp # frp控制端口
sudo ufw allow 40000:50000/tcp # 穿透服务端口范围
sudo ufw enable
访问控制策略
在Nginx层增加基础认证:
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
}
生成密码文件:
sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"
sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
这套方案在我过去两年的使用中经历了各种场景考验,从个人博客到企业级临时演示环境都能稳定支撑。最惊喜的是配合Websocket协议后,即使在移动网络下也能保持流畅的SSH连接体验。对于技术创作者而言,frp+HTTPS的组合既满足了安全需求,又提供了充分的定制空间,远比商业方案来得灵活高效。
更多推荐



所有评论(0)