frp 的几种常见用法
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
原理
frp 主要由 客户端(frpc
) 和 服务端(frps
) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。但用户通过访问具有公网 IP 的服务端 frps,由 frps 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
使用方式
非常简单,从 GitHub Release 页面下载解压出来,直接运行即可。
服务端:
1 | $ ./frps -c ./frps.ini |
客户端:
1 | $ ./frpc -c ./frpc.ini |
frp 使用的重点在于配置文件,不同场景具体的配置也有所不同。查看 官方文档 获取详情。
SSH 登录内网
服务端:
1 | [common] |
客户端:
1 | [common] |
在这个场景中,客户端
指的是我们希望登录的那台内网机器,而不是 SSH 客户端。
程序运行后,我们可以通过 SSH 登录 服务端
的 6000 端口:
1 | $ ssh -oPort=6000 username@x.x.x.x |
暴露内网的 Web 服务
四层代理
事实上,上面的场景并不是只能用于 SSH 登录,它本质上是将四层数据进行了透传。
我们简单的将上面的客户端配置文件修改一下即可通过四层透传 Web 服务数据:
1 | [common] |
此时我们便可以通过 服务端
的 80 或 443 端口访问处于内网中的 客户端
上的 Web 服务了。
当然,也可以是其它端口的其它服务。
七层代理
服务端:
1 | [common] |
客户端:
1 | [common] |
选择四层还是七层的方式取决于自己的业务场景,不同场景下适合的方案不同。
对于同一个端口,不能同时使用四层代理和七层代理,因为四层代理根据 IP
和 端口
处理请求,会将位于七层的请求也一并处理掉。
如果后端还有四层代理或者希望在后端进行 TLS 终止
,则只能使用四层代理进行透传。
负载均衡
对于有多个后端的情况,可以通过 group
和 group_key
进行负载均衡。frp 根据 group
进行分组、通过 group_key
做权限验证。
1 | [web-1] |