frp 的几种常见用法

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 登录内网

服务端:

frps.ini
1
2
[common]
bind_port = 7000 # 服务端监听端口,客户端(frpc)通过该端口与服务端连接

客户端:

frpc.ini
1
2
3
4
5
6
7
8
9
[common]
server_addr = x.x.x.x # 服务端 IP 地址,可以是公网 IP,也可以是可达的局域网 IP 地址
server_port = 7000 # 服务端监听端口

[ssh]
remote_port = 6000 # 暴露服务端机器上的 6000 端口
type = tcp # 传输类型
local_ip = 127.0.0.1 # 将服务端 6000 端口的数据透传至该 IP 地址,也可以是可达的局域网 IP 地址,不填则表示 127.0.0.1
local_port = 22 # 将服务端 6000 端口的数据透传至该端口

在这个场景中,客户端 指的是我们希望登录的那台内网机器,而不是 SSH 客户端。

程序运行后,我们可以通过 SSH 登录 服务端 的 6000 端口:

1
$ ssh -oPort=6000 username@x.x.x.x

暴露内网的 Web 服务

四层代理

事实上,上面的场景并不是只能用于 SSH 登录,它本质上是将四层数据进行了透传。

我们简单的将上面的客户端配置文件修改一下即可通过四层透传 Web 服务数据:

frpc.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[common]
server_addr = x.x.x.x
server_port = 7000

[80]
remote_port = 80 # 暴露服务端机器上的 80 端口
type = tcp # 传输类型
local_ip = 127.0.0.1 # 将服务端 80 端口的数据透传至该 IP 地址
local_port = 80 # 将服务端 80 端口的数据透传至该端口

[443]
remote_port = 443 # 暴露服务端机器上的 443 端口
type = tcp # 传输类型
local_ip = 127.0.0.1 # 将服务端 443 端口的数据透传至该 IP 地址
local_port = 443 # 将服务端 443 端口的数据透传至该端口

此时我们便可以通过 服务端 的 80 或 443 端口访问处于内网中的 客户端 上的 Web 服务了。

当然,也可以是其它端口的其它服务。

七层代理

服务端:

frps.ini
1
2
3
[common]
bind_port = 7000
vhost_http_port = 80 # 启用一个 HTTP 服务监听 80 端口

客户端:

frpc.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
custom_domains = www.domain-1.com # 服务端收到是对 www.domain-1.com 的访问请求
local_port = 7000 # 将请求代理至 7000 端口

[web2]
type = http
custom_domains = www.domain-2.com # 服务端收到是对 www.domain-2.com 的访问请求
local_port = 8080 # 将请求代理至 8080 端口

选择四层还是七层的方式取决于自己的业务场景,不同场景下适合的方案不同。

对于同一个端口,不能同时使用四层代理和七层代理,因为四层代理根据 IP端口 处理请求,会将位于七层的请求也一并处理掉。

如果后端还有四层代理或者希望在后端进行 TLS 终止,则只能使用四层代理进行透传。

负载均衡

对于有多个后端的情况,可以通过 groupgroup_key 进行负载均衡。frp 根据 group 进行分组、通过 group_key 做权限验证。

frpc.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
[web-1]
group = web
group_key = 123
remote_port = 80 # 暴露服务端机器上的 80 端口
type = tcp
local_port = 7000 # 将服务端 80 端口的数据透传至该端口

[web-2]
group = web
group_key = 123
remote_port = 80 # 暴露服务端机器上的 80 端口
type = tcp
local_port = 8080# 将服务端 80 端口的数据透传至该端口

参考链接

frp

希望加入负载均衡功能,以及提供外部接口

评论