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 放到处于内网环境的机器上。

  1. 修改 frps.ini 文件,这里使用了简化的配置:

    1
    2
    3
    4
    # frps.ini
    [common]
    bind_port = 7000
    token = aPZ6bP7mTv98EeoCZu8G
  2. 启动 frps:

    1
    ./frps -c ./frps.ini
  3. 修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x;

    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

    这里的server_port是frpc与frps通讯的端口,remote_port才是,你和服务所通讯的端口。在这里需要保证服务器上6000,7000端口对外是开放的。token是用于frpc与frps认证使用,两边要配置成一致。

  4. 启动 frpc:

    1
    ./frpc -c ./frpc.ini
  5. 通过 ssh 访问内网机器,假设用户名为 test:

    1
    ssh -oPort=6000 test@x.x.x.x

更多

  • 通过自定义域名访问部署于内网的 web 服务
  • 转发 DNS 查询请求
  • 转发 Unix域套接字
  • 对外提供简单的文件访问服务
  • 点对点内网穿透

配置文件功能说明

Dashboard

通过浏览器查看 frp 的状态以及代理统计信息展示。

需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:

1
2
3
4
5
[common]
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin

身份验证

所有 proxy 配置全部放在客户端(也就是之前版本的特权模式),服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。

需要注意的是 frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用。

这个超时时间可以在配置文件中通过 authentication_timeout 这个参数来修改,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。

加密与压缩

这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:

1
2
3
4
5
6
7
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

客户端热加载配置文件

当修改了 frpc 中的代理配置,可以通过 frpc reload 命令来动态加载配置文件,通常会在 10 秒内完成代理的更新。

启用此功能需要在 frpc 中启用 admin 端口,用于提供 API 服务。配置如下:

1
2
3
4
# frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400

之后执行重启命令:

1
frpc reload -c ./frpc.ini

等待一段时间后客户端会根据新的配置文件创建、更新、删除代理。

客户端查看代理状态

frpc 支持通过 frpc status -c ./frpc.ini 命令查看代理的状态信息,此功能需要在 frpc 中配置 admin 端口。

其它注意事项

p2p模式如果不传输数据,隧道会失效,并没有重连。