Frp的使用
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
具体的使用说用项目主页上已经写得很详细了,见 中文说明
软件下载地址: https://github.com/fatedier/frp/releases
amd64 下载链接:https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz
这里只把相关配置做个实践记录
frp 的作用
- 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
与ngrok的不同
之前写过几篇关于ngrok内网穿透的文章,ngrok也可以达到上面所说的功能, frp与ngrok也是各具特点。
frp 相对于ngrok的优点:
- 配置简单,配置说明完整
- 开箱即用,一套程序通用。不用像ngrok再生成key编译等。
- 有的功能,ngrok没有,比如p2p的模式。
- 文件比ngrok小,linux-amd64版本客户端和服务端都小个2-3M(frp大概7-8M)。
当然ngrok也有frp没有的功能,比如面版显示http内容(其实觉得这功能也没多大用)
示例 通过 ssh 访问公司内网机器
根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。
将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
- 修改 frps.ini 文件,这里使用了简化的配置:
1
2
3
4# frps.ini
[common]
bind_port = 7000
token = aPZ6bP7mTv98EeoCZu8G - 启动 frps:
1
./frps -c ./frps.ini
- 修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x;这里的server_port是frpc与frps通讯的端口,remote_port才是,你和服务所通讯的端口。在这里需要保证服务器上6000,7000端口对外是开放的。token是用于frpc与frps认证使用,两边要配置成一致。
1
2
3
4
5
6
7
8
9
10
11# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
token = aPZ6bP7mTv98EeoCZu8G
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 - 启动 frpc:
1
./frpc -c ./frpc.ini
- 通过 ssh 访问内网机器,假设用户名为 test:
1
ssh -oPort=6000 test@x.x.x.x
更多
- 通过自定义域名访问部署于内网的 web 服务
- 转发 DNS 查询请求
- 转发 Unix域套接字
- 对外提供简单的文件访问服务
- 点对点内网穿透
配置文件功能说明
Dashboard
通过浏览器查看 frp 的状态以及代理统计信息展示。
需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:
1 |
|
身份验证
所有 proxy 配置全部放在客户端(也就是之前版本的特权模式),服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。
需要注意的是 frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。
这个超时时间可以在配置文件中通过 authentication_timeout 这个参数来修改,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。
加密与压缩
这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:
1 |
|
客户端热加载配置文件
当修改了 frpc 中的代理配置,可以通过 frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。
启用此功能需要在 frpc 中启用 admin 端口,用于提供 API 服务。配置如下:
1 |
|
之后执行重启命令:
1 |
|
等待一段时间后客户端会根据新的配置文件创建、更新、删除代理。
客户端查看代理状态
frpc 支持通过 frpc status -c ./frpc.ini
命令查看代理的状态信息,此功能需要在 frpc 中配置 admin 端口。
其它注意事项
p2p模式如果不传输数据,隧道会失效,并没有重连。