使用frp搭建内网穿透
Rick Wu

内网穿透的概念

“内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。” ——百度百科

简单来说,就是让互联网(外网)设备能访问局域网(内网)设备提供的服务,这里的设备通常指电脑。

内网穿透的应用场景

对开发人员来说,需要使用到内网穿透的一个典型的应用场景就是针对第三方授权(通常是 OAuth2.0)和支付回调的开发调试。通过内网穿透工具将第三方 SDK 或平台的回调地址映射到本机开发环境,从而达到实时调试的目的。

其次是节约部署成本(通常是公网服务器费用)。通过将应用部署在本机,再利用内网穿透工具对外提供服务,这样既能节约服务器租用费用,又能提升服务器的硬件配置。

目前,市面上有不少免费提供内网穿透的工具/产品,比如花生壳,那为什么还要自己搭建呢?
根据笔者的亲生经历,主要有以下几个问题:

  • 免费的域名不固定,有广告,且服务不问题
  • 按月收费,且服务也不一定稳定

笔者搭建内网穿透的目的就属于第一种情况,即低频率开发调试用,因此在拥有公网服务器的条件下,自建是最合适的方式。

内网穿透的搭建工具

ngrok

一个国外的穿透工具,1.0 版本是开源的,目前 2.0 及以上版本已经闭源,并且提供免费和收费的服务。

frp

这是一个国内的开源工具,目前最新版本为 v0.61.1(截止 2025-02-14),有比较详尽的中文文档,并且一直在维护更新。

由于 frp 一直开源,并且维护积极、更新频繁,再加上中文文档的加持,笔者最终选择了 frp 作为搭建工具。

注:frp 自主搭建需要一个有公网 ip 的服务器,本文使用阿里云 ECS。

frp 下载和版本选择

官方 github release 地址,目前最新版本是 v0.61.1(截止 2025-02-14),官方 github 地址可能不易访问和下载,这里提供了 v0.61.1 的常用平台安装包:https://developbook.cn/download/frp/v0.61.1/

版本选择说明

压缩包 说明
frp_0.61.1_darwin_amd64.tar.gz 适用于 Mac OS 系统
frp_0.61.1_freebsd_amd64.tar.gz 适用于 FreeBSD 64 位系统
frp_0.61.1_linux_amd64.tar.gz 适用于 Linux 64 位系统
frp_0.61.1_linux_arm.tar.gz 适用于 Linux 32 位嵌入式系统
frp_0.61.1_linux_arm64.tar.gz 适用于 Linux 64 位嵌入式系统
frp_0.61.1_windows_amd64.zip 适用于 Windows 64 位系统
frp_0.61.1_windows_arm64.zip 适用于 Windows 64 位嵌入式系统

笔者的服务器系统为 CentOS7 64 位,所以选择了 frp_0.61.1_linux_amd64.tar.gz;笔者的个人电脑系统为 Mac OS X,所以选择了 frp_0.60.1_darwin_amd64.tar.gz。

下载方式

直接下载

直接点击链接,使用浏览器下载到本机。利用 ssh 工具连接到阿里云 ECS,再使用 lrzsz 工具的 rz 命令将 frp_0.61.1_linux_amd64.tar.gz 上传到服务器,而压缩包 frp_0.61.1_darwin_amd64.tar.gz 直接在本机解压。

推荐大家一款 Mac 上好用的免费 SSH 工具:FinalShell

注:ssh 工具、lrzsz 实用工具的安装和用法可自行搜索。

终端命令下载

  • 服务器
1
2
3
4
5
6
// 下载
wget https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_linux_amd64.tar.gz


// 解压
tar -xzvf frp_0.61.1_linux_amd64.tar.gz
  • 本机
1
2
3
4
5
// 使用curl下载
curl -O https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_darwin_amd64.tar.gz

// 解压
tar -xzvf frp_0.61.1_darwin_amd64.tar.gz

frp 压缩包文件说明

每个压缩包解压后都包含以下文件:

  • frpc —— 客户端可执行二进制文件
  • frpc.toml —— 客户端使用的配置文件
  • frps —— 服务端可执行二进制文件
  • frps.toml —— 服务端使用的配置文件

注:服务端只需用到 frp_0.61.1_linux_amd64 目录下的 frps 相关文件,本机(客户端)只需用到 frp_0.61.1_darwin_amd64 目录下的 frpc 相关文件。

服务端配置和启动

1、在服务器上打开 frps.toml:

1
vi frps.toml

注:确保当前已进入工作目录/root/frp_0.61.1_linux_amd64/。

2、配置 frps 要监听的端口:按下 i 进入编辑模式,在末尾增加一行:vhostHTTPPort = 8080,使 frps.toml 最终配置如下:

1
2
3
[common]
bindPort = 7000
vhostHTTPPort = 8080

注:vhostHTTPPort 监听的端口不能被占用,否则会导致 frps 不能启动,端口可根据实际需要修改;bindPort 端口为 frp 服务端和客户端连接通信的端口,默认为 7000。

3、保存配置并退出:按下 Esc,输入:wq。

4、启动 frps 程序:

1
./frps -c ./frps.toml

注:如遇 permission denied 错误,表明 frps 可能没有运行权限,则先赋权:

1
chmod 700 frps

然后再次执行启动命令。

客户端配置和启动

1、在本机进入 frp_0.61.0_darwin_amd64 目录,打开 frpc.toml 文件;

2、以配置访问内网的 web 服务(常见情形)为例,最终修改 frpc.toml 如下:

1
2
3
4
5
6
7
8
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "local-service"
type = "http"
localIP = "127.0.0.1"
localPort = 3000

注:x.x.x.x 为运行 frps 的服务器公网 ip,localPort 为本机启动的 web 服务对应的端口,请根据实际情况修改。

3、启动 frpc 程序:

1
sudo ./frpc -c ./frpc.toml

注:此时 frpc 会通过 7000 端口尝试与 frps 建立通信连接,如果一切顺利,则终端会提示连接成功;但实际情况却显示连接失败,因为还少了两个步骤:

一、需要登录阿里云控制台将 7000 端口加入阿里云 ECS 安全组的入站规则里面,同理还需将 8080 端口加入。具体操作参考:添加安全组规则

二、将 7000 和 8080 加入服务器防火墙规则,具体操作参考:CentOS7 使用 firewalld 打开关闭防火墙与端口

当一切就绪,frpc 启动并连接成功后,打开浏览器输入 x.x.x.x:8080 就能访问到本机 127.0.0.1:3000 的服务(本机 web 服务需要处于启动状态)。

至此,一个最简配置的基于 frp 的内网穿透便搭建完成,更多配置和用法,请参考官方文档:frp 官方中文文档

 打赏就像点赞的豪华版,既然你都看到这儿了,不如顺手点个‘钞能力’支持一下?你的打赏是我熬夜码字的动力!
 评论
评论插件加载失败
正在加载评论插件