Skip to content

frp

Abstract

frp 是一个快速反向代理工具,可以把位于 NAT 或防火墙后的本地服务暴露到公网。它支持 TCP、UDP、HTTP 和 HTTPS 协议,也可以通过域名把公网请求转发到内网服务。

frp

常见的部署方式

公网服务器运行 frps,内网机器运行 frpc,外部用户访问公网服务器端口或域名后,请求会被转发到对应的内网服务。frp 也提供 P2P 连接模式,适合在网络条件允许时让客户端之间尽量直接通信。


网络规划

角色 组件 说明
公网服务器 frps 有公网 IP,负责接收外部连接
内网主机 frpc 连接 frps,把本地服务映射出去

示例目标:把内网主机 127.0.0.1:22 映射到公网服务器 6000 端口。


下载

在服务端和客户端都下载同一版本的 frp:

版本选择

版本号可以按需替换为 GitHub Releases 中的新版,但服务端和客户端建议保持一致。

wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -zxvf frp_0.61.0_linux_amd64.tar.gz
cd frp_0.61.0_linux_amd64

服务端配置

  1. 准备目录

    sudo mkdir -p /etc/frp /opt/frp
    sudo cp frps /opt/frp/
    sudo cp frps.toml /etc/frp/
    
  2. 编辑 /etc/frp/frps.toml

    bindPort = 7000
    auth.token = "<strong-token>"
    
  3. 创建 systemd 服务 /etc/systemd/system/frps.service

    [Unit]
    Description=frp server
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/opt/frp/frps -c /etc/frp/frps.toml
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
    
  4. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now frps
    sudo systemctl status frps
    

防火墙

公网服务器需要放行控制端口和被映射端口。

sudo ufw allow 7000/tcp
sudo ufw allow 6000/tcp

客户端配置

  1. 准备目录

    sudo mkdir -p /etc/frp /opt/frp
    sudo cp frpc /opt/frp/
    sudo cp frpc.toml /etc/frp/
    
  2. 编辑 /etc/frp/frpc.toml

    serverAddr = "<server-public-ip>"
    serverPort = 7000
    auth.token = "<strong-token>"
    
    [[proxies]]
    name = "ssh"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 22
    remotePort = 6000
    
  3. 创建 systemd 服务 /etc/systemd/system/frpc.service

    [Unit]
    Description=frp client
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/opt/frp/frpc -c /etc/frp/frpc.toml
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
    
  4. 启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable --now frpc
    sudo systemctl status frpc
    

访问内网 SSH

从外部机器连接:

ssh -p 6000 <user>@<server-public-ip>

映射 Web 服务

如果内网 Web 服务监听 127.0.0.1:8080,可以增加一个代理:

[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080

然后访问:

curl http://<server-public-ip>:8080

常用维护命令

sudo systemctl status frps
sudo systemctl restart frps
sudo journalctl -u frps -f

sudo systemctl status frpc
sudo systemctl restart frpc
sudo journalctl -u frpc -f

排查

  • frpc 连接不上:检查 serverAddrserverPort、公网安全组、auth.token
  • 外部访问失败:检查 remotePort 是否放行,内网服务是否正常监听。
  • 端口冲突:更换 remotePort,并同步更新防火墙和访问命令。