frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透


用途

  • 利用处于防火墙后的机器,对外网环境提供 http 或 https 服务
  • 对于 http、https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个 80 端口
  • 利用处于防火墙后的机器,对外网环境提供 tcp/udp 服务,例如通过 ssh 访问处于公司局部环境的主机

    原理

  • frp 主要由 frpc(客户端)和 frps(服务端)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。
  • 内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。
  • 用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

在 frp 中一个代理对应一个需要暴露的内网服务,一个客户端支持同时配置多个代理。
frp 支持多种代理类型来适配不同的使用场景

类型 描述
tcp 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务
udp 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务
http 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权
https 针对 HTTPS 应用定制了一些额外的功能
stcp 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口
sudp 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口
xtcp 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转
tcpmux 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务

部署

FRPS

frps.ini

1
2
3
4
5
[common]
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
bind_udp_port = 7000

FRPC

frpc.ini

  • local_ip:本地需要暴露到公网的服务地址
  • local_port:本地需要暴露到公网的服务端口
  • remote_port:服务端的远程监听端口,转发客户端的 local_port 端口,如果填 0 则会随机分配一个端口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    token = xxxxx
    #log_file = /dev/null
    #log_level = info
    #log_max_days = 3
    vhost_http_port = 80
    vhost_https_port = 443

    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000

    [web_http]
    type = http
    local_ip = 192.168.2.1
    local_port = 80
    custom_domains = www.yuwei.cc

    [web_https]
    type = https
    local_port = 443
    custom_domains = www.yuwei.cc

    文档

    https://gofrp.org/docs/