IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    frp 概念及通用功能

    Teacher Du发表于 2024-11-01 03:51:26
    love 0

    很多小伙伴询问 frp 原理,文本简单解释一下。在 frp 中一个代理对应一个需要暴露的内网服务。一个客户端可同时配置多个代理。一些概念,理解它们有助于小伙伴们更好地了解和使用 frp。

    原理

    frp 是由客户端和服务端组成,服务端通常部署在有公网 IP 的机器上,客户端通常部署在需穿透的内网服务所在的机器上。

    内网服务器由于没有公网 IP,不能被非局域网内其他用户访问。

    用户通过访问服务端 frps,由 frp 负责根据请求端口或其它信息将请求路由到对应的内网机器,从而实现通信。

    通过内网穿透技术,可使内网设备即便没有公网 IP 及端口,也可被公网的用户访问。

    类型

    frp 支持多种代理类型来适配不同使用场景:

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

    TCP

    1
    2
    3
    4
    5
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000

    注意:frp 会为本地服务 22 端口,在 frps 所在服务端监听 6000 端口,将 6000 端口接收到的连接和本地服务 22 端口关联,透传流量,从而实现让用户在外部访问内部服务。

    UDP

    1
    2
    3
    4
    5
    [dns]
    type = udp
    local_ip = 127.0.0.1
    local_port = 53
    remote_port = 6000

    注意:frp 会为本地服务 53 端口,在 frps 所在服务端监听 6000 端口,将 6000 端口接收到的连接和本地服务 53 端口关联,透传流量,从而实现让用户在外部访问内部服务。

    XTCP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [stcp-visitor]
    role = visitor
    type = stcp
    server_name = stcp-test
    sk = abc
    bind_port = -1

    [xtcp-visitor]
    role = visitor
    type = xtcp
    server_name = xtcp-test
    sk = abc
    bind_addr = 127.0.0.1
    bind_port = 9002
    fallback_to = stcp-visitor
    fallback_timeout_ms = 200

    注意:当连接 127.0.0.1:9002 时超过 200ms 打洞还未成功的话,会回退到用 stcp-visitor 建立连接。fallback 后,之前触发的打洞操作仍然会继续,一般来说打洞完成需要耗时会比较长。

    TCPMUX

    frp 支持将单个端口收到的连接路由到不同代理。目前支持复用器只有 httpconnect。当 frps.ini 的 common 中设置 tcpmux_httpconnect_port,frps 将会监听在这个端口,接收 HTTP 的请求。frps 会根据 HTTP 请求中的 Host 路由到不同的后端代理。frps.ini 的配置如下:

    1
    2
    3
    [common]
    bind_port = 7000
    tcpmux_httpconnect_port = 1337

    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

    [proxy1]
    type = tcpmux
    multiplexer = httpconnect
    custom_domains = test1
    local_port = 80

    [proxy2]
    type = tcpmux
    multiplexer = httpconnect
    custom_domains = test2
    local_port = 8080


沪ICP备19023445号-2号
友情链接