跳到主要内容

frp 开始

2026-07 新版配置与运行

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

本文将以暴露内网 Web 服务为例,实践 frp 的安装部署。更多应用场景,可见 frp 示例

安装

frp 主要由 客户端(frpc)服务端(frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

可以在 Github 的 Release 页面中下载到最新版本的客户端和服务端二进制文件。

本文公网、内网机器都是 Linux x86_64,所以选择了 frp_0.70.0_linux_amd64.tar.gz。都下载并解压:

$ tar xzvf frp_0.70.0_linux_amd64.tar.gz
frp_0.70.0_linux_amd64/
frp_0.70.0_linux_amd64/frps.toml
frp_0.70.0_linux_amd64/frpc
frp_0.70.0_linux_amd64/frps
frp_0.70.0_linux_amd64/LICENSE
frp_0.70.0_linux_amd64/frpc.toml

$ sudo ln -s `pwd`/frp_0.70.0_linux_amd64 /usr/local/frp

公网

frps 配置

frps.toml 设置监听端口:

# frps.toml (服务端)
bindPort = 7000 # 与客户端通信的控制端口
vhostHTTPPort = 8080 # HTTP 流量统一入口

# 建议设置认证,增强安全性
auth.method = "token"
auth.token = "gocoding@3721" # 请替换为强密码,客户端需一致

# 多端口映射(不绑域名,多端口暴露)
allowPorts = [
{ start = 8000, end = 8010 }
]

frps 运行

方式一: systemd 部署

systemd 部署,后台运行:

# 添加配置
sudo -i
cat <<-EOF > /etc/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
EOF
exit

sudo systemctl daemon-reload # 重载配置
sudo systemctl enable frps.service # 开机启动
sudo systemctl start frps.service # 启动服务
sudo systemctl status frps.service # 查看状态

方式二: supervisor 部署

supervisor 部署,后台运行:

# 安装 supervisor
sudo apt install supervisor -y

# 添加配置
sudo -i
cat <<-EOF > /etc/supervisor/conf.d/frps.conf
[program:frps]
directory=/usr/local/frp
command=/usr/local/frp/frps -c /usr/local/frp/frps.toml
priority=999
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/frps_out.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/frps_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
environment=
nocleanup=false
EOF
exit

sudo supervisorctl reread # 重读配置
sudo supervisorctl update # 更新服务
sudo supervisorctl status all # 查看服务

内网

frpc 配置

场景一: 绑定域名(HTTP 代理)

frpc.toml 设置服务,绑定域名:

# frpc.toml (客户端)
serverAddr = "x.x.x.x"
serverPort = 7000

# 与服务端保持一致
auth.method = "token"
auth.token = "gocoding@3721"

# 映射本地 8000 端口 -> app.domain.cn
[[proxies]]
name = "app"
type = "http"
localIP = "127.0.0.1"
localPort = 8000
customDomains = ["app.domain.cn"]

# 映射本地 8001 端口 -> api.domain.cn
[[proxies]]
name = "api"
type = "http"
localIP = "127.0.0.1"
localPort = 8001
customDomains = ["api.domain.cn"]

serverAddr = "x.x.x.x" 改成公网服务器实际的 IP。

domain.cn 改成用绑的域名,并把 app api 设为 A 记录解析到 IP x.x.x.x

如果服务器已绑有域名,也可以将 CNAME 记录解析到服务器的域名。或者可以通过修改 HTTP 请求的 Host 字段来实现同样的效果。

运行后,即可访问:

场景二: 不绑域名(TCP 代理)

frpc.toml 设置服务,不绑域名:

# frpc.toml (客户端)
serverAddr = "x.x.x.x"
serverPort = 7000

# 与服务端保持一致
auth.method = "token"
auth.token = "gocoding@3721"

# 映射本地 8000 端口 -> 服务端 8000 端口
[[proxies]]
name = "app"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8000
remotePort = 8000

# 映射本地 8001 端口 -> 服务端 8001 端口
[[proxies]]
name = "api"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8001
remotePort = 8001

运行后,即可访问:

frpc 运行

临时运行服务,访问测试:

# 运行 HTTP 服务
python3 -m http.server 8000 # 终端1
python3 -m http.server 8001 # 终端2

# 运行 frpc 服务
cd /usr/local/frp
./frpc -c ./frpc.toml

# 访问测试(根据当前 frpc.toml 选择对应命令)
curl http://app.domain.cn:8080 # 场景一配置时
curl http://x.x.x.x:8000 # 场景二配置时

systemd 部署,后台运行:

# 添加配置
sudo -i
cat <<-EOF > /etc/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
EOF
exit

sudo systemctl daemon-reload # 重载配置
sudo systemctl enable frpc.service # 开机启动
sudo systemctl start frpc.service # 启动服务
sudo systemctl status frpc.service # 查看状态