Frp内网穿透,实现本地接口测试微信回调通知
场景
微信的支付回调通知 API 中,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。
http://localhost:8080/pay/transactions/native/notify 为本地微信支付回调地址,通过 frp 内网穿透回调本地接口进行 debug 测试。
预期效果
一台公网服务器和域名 frp.liuzx.com.cn ,其中 80 端口已被 Nginx 监听占用。
本地接口 http://localhost:8080/test
,实现以下访问方式:
- http://frp.liuzx.com.cn/test(直接域名不带端口访问)
- https://frp.liuzx.com.cn/test(https 访问)
- http://frp.liuzx.com.cn:8080/test(域名 + 端口访问)
- http://ip:8080/test(IP + 端口访问)
不能停止 Nginx 服务,意味着 Frp 与 Nginx 需要同时使用 80 端口。主要思路就是通过 Nginx 转发到 Frp 监听的 HTTP 请求端口。
Frp实现内网穿透
Frp(Fast Reverse Proxy)是一种用于实现内网穿透的工具,它允许您通过公网访问位于内网的服务器或设备。以下是使用 Frp 实现内网穿透的基本步骤:
安装 Frp:
首先,您需要在公网服务器和内网设备上分别安装 Frp。目前可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件,所有文件被打包在一个压缩包中。下载并解压适用于服务端和客户端操作系统的 Frp 二进制文件。
其中 fprc 和 frpc.ini 是客户端需要用到的文件;fprs 和 frps.ini 是服务端需要用到的文件
配置 Frp 服务器端:
在公网服务器上配置 Frp 服务器端,以监听指定的端口,并将请求转发到内网设备。编辑 Frp 服务器的配置文件
frps.ini
。1
2
3
4[common]
bind_port = 7000
vhost_http_port = 780
vhost_https_port = 7443bind_port
:7000,用于 Frp 客户端与 Frp 服务器端之间的通信。vhost_http_port
:780,用于处理 HTTP 流量。vhost_https_port
:7443,用于处理 HTTPS 流量。
vhost_http_port = 80 和 vhost_https_port = 443 使用默认端口 80 和 443 可以实现不加端口访问
配置 Frp 客户端端:
在内网设备上配置 Frp 客户端,以将内网设备的服务暴露给公网。编辑 Frp 客户端的配置文件
frpc.ini
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26[common]
server_addr = 143.167.51.17
server_port = 7000
[web]
type = http
local_port = 8080
custom_domains = frp.liuzx.com.cn
[web2]
type = http
local_port = 8080
custom_domains = 143.167.51.17
[web3]
type = https
custom_domains = frp.liuzx.com.cn
plugin = https2http
plugin_local_addr = 127.0.0.1:8080
# HTTPS 证书相关的配置
plugin_crt_path = /Users/vincent/liuzx.com.cn/frp.liuzx.com.cn_nginx/frp.liuzx.com.cn_bundle.crt
plugin_key_path = /Users/vincent/liuzx.com.cn/frp.liuzx.com.cn_nginx/frp.liuzx.com.cn.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp- web :
local_port
为本地机器上 Web 服务监听的端口,绑定自定义域名为frp.liuzx.com.cn
。 - web2 :
local_port
为本地机器上 Web 服务监听的端口,绑定服务器 IP 。 - web3 :
plugin
配置为https2http
,表示使用 HTTPS 到 HTTP 的插件进行转发。plugin_local_addr
是本地内网服务的地址。
- web :
服务端 Nginx 配置:
主要思路就是通过 Nginx 转发 Frp 服务监听的端口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59server {
listen 80;
server_name frp.liuzx.com.cn;
location / {
proxy_pass http://127.0.0.1:780;
proxy_redirect https://$host/ https://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
proxy_set_header Host $host;
}
}
server {
listen 8080;
server_name frp.liuzx.com.cn;
location / {
proxy_pass http://127.0.0.1:780;
proxy_redirect https://$host/ https://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
proxy_set_header Host $host;
}
}
server {
listen 8080;
location / {
proxy_pass http://127.0.0.1:780;
proxy_redirect https://$host/ https://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
proxy_set_header Host $host;
}
}
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名(腾讯云免费域名只支持绑定单个域名)
server_name frp.liuzx.com.cn;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/conf.d/frp.liuzx.com.cn/frp.liuzx.com.cn_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/conf.d/frp.liuzx.com.cn/frp.liuzx.com.cn.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:780;
proxy_redirect https://$host/ https://$http_host/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
proxy_set_header Host $host;
}
}通过
./frps -c ./frps.ini
启动服务端,再通过./frpc -c ./frpc.ini
启动客户端。
测试可以穿透到内网的访问地址:
- 直接使用 Frp 监听的端口,不经过 Nginx 转发:
- 通过 Nginx 转发:
参考
Frp 官方文档:https://gofrp.org/docs/
Frp 和 Nginx 共用端口:https://www.cnblogs.com/hahaha111122222/p/14544367.html