IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

内网穿透神器frp

昔我往矣 2020-02-07 14:18:40 累计浏览 3,144 次
本机暂存

在许多情况下,我们希望把内部的服务暴露到外网来使用,比如说:

  • 在公司内网开发程序,要和微信联调。

  • 想要随时随地登录家里的树莓派,使用上面的服务

在这些情况下,我们就会很迫切的希望有一个内网穿透服务,帮我们把内部的端口,暴露到外网来。

为此,以前玩过一段时间的ngrok,当时国外的ngrok很慢,国内的要收费,而且,ngrok的安装配置相当复杂,我记得当时还要编译服务端客户端(好像是为了使用证书,不知道现在怎么样了)。

后来,终于最后发现了frp这件神器。我把frp服务端搭建在自己的google cloud上,速度很快,配置简单。我可以通过它访问家的树莓派。在公司里,我们搭建frp之后,让外部联调变得很简单。frpgithub上已经有了1w多个star了。当前的最新版本是 v0.16.0,我使用的是 v0.12.0github地址

搭建与配置

下面来说说怎么搭建和使用frpfrp分为服务端程序和客户端程序,在frp中仓库中下载编译好的二进制代码即可。比如,我用的是amd64的服务端,运行在google cloud上,arm的客户端,运行在家里树莓派上。

解压从githubRelease上下载的二进制压缩包,可以在里面看到frpsfrpcfrps相关的是服务端的程序和配置文件,frpc开头的是客户端的程序和配置文件。

服务端配置(frps.ini)

在外网服务器上(比如我的google cloud)搭建frp服务端frps,修改服务端的配置为如下:

[common]bind_port = 7000# 监听的服务端口,客户端会向它发起连接vhost_http_port=80# 遇到http类型的穿透,使用80端口,如果不穿透web服务,不用配置此项privilege_token=buyaogaosubieren   # 可选,但是建议加上,客户端需要有同样的值才允许连接,加固安全性

so easy?

客户端配置(frpc.ini)

在内网机器上(比如我家里的树莓派)搭建frp的客户端frpc,修改客户端配置文件如下:

[common]server_addr = x.x.x.x# 替换成你的服务器地址server_port = 7000# 服务端的端口号privilege_token=buyaogaosubieren  # 如果服务端设置了token,那客户端要保持一致才连得上[ssh]type = tcp  # 把tcp类型的服务穿透出去local_ip = 127.0.0.1# 本地ip地址local_port = 22# 本地端口号,我是把ssh服务穿透到外网remote_port = 5022# 在外网服务器上开通5022端口,代理本地的22号端口[web]type = http   # 代理本地的http服务local_port = 8080# 本地http服务端口是8080custom_domains = demo.frp.xnow.me# 为该端口启用 demo.frp.xnow.me的域名。前提是该域名必须指向上面的frp服务端。

至此配置就结束了。

启动frp服务端和客户端

先启动frps服务端

进入外网服务器的frp的程序目录,把可执行文件frps和配置文件frps.ini放在当前目录,执行如下命令:

# ./ frps -c ./frps.ini

启动frpc客户端

同理,进入我家内网的frp的程序目录,把可执行文件frpc和配置文件frpc.ini放在当前目录,执行如下命令:

# ./ frpc -c ./frpc.ini

访问方式

访问我们配置的ssh代理,如下:

ssh -p 5022 user@x.x.x.x# x.x.x.x 为frp服务端地址

访问我们的web代理,需要提前把域名解析到frp服务端地址,访问地址为 http://x.x.x.x/

小结

可以看到,frp的配置相当人性化,十分简洁,只要10分钟,就能快速搭建起来。以上只是演示了frp的一小部分功能,更多丰富的用法,请看官方文档

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 解析nginx负载均衡 (累计阅读 16,622)
  2. Go Reflect 性能 (累计阅读 14,155)
  3. 面向“接口”编程和面向“实现”编程 (累计阅读 13,910)
  4. 解决 nginx 反向代理网页首尾出现神秘字符的问题 (累计阅读 9,094)
  5. 一种基于长连接的社交游戏服务器程序构架 (累计阅读 7,505)
  6. 从Go看,语言设计(一) (累计阅读 6,165)
  7. go-kit 入门(一) (累计阅读 4,769)
  8. 分布式存储Seaweedfs源码分析 (累计阅读 4,752)
  9. 为什么我们要使用Go语言以及如何使用它的 (累计阅读 4,582)
  10. Go 语言初步 (累计阅读 4,500)