一个非常棒的内网穿透工具frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
我在开发微信公众号时用到了,当我们调试公众号消息时,需要用到公网环境,如果没有内网穿透,微信公众号消息就无法送达到我们的服务,如果你没有公网服务器,我以前写过一篇文章,是使用ngrok调试微信公众号开发的。这次我们讲下,使用frp实现内网穿透服务。
我先讲下为何使用frp?
首先,我们看下frp的特性。它通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
-
客户端服务端通信支持 TCP、QUIC、KCP 以及 Websocket 等多种协议。
-
采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间,降低请求延迟。
-
代理组间的负载均衡。
-
端口复用,多个服务通过同一个服务端端口暴露。
-
支持 P2P 通信,流量不经过服务器中转,充分利用带宽资源。
-
多个原生支持的客户端插件(静态文件查看,HTTPS/HTTP 协议转换,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
-
高度扩展性的服务端插件系统,易于结合自身需求进行功能扩展。
-
服务端和客户端 UI 页面。
然后,我讲下我的现场环境,我有一台公网云服务器,这台服务器运行我的公众号服务,现在我要在本地开发公众号服务并进行调试。我需要借助服务器的公网环境。如果你没有公网云服务器,你想要一台公网云服务器,从下面的链接购买有优惠。
想在阿里云购买,请使用这个链接:
https://www.aliyun.com/minisite/goods?userCode=zrqh6alb
想在腾讯云购买,请使用这个链接:
https://curl.qcloud.com/XX6que5w
通过以上链接购买,有很大优惠。
现在,我讲下如何安装配置frp。
frp采用Golang语言编写,支持跨平台,只需下载适合的二进制文件即可执行,无需额外依赖。可以在项目的Release中进行下载。我们需要将frpc复制到您的内网主机,将frps复制到您的拥有公网IP的服务器上。
我们以微信公众号开发环境为例来进行配置。
一、在你的本地内网主机,配置frpc.toml文件。
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "test_htts2http"
type = "https"
customDomains = ["test.yourdomain.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
# HTTPS 证书相关的配置
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
注意:
1,HTTP SSL证书可以使用阿里云、或腾讯云的免费SSL证书,可以使用3个月。
2,它还需要https2http插件,它可以将本地HTTP服务转换为HTTPS服务,以供外部访问。
3,需要将test.yourdomain.com域名解析到你的公网IP上,即serverAddr对应的IP地址。
二、在你的公网服务器上,配置frps.toml文件。
bindPort = 7000
vhostHTTPSPort = 443
注意:bindPort是frpc客户端连接的端口,vhostHTTPSPort是对外提供HTTPS服务的端口。您需要将服务器的防火墙放开7000和443端口。
三、启动服务
我们需要分别启动frps和frpc,启动命令如下:
./frps -c ./frps.toml
./frpc -c ./frpc.toml
四、访问HTTPS服务
打开您的Web浏览器,访问https://test.yourdomain.com。就可以访问您的内网服务了。微信公众号开发则需将域名地址配置到公众号管理后台。然后本地就可以进行公众号开发调试了。
frp除了可以支持处理HTTP服务外,还支持其它多种服务。我觉得其中不错的功能还有处理SSH服务,可以配置frp实现通过公网访问内网SSH服务,这个可以用在家里的小主机上,可实现远程访问内网服务器。我还使用frp进行过集成支付宝联调。frp还有一些其它应用场景,可能你会用到。想要了解更多的内容请查看frp项目地址:
https://github.com/fatedier/frp