从Ngrok迁移到frp:打造安全高效的HTTPS内网穿透方案

为什么选择frp替代Ngrok?

三年前,当我第一次需要将本地开发环境暴露到公网时,Ngrok几乎是唯一的选择。但随着项目复杂度提升,Ngrok的局限性逐渐显现——配置不够灵活、自定义域名需要付费、性能瓶颈难以突破。直到发现frp这个开源神器,才真正解决了我的痛点。

frp作为一款高性能的反向代理工具,相比Ngrok具有三大核心优势:

  1. 完全开源可控:Ngrok 2.x闭源后,社区版功能受限,而frp始终保持开源,允许深度定制
  2. 协议支持全面:除基础的HTTP/HTTPS外,还支持TCP/UDP等协议,适用更多场景
  3. 配置自由度极高:从端口映射到负载均衡,几乎所有参数都可按需调整

特别对于需要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_portvhost_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_connectionsfrp_server_traffic_in,它们能直观反映穿透服务的负载情况。

典型应用场景实现

本地开发环境暴露

前端开发者的完美工作流:

  1. 本地启动React开发服务器(通常为3000端口)
  2. 配置frpc将端口映射到dev.yourdomain.com
  3. 团队成员随时访问真实域名测试,无需处理跨域问题
[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的组合既满足了安全需求,又提供了充分的定制空间,远比商业方案来得灵活高效。

更多推荐