前言
Frp(Fast Reverse Proxy)是一款高性能的内网穿透工具,支持 TCP、UDP、HTTP 等协议,可轻松实现内网服务(如 SSH、数据库、Web 应用)通过公网服务器暴露给外部访问。本文详细介绍 Linux 系统下 Frp 服务端(公网服务器)和客户端(内网服务器)的搭建步骤,包含核心配置、开机自启、服务管理及安全优化,适用于生产环境和个人开发场景。
一、环境准备
1. 服务器要求
| 角色 | 环境要求 | 核心作用 |
|---|---|---|
| 服务端 | 有公网 IP 的 Linux 服务器(Ubuntu/Debian/CentOS 均可) | 接收外部请求并转发到内网客户端 |
| 客户端 | 内网 Linux 服务器(需访问公网) | 转发内网服务到公网服务端 |
2. 依赖说明
Frp 为编译好的二进制文件,无需额外安装依赖,仅需确保服务器已安装 wget(用于下载安装包)和 tar(用于解压):
# 若未安装 wget 和 tar,执行以下命令安装(Ubuntu/Debian)
sudo apt-get install wget tar -y
# CentOS/RHEL 系统
sudo yum install wget tar -y
二、下载并解压 Frp 安装包
服务端和客户端需下载相同版本的 Frp 安装包(本文使用稳定版 v0.38.0,支持 Linux amd64 架构):
1. 下载 Frp 安装包
# 下载 frp 安装包(服务端和客户端均执行此命令)
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
2. 解压安装包
# 解压 tar.gz 包(自动生成同名文件夹)
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
# 进入解压后的目录
cd frp_0.38.0_linux_amd64
3. 目录结构说明
解压后关键文件说明(多余文件可删除,如 Windows 相关的 .exe 文件):
| 文件 | 作用 | 角色 |
|---|---|---|
| frps | Frp 服务端二进制程序 | 服务端 |
| frps.ini | Frp 服务端配置文件 | 服务端 |
| frpc | Frp 客户端二进制程序 | 客户端 |
| frpc.ini | Frp 客户端配置文件 | 客户端 |
三、服务端配置(公网服务器)
服务端核心作用是监听客户端连接,转发外部请求到对应内网服务,配置重点关注 端口监听 和 安全认证。
1. 编辑服务端配置文件 frps.ini
# 进入 Frp 目录(若已在目录中可跳过)
cd frp_0.38.0_linux_amd64
# 编辑配置文件
vim frps.ini
2. 核心配置内容(直接复制替换)
[common]
# 服务端监听端口(客户端连接此端口,需开放防火墙)
bind_port = 7000
# 认证方式:token 认证(推荐,防止非法客户端连接)
authentication_method = token
# 启用新连接认证(增强安全性)
authenticate_new_work_conns = true
# 认证 token(服务端和客户端必须一致,建议使用随机强字符串)
token = 1dMrcEWw2WjPLamD
# 可选配置(按需添加)
# 服务端管理后台端口(可通过浏览器查看连接状态)
dashboard_port = 7500
# 管理后台用户名密码
dashboard_user = admin
dashboard_pwd = admin123
# 日志配置(便于排查问题)
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
3. 配置项说明(关键参数必看)
| 配置项 | 作用与注意事项 |
|---|---|
| bind_port | 客户端与服务端通信的端口,必须开放防火墙(阿里云 / 腾讯云需配置安全组) |
| token | 服务端与客户端的认证密钥,建议用 openssl rand -hex 16 生成随机强字符串 |
| dashboard_port | 管理后台端口,开放后可通过 http://公网IP:7500 查看连接状态(可选) |
| log_file | 日志存储路径,需确保目录有写入权限(如 /var/log/ 需 root 权限) |
四、客户端配置(内网服务器)
客户端核心作用是将内网服务(如 SSH、MySQL、Redis)转发到公网服务端,配置需与服务端保持一致的认证信息,并指定需要暴露的内网服务。
1. 编辑客户端配置文件 frpc.ini
# 进入 Frp 目录(若已在目录中可跳过)
cd frp_0.38.0_linux_amd64
# 编辑配置文件
vim frpc.ini
2. 核心配置内容(直接复制替换)
[common]
# 公网服务端 IP(必填,服务端的公网 IP 或域名)
server_addr = 110.110.110.104
# 服务端监听端口(与服务端 bind_port 一致)
server_port = 7000
# 认证方式(与服务端一致)
authentication_method = token
# 启用新连接认证(与服务端一致)
authenticate_new_work_conns = true
# 认证 token(与服务端完全一致)
token = 1dMrcEWw2WjPLamD
# 可选配置(按需添加)
log_file = /var/log/frpc.log
log_level = info
log_max_days = 3
# ===================== 暴露内网服务配置 =====================
# 1. SSH 服务(端口 22,外部通过 6000 端口访问)
[ssh]
type = tcp # 协议类型(TCP/UDP/HTTP 等)
local_ip = 127.0.0.1 # 内网服务 IP(本地服务填 127.0.0.1)
local_port = 22 # 内网服务端口(SSH 默认 22)
remote_port = 6000 # 公网暴露端口(外部通过 公网IP:6000 访问 SSH)
# 2. MongoDB 服务(端口 27017)
[mongodb]
type = tcp
local_ip = 127.0.0.1
local_port = 27017
remote_port = 27017 # 公网暴露端口(需确保服务端未占用该端口)
# 3. Redis 服务(端口 6379)
[redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 6379
# 4. MySQL 服务(端口 3306)
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 3306
3. 配置项说明(灵活扩展)
| 配置项 | 作用与注意事项 |
|---|---|
| server_addr | 必须填写服务端公网 IP 或已解析的域名,确保客户端能 ping 通该 IP |
| remote_port | 公网暴露的端口,需确保服务端未被其他程序占用,且已开放防火墙(如 6000、27017 等) |
| 服务名称(如 [ssh]) | 自定义名称,需唯一,便于区分不同服务 |
| local_ip | 若内网服务在其他机器,填写对应机器的内网 IP(如 192.168.1.100) |
4. 扩展配置(示例:暴露 Web 服务)
若需暴露内网 Web 服务(如 Nginx 部署的网站,端口 80),添加以下配置:
[web-demo]
type = http # 协议类型为 HTTP
local_ip = 127.0.0.1
local_port = 80
custom_domains = web.learn.cn # 绑定域名(需将域名解析到服务端公网 IP)
五、迁移 Frp 目录并配置开机自启
为便于管理,将 Frp 目录迁移到 /opt/frp,并配置系统服务实现开机自启(服务端和客户端配置类似,仅服务名和执行文件不同)。
1. 迁移 Frp 目录(服务端和客户端均执行)
# 迁移解压后的目录到 /opt/frp
sudo mv frp_0.38.0_linux_amd64 /opt/frp
2. 配置开机自启(服务端:frps)
步骤 1:创建系统服务文件
sudo vim /lib/systemd/system/frps.service
步骤 2:服务文件内容
[Unit]
Description=Frp Server Service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
# 执行命令(指定配置文件路径)
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini
# 服务异常退出时自动重启
Restart=on-failure
RestartSec=5
# 以 root 权限运行(确保日志目录写入权限)
User=root
[Install]
WantedBy=multi-user.target
步骤 3:启用并启动服务
# 重新加载系统服务
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable frps
# 启动服务
sudo systemctl start frps
# 查看服务状态(确认是否启动成功)
sudo systemctl status frps
- 若输出 active (running) 表示服务端启动成功
3. 配置开机自启(客户端:frpc)
步骤 1:创建系统服务文件
sudo vim /lib/systemd/system/frpc.service
步骤 2:服务文件内容
[Unit]
Description=Frp Client Service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
# 执行命令(客户端执行 frpc,指定配置文件)
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.ini
Restart=on-failure
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
步骤 3:启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc
- 若输出 active (running) 表示客户端启动成功
六、Frp 服务管理常用命令
| 功能 | 服务端命令 | 客户端命令 |
|---|---|---|
| 启动服务 | sudo systemctl start frps | sudo systemctl start frpc |
| 停止服务 | sudo systemctl stop frps | sudo systemctl stop frpc |
| 重启服务(修改配置后) | sudo systemctl restart frps | sudo systemctl restart frpc |
| 查看服务状态 | sudo systemctl status frps | sudo systemctl status frpc |
| 启用开机自启 | sudo systemctl enable frps | sudo systemctl enable frpc |
| 禁用开机自启 | sudo systemctl disable frps | sudo systemctl disable frpc |
| 查看日志(实时) | journalctl -u frps -f | journalctl -u frpc -f |
七、功能验证(确保内网穿透生效)
以 SSH 服务为例,验证内网穿透是否成功:
1. 外部机器测试 SSH 连接
在任意能访问公网的机器上,执行以下命令(替换为你的服务端公网 IP):
# 格式:ssh 内网用户名@服务端公网IP -p 公网暴露端口(remote_port)
ssh root@110.110.110.104 -p 6000
- 若能成功输入内网服务器密码并登录,说明 SSH 穿透生效
2. 验证数据库服务(以 MySQL 为例)
使用 MySQL 客户端连接公网暴露端口:
mysql -u 内网MySQL用户名 -p -h 110.110.110.104 -P 3306
- 输入密码后若能登录,说明 MySQL 穿透生效
3. 管理后台验证(若启用 dashboard)
浏览器访问 http://服务端公网IP:7500,输入配置的用户名(admin)和密码(admin123),即可查看客户端连接状态、暴露的服务列表等信息。
八、安全优化建议(生产环境必备)
- 强化 token 安全性:
-
- 不要使用示例中的 token,建议用 openssl rand -hex 16 生成随机强字符串(如 a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6)
-
- 定期更换 token,更换后需同步更新服务端和客户端配置并重启服务
- 限制端口开放:
-
- 服务端仅开放必要端口(如 bind_port=7000、dashboard_port=7500 及客户端配置的 remote_port)
-
- 阿里云 / 腾讯云安全组配置时,限制访问来源 IP(如仅允许公司 IP 访问数据库端口)
- 禁用不必要的服务:
-
- 若无需管理后台,注释 dashboard_port、dashboard_user、dashboard_pwd 配置
-
- 客户端仅暴露需要的内网服务,删除多余的配置项
- 日志监控:
-
- 定期查看 Frp 日志(/var/log/frps.log、/var/log/frpc.log),排查异常连接
-
- 可结合 ELK 等日志分析工具实现日志集中管理
- 升级 Frp 版本:
-
- 定期查看 Frp GitHub Releases,及时升级到稳定版,修复已知漏洞
九、常见问题排查
问题 1:客户端启动失败,提示 dial tcp 110.110.110.104:7000: connect: connection refused
- 排查:服务端未启动、服务端 bind_port=7000 未开放防火墙,或公网 IP 填写错误
- 解决:
-
- 检查服务端状态:sudo systemctl status frps
-
- 开放服务端 7000 端口:sudo ufw allow 7000/tcp(Ubuntu)
-
- 验证服务端 IP 可达:ping 110.110.110.104(客户端执行)
问题 2:客户端启动成功,但外部无法访问内网服务
- 排查:服务端 remote_port 未开放防火墙,或内网服务未启动
- 解决:
-
- 开放服务端对应 remote_port(如 SSH 的 6000 端口:sudo ufw allow 6000/tcp)
-
- 验证内网服务是否正常:telnet 127.0.0.1 22(客户端执行,测试 SSH 服务)
问题 3:认证失败,提示 authentication failed
- 排查:服务端和客户端 token 不一致,或 authentication_method 配置不同
- 解决:确保服务端和客户端的 token、authentication_method、authenticate_new_work_conns 配置完全一致
问题 4:日志提示 port is already in use
- 排查:服务端 remote_port