xiufeigo™
Home
碎碎念 or 备忘录
Frp 内网穿透记录

一、frp 是什么

frp 是一款高性能的反向代理应用,专注于内网穿透。

它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp 可以安全地、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。

二、为什么选择 frp

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,并享受以下专业特性:

  • 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。

  • TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。

  • 代理组间的负载均衡。

  • 端口复用:多个服务可以通过同一个服务端端口暴露。

  • P2P 通信:流量不必经过服务器中转,充分利用带宽资源。

  • 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。

  • 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。

  • 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。

三、工作原理

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。

由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

四、支持的代理类型

每种代理类型适用于不同的使用情境,可以根据需求选择合适的代理类型来配置 frp

  • TCP:提供纯粹的 TCP 端口映射,使服务端能够根据不同的端口将请求路由到不同的内网服务。

  • UDP:提供纯粹的 UDP 端口映射,与 TCP 代理类似,但用于 UDP 流量。

  • HTTP:专为 HTTP 应用设计,支持修改 Host Header 和增加鉴权等额外功能。

  • HTTPS:类似于 HTTP 代理,但专门用于处理 HTTPS 流量。

  • STCP:提供安全的 TCP 内网代理,要求在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

  • SUDP:提供安全的 UDP 内网代理,与 STCP 类似,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。

  • XTCP:点对点内网穿透代理,与 STCP 类似,但流量不需要经过服务器中转。

  • TCPMUX:支持服务端 TCP 端口的多路复用,允许通过同一端口访问不同的内网服务。

五、如何安装 frp

1)frps

首先,需要前往 frp 项目地址下载对应操作系统及架构的包

安装过程分以下两种:

1.1) Linux 操作系统

  1. 编写 frps.toml

    # frp监听的端口,默认是 7000,建议修改为其他端口防止被定向爆破
    bind_port = 7000
    # 授权码,建议更换为复杂密码
    token = xxx
    # 注:这个token之后在客户端会用到

    # frp管理后台端口,默认是 7500,建议修改为其他端口防止被定向爆破
    dashboard_port = 7500
    # frp管理后台用户名和密码,请修改为复杂用户名与复杂密码
    dashboard_user = admin
    dashboard_pwd = admin
    enable_prometheus = true

    # tcpmux 类型且复用器为 httpconnect 的代理监听的端口,用于端口复用
    tcpmuxHTTPConnectPort = 5002

    # frp日志配置
    log_file = /var/log/frps.log
    log_level = info
    log_max_days = 3

    # 服务端和客户端心跳连接的超时时间,默认为 90
    heartbeatTimeout = 60
    # 用户建立连接后等待客户端响应的超时时间,默认为 10
    user_conn_timeout = 60
    # HTTP 类型代理在服务端的 ResponseHeader 超时时间,默认为 60s
    vhostHTTPTimeout = 60
  2. 编写 systemd 的 service 文件

    # 承接上文,个人将 frp 放置在 /opt/frp 中,下文均以该路径作为 frp 的 path 目录
    vi /etc/systemd/system/frps.service

    [Unit]
    # 服务名称,可自定义
    Description = frp server
    After = network.target syslog.target
    Wants = network.target

    [Service]
    Type = simple
    # 启动 frps 的命令,需修改为您的 frps 的安装路径
    ExecStart = /opt/frp/frps -c /opt/frp/frps.toml

    [Install]
    WantedBy = multi-user.target
  3. 使用 systemd 管理 frps 服务

    # 启动 frp
    sudo systemctl start frps

    # 停止 frp
    sudo systemctl stop frps

    # 重启 frp
    sudo systemctl restart frps

    # 查看 frp 状态
    sudo systemctl status frps

    # 开机自启 frp
    sudo systemctl enable frps

    # 禁用开机自启 frp
    sudo systemctl disable frps

