Frp

概述

FRP(Fast Reverse Proxy)是一款高性能的内网穿透工具,支持 TCP、UDP、HTTP、HTTPS 等多种协议,可将内网服务暴露至公网。

典型应用场景

  • 访问内网服务器的 SSH、RDP 等远程管理服务
  • 将内网 Web 服务(如 Jenkins、GitLab)对外发布
  • 穿透 NAT 或防火墙限制,实现外网访问

下载安装

1. 下载 FRP

访问官方下载页面:https://github.com/fatedier/frp/releases

根据系统架构选择对应安装包,以 Linux amd64 为例:

wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz

2. 解压并进入目录

tar -xf frp_0.65.0_linux_amd64.tar.gz
cd frp_0.65.0_linux_amd64

3. 目录结构说明

解压后仅需保留以下核心文件(其余可删除):

文件名 作用 适用端
frps 服务端主程序 服务端
frps.toml 服务端配置文件(v0.50+ 新版格式) 服务端
frpc 客户端主程序 内网设备
frpc.toml 客户端配置文件(v0.50+ 新版格式) 内网设备

兼容性说明:v0.50 以下版本使用 .ini 格式配置文件,新版本推荐使用 .toml 格式,功能更丰富。


服务端部署

1. 配置 frps.toml

在服务端创建配置文件 frps.toml

# 绑定监听地址(0.0.0.0 表示监听所有网卡)
bindAddr = "0.0.0.0"
bindPort = 20001

# Dashboard Web 控制台配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "your_password"

# 认证配置(防止未授权客户端连接)
auth.method = "token"
auth.token = "aabbcc112233"

# 端口范围限制(仅允许分配此范围内的端口)
allowPorts = [
  { start = 20000, end = 20010 }
]

2. 启动服务端

临时启动(测试用)

./frps -c ./frps.toml

后台启动(生产环境)

创建 Systemd 服务文件:

cat > /etc/systemd/system/frps.service << 'EOF'
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /data/frp_0.65.0_linux_amd64/frps -c /data/frp_0.65.0_linux_amd64/frps.toml
Restart = always
RestartSec = 5

[Install]
WantedBy = multi-user.target
EOF

启动并设置开机自启:

systemctl daemon-reload
systemctl start frps
systemctl enable frps
systemctl status frps

3. 防火墙放行

# 放行服务端口
firewall-cmd --add-port=20001/tcp --permanent
firewall-cmd --add-port=7500/tcp --permanent
firewall-cmd --reload

客户端部署

1. 配置 frpc.toml

在客户端(内网设备)创建配置文件 frpc.toml

# 服务端信息(替换为实际公网 IP)
serverAddr = "your_server_public_ip"
serverPort = 20001

# 连接协议
transport.protocol = "tcp"

# 认证信息(需与服务端一致)
auth.method = "token"
auth.token = "aabbcc112233"

# 代理配置
[[proxies]]
name = "ssh_tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 20002

[[proxies]]
name = "web_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5001
remotePort = 20003

2. 启动客户端

临时启动(测试用)

./frpc -c ./frpc.toml

后台启动(生产环境)

创建 Systemd 服务文件:

cat > /etc/systemd/system/frpc.service << 'EOF'
[Unit]
Description = frp client
After = network.target network-online.target
Wants = network-online.target

[Service]
Type = simple
User = root
Restart = always
RestartSec = 5
ExecStart = /data/frp_0.65.0_linux_amd64/frpc -c /data/frp_0.65.0_linux_amd64/frpc.toml
ExecReload = /bin/kill -HUP $MAINPID
KillMode = process
LimitNOFILE = 1048576

[Install]
WantedBy = multi-user.target
EOF

启动并设置开机自启:

systemctl daemon-reload
systemctl start frpc
systemctl enable frpc
systemctl status frpc

验证连接

方法一:通过 Web 控制台

在浏览器中访问 http://<服务端IP>:7500,输入配置的用户名和密码,查看客户端连接状态和代理列表。

方法二:通过命令测试

# 在服务端查看连接状态
./frps -c ./frps.toml

# 在客户端测试代理是否生效
curl http://127.0.0.1:20002   # 测试 SSH 代理
ssh -p 20002 root@<服务端IP>  # 通过代理 SSH 连接

常用管理命令

操作 服务端命令 客户端命令
启动 systemctl start frps systemctl start frpc
停止 systemctl stop frps systemctl stop frpc
重启 systemctl restart frps systemctl restart frpc
查看状态 systemctl status frps systemctl status frpc
查看日志 journalctl -u frps -f journalctl -u frpc -f
开机自启 systemctl enable frps systemctl enable frpc

高级配置示例

HTTP 域名转发

[[proxies]]
name = "web_domain"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["example.com", "www.example.com"]

HTTPS 转发(需配置 TLS)

[[proxies]]
name = "web_https"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["example.com"]

UDP 转发

[[proxies]]
name = "dns_forward"
type = "udp"
localIP = "127.0.0.1"
localPort = 53
remotePort = 20004

负载均衡(多节点)

[[proxies]]
name = "web_load_balance"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 20005
loadBalancer.group = "web-group"
loadBalancer.mode = "round-robin"

常见问题

Q:客户端连接失败,提示"connection refused"?

  1. 检查服务端 bindPort 是否被防火墙拦截
  2. 确认客户端 serverAddrserverPort 与服务端一致
  3. 检查云服务商安全组是否放行对应端口

Q:认证失败,提示"auth token mismatch"?

确认客户端 auth.token 与服务端 auth.token 完全一致(区分大小写)。

Q:端口转发正常,但无法访问目标服务?

  1. 确认目标服务(如 SSH、Nginx)在客户端本地正常运行
  2. 检查 localIP 是否正确(通常为 127.0.0.10.0.0.0
  3. 确认 remotePort 在服务端 allowPorts 范围内

Q:如何查看实时日志排查问题?

# 服务端
journalctl -u frps -f

# 客户端
journalctl -u frpc -f

Q:服务端如何限制客户端 IP?

frps.toml 中添加白名单:

# 允许的客户端 IP
allowClientIPs = ["192.168.1.0/24", "10.0.0.0/8"]

参考链接