内网穿透工具-frp

引言

frp 官方地址: https://github.com/fatedier/frp/blob/dev/README_zh.md

例如我们平时开发过程中遇到联调微信/支付宝支付等第三方服务时,我们请求了微信/支付宝的支付接口,微信/支付宝官方需要给我们响应,用来表示支付是否成功,此时就需要请求我们暴露在公网的接口地址。我们可以实用 frp 作为内网穿透工具,这样我们就可以本地接收到微信或者支付宝返回给我们的请求,还是很实用的。

整体的流程我这里做一些简单的阐述,首先购买一台外网服务,在服务山部署 frp 服务,同时在自己电脑上也开启 frp 服务,调通后,将微信/支付宝的响应请求的地址(通常官方都会有让用户输入请求地址的选项)改为我们服务器的公网地址,当微信或者支付宝请求服务器地址时,服务器会把请求转发到本机,此时我们在本机打断点就可以拦截到。大致流程如图 1-1 所示

1-1

frp 具体配置

frp 是什么?

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用 frp?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

下载

GitHub: https://github.com/fatedier/frp/releases

注意: 选择好自己系统对应的架构和CPU类型

使用

下载好之后服务器和本机各放一份。 文件目录如下:

配置服务端配置文件

1
2
[common]
bind_port = 7000

配置客户端配置文件

1
2
3
4
5
6
7
8
9
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8088
remote_port = 80

参数解释:

  • server_addr 服务器的IP地址
  • server_port 和服务端对应的通信端口
  • type 类型
  • local_ip 本机IP
  • local_port 访问本地的端口
  • remote_port 服务器用于转发的端口

访问服务器的 80 端口,会转到到本地的 8088 端口

启动

编写配置文件,先通过 ./frps -c ./frps.ini 启动服务端,再通过 frpc -c ./frpc.ini 启动客户端。如果需要在后台长期运行,建议结合其他工具使用,例如 systemdsupervisor

服务端启动成功后打印的日志如下:

1
2
3
4
5
6
7
[root@VM-8-16-centos frp_0.36.2_linux_386]# ./frps -c ./frps.ini
2021/05/11 14:42:49 [I] [root.go:200] frps uses config file: ./frps.ini
2021/05/11 14:42:49 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
2021/05/11 14:42:49 [I] [root.go:209] frps started successfully
2021/05/11 14:45:15 [I] [service.go:449] [c1756581397dede4] client login info: ip [114.221.154.184:58609] version [0.36.2] hostname [] os [windows] arch [386]
2021/05/11 14:45:15 [I] [tcp.go:63] [c1756581397dede4] [ssh] tcp proxy listen port [0]
2021/05/11 14:45:15 [I] [control.go:446] [c1756581397dede4] new proxy [ssh] success