1.2) Windows 操作系统

  1. 编写 frps.toml
    具体参考 Linux,编写方式一致

  2. 使用 nssm 自定义 windows service

    # 先去 nssm 项目地址下载最新 nssm 压缩包(虽然人家已经几百年没更新了
    http://www.nssm.cc/download

    # 将 nssm 加入 Windows Path
    # 如果不会修改 path 的话,就直接把对应架构的 exe 执行文件丢到下面目录里就行
    %USERPROFILE%\AppData\Local\Microsoft\WindowsApps
    # 比如 64 位的系统就直接把 win64\nssm.exe 丢进上面的目录即可

    # 打开 cmd,执行命令安装 frp 服务
    nssm install frp

    # 在 Path 栏填上 frps 文件所在位置,比如
    C:\frp\frps.exe
    # 在 Startup diectory 栏填入 frps 文件所在目录,比如
    C:\frp\
    # 在 Arguments 栏填入执行 frpc 的参数
    -c frps.toml
  3. 使用 nssm 管理 frps 服务

    # 启动 frp 服务
    nssm start frp

    # 停止 frp 服务
    nssm stop frp

    # 重启 frp 服务
    nssm restart frp

    # 查看 frp 状态
    nssm status frp

    # 开机自启 frp 服务
    [win + r 快捷键打开运行],在出现的界面输入 [services] 后回车
    # 找到 frp 服务,右键它,点击属性,将启动类型选择为 [自动] 即可

    # 禁用开机自启
    # 同上述开机自启步骤,将最后的启动类型修改为 [禁用] 即可

四、安装 frpc

如果采用 tcp 协议连接 frpc 的话,只需要在被控端配置即可。如果使用的是 xtcp 协议连接的话,则两端都需要配置。

1) tcp 协议的 frpc 客户端配置

  1. 编写 frpc.toml

    # frps 端的公网 ip
    serverAddr = "x.x.x.x"
    # frps 端的 serverPort
    serverPort = 7000
    # frps 端的 token
    token = "xxx"

    [[proxies]]
    name = "ssh"
    type = "tcp"
    localIP = "127.0.0.1"
    # 被映射的本地端口
    localPort = 22
    # frps 端的入口,流量由该入口转发至 localPort
    remotePort = 10022
  2. 启动 frpc 服务

    # 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
    # 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径
    /opt/frp/frpc -c /opt/frp/frpc.toml
  3. 外网访问 frpc 所在机器

    # 假设用户名为 test,frps 端地址为 x.x.x.x
    ssh test@x.x.x.x -p 10022
    # frp 将请求发送到 x.x.x.x:10022 的流量转发到内网机器的 22

2) xtcp 协议的 frpc 客户端配置

2.1) 被控端配置

  1. 编写 frpc.toml

    # frps 端的公网 ip
    serverAddr = "x.x.x.x"
    # frps 端的 serverPort
    serverPort = 7000
    # frps 端的 token
    token = "xxx"

    [[proxies]]
    name = "ssh"
    type = "xtcp"
    localIP = "127.0.0.1"
    # 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端
    secretKey = "xxxx"
    # 被映射的本地端口
    localPort = 22
  2. 启动 frpc 服务

    # 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
    # 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径
    /opt/frp/frpc -c /opt/frp/frpc.toml

2.2) 控制端配置

  1. 编写 frpc.toml

    # frps 端的公网 ip
    serverAddr = "x.x.x.x"
    # frps 端的 serverPort
    serverPort = 7000
    # frps 端的 token
    token = "xxx"

    [[proxies]]
    name = "visitor_ssh"
    type = "xtcp"
    # 要访问的 proxy 名称
    serverName = "ssh"
    bindAddr = "127.0.0.1"
    # 密钥,服务端和访问端的密钥需要一致,访问端才能访问到服务端
    secretKey = "xxxx"
    # 被映射的本地端口
    bindPort = 10022
  2. 启动 frpc 服务

    # 这里可以参考 frps 端设置,将 frpc 也注册为一个 systemd 服务
    # 也可以临时启动该服务,请将 /opt/frp/ 替换为你的真是 frp 路径

2.3) 控制端连接至被控端

# 假设用户名为 test
ssh test@127.0.0.1 -p 10022

参考文档:

粤ICP备2022009857号-1