跳到主要内容

如何自建FRP

· 阅读需 6 分钟
Quany
软件工程师

自建FRP能让你安全地将内网服务暴露到公网,非常适合远程访问、开发调试等场景。下面是一份清晰的搭建指南。

🎯 理解核心概念

FRP的工作方式依赖于两个核心组件:

  • 服务端 (frps):需要安装在一台拥有公网IP地址的服务器上(例如云服务商的云服务器)。它作为流量中转的“门户”或“交通枢纽”。
  • 客户端 (frpc):安装在你内网中需要被访问的设备上(如家里的NAS、办公电脑)。它负责与公网上的服务端建立连接,并将内网服务的流量转发出去。

简单来说,当外网用户想要访问你内网的服务时,请求先发送到公网服务器上的frps,然后frps通过已建立的连接将请求转发给内网设备上的frpc,最终送达目标服务。

🛠️ 搭建操作指南

第一步:配置FRP服务端 (frps)

  1. 下载与安装 通过SSH连接到你的公网服务器,使用 wgetcurl 命令从FRP的GitHub发布页下载最新版本的二进制包,然后解压。请根据你的服务器操作系统选择正确的版本。

    # 进入一个合适的目录,例如 /opt
    cd /opt
    # 下载(版本号请替换为最新版)
    sudo wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
    # 解压
    sudo tar -zxvf frp_0.61.1_linux_amd64.tar.gz
    # 进入解压后的目录
    cd frp_0.61.1_linux_amd64
  2. 编辑配置文件 关键的步骤是配置服务端,主要修改 frps.toml 文件。以下是一个基础配置示例:

    [common]
    # 服务端监听的端口,客户端将通过此端口连接
    bindPort = 7000
    # 如果您希望通过网页查看frp状态,可以启用仪表盘
    dashboard_addr = "0.0.0.0"
    dashboard_port = 7500
    dashboard_user = "admin" # 请设置一个安全的用户名
    dashboard_pwd = "your_secure_password" # 请设置一个强密码
    # 强烈建议设置token认证,提升安全性
    auth.method = "token"
    auth.token = "a_very_long_and_secure_secret_token"

    如果需要穿透HTTP/HTTPS服务,可能还需要配置 vhostHTTPPortvhostHTTPSPort 等参数。

  3. 启动服务与设置开机自启 为了管理方便,建议将frps配置为系统服务(如使用systemd)。

    • 创建一个service文件,例如 /etc/systemd/system/frps.service
    • 使用 sudo systemctl daemon-reload 重新加载配置。
    • 使用 sudo systemctl start frps 启动服务。
    • 使用 sudo systemctl enable frps 设置开机自启。
  4. 配置防火墙 务必在服务器的防火墙(如iptables、firewalld)以及云服务商的安全组规则中,放行frps服务配置中使用的端口(例如上面的7000和7500端口)。

第二步:配置FRP客户端 (frpc)

  1. 下载客户端软件 在内网设备上下载并解压与服务端相同版本的FRP软件包。

  2. 编辑配置文件 客户端的配置文件是 frpc.toml。你需要告诉它如何连接到服务端,以及映射哪些服务。

    [common]
    # 填写你公网服务器的IP地址或域名
    serverAddr = "your_server_public_ip"
    serverPort = 7000
    # 此处的token必须与服务端配置的token完全一致
    auth.method = "token"
    auth.token = "a_very_long_and_secure_secret_token"

    # 下面开始定义具体的代理规则
    # 示例1:映射内网的SSH服务(22端口)
    [[proxies]]
    name = "ssh-to-my-pc"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 22
    # 在公网服务器上使用这个端口来访问内网SSH
    remotePort = 6000

    # 示例2:映射内网的Web服务(例如在3000端口)
    [[proxies]]
    name = "web-app"
    type = "tcp" # 简单的TCP代理,对于HTTP服务也可使用"http"类型以获得更多功能
    localIP = "127.0.0.1"
    localPort = 3000
    remotePort = 6001
  3. 启动客户端 在内网设备上,进入FRP目录,执行启动命令:

    ./frpc -c ./frpc.toml

    同样,也可以将frpc配置为系统服务或后台进程,以确保稳定运行。

🔒 重要安全提醒

自建服务意味着你需要自己负责安全,以下几点至关重要:

  • 使用强令牌:配置文件中的 auth.token 是首要的安全屏障,务必使用长且复杂的随机字符串,并定期更换。
  • 最小化端口开放:在服务器防火墙和云服务商安全组中,只开放frp服务所必需的端口,关闭所有不必要的端口。
  • 关注日志:定期检查frps和frpc的日志输出,留意是否有异常连接尝试。
  • 考虑TLS加密:对于传输敏感数据的场景,FRP支持TLS加密通信,建议在配置中启用。

💎 进阶配置与故障排查

成功完成基础搭建后,你可能还需要了解一些进阶配置和问题处理方法。

  • 使用域名(虚拟主机):如果你拥有一个域名,可以配置FRP,让不同的子域名(如 panel.your-domain.com)指向内网中不同的Web服务,这比直接使用IP地址和端口号更优雅、易用。
  • 常见问题排查
    • 连接失败:首先确认服务端防火墙和安全组规则已正确放行所有相关端口(如 bindPort, dashboard_port, 以及客户端配置的 remotePort 等)。这是最常见的问题。
    • 检查配置:确保客户端配置中的 serverAddr(公网服务器IP)和 serverPort 准确无误。
    • 核对认证信息:再三确认客户端和服务端的 auth.token 完全一致。
    • 查看日志:通过服务端和客户端的日志输出(使用 sudo systemctl status frps 或直接运行程序查看输出),可以获取非常详细的错误信息,这是定位问题的关键。

希望这份指南能帮助你顺利搭建自己的FRP服务!如果你在具体操作中遇到更细致的问题,比如如何为特定服务(如Windows远程桌面)配置代理,我很乐意提供进一步的建议。

微信公众号

微信公众号