搭建frp内网穿透服务

225 阅读9分钟

前言

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 文件):

文件作用角色
frpsFrp 服务端二进制程序服务端
frps.iniFrp 服务端配置文件服务端
frpcFrp 客户端二进制程序客户端
frpc.iniFrp 客户端配置文件客户端

三、服务端配置(公网服务器)

服务端核心作用是监听客户端连接,转发外部请求到对应内网服务,配置重点关注 端口监听安全认证

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 frpssudo systemctl start frpc
停止服务sudo systemctl stop frpssudo systemctl stop frpc
重启服务(修改配置后)sudo systemctl restart frpssudo systemctl restart frpc
查看服务状态sudo systemctl status frpssudo systemctl status frpc
启用开机自启sudo systemctl enable frpssudo systemctl enable frpc
禁用开机自启sudo systemctl disable frpssudo systemctl disable frpc
查看日志(实时)journalctl -u frps -fjournalctl -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),即可查看客户端连接状态、暴露的服务列表等信息。


八、安全优化建议(生产环境必备)

  1. 强化 token 安全性
    • 不要使用示例中的 token,建议用 openssl rand -hex 16 生成随机强字符串(如 a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6)
    • 定期更换 token,更换后需同步更新服务端和客户端配置并重启服务
  1. 限制端口开放
    • 服务端仅开放必要端口(如 bind_port=7000、dashboard_port=7500 及客户端配置的 remote_port)
    • 阿里云 / 腾讯云安全组配置时,限制访问来源 IP(如仅允许公司 IP 访问数据库端口)
  1. 禁用不必要的服务
    • 若无需管理后台,注释 dashboard_port、dashboard_user、dashboard_pwd 配置
    • 客户端仅暴露需要的内网服务,删除多余的配置项
  1. 日志监控
    • 定期查看 Frp 日志(/var/log/frps.log、/var/log/frpc.log),排查异常连接
    • 可结合 ELK 等日志分析工具实现日志集中管理
  1. 升级 Frp 版本
    • 定期查看 Frp GitHub Releases,及时升级到稳定版,修复已知漏洞

九、常见问题排查

问题 1:客户端启动失败,提示 dial tcp 110.110.110.104:7000: connect: connection refused

  • 排查:服务端未启动、服务端 bind_port=7000 未开放防火墙,或公网 IP 填写错误
  • 解决:
    1. 检查服务端状态:sudo systemctl status frps
    1. 开放服务端 7000 端口:sudo ufw allow 7000/tcp(Ubuntu)
    1. 验证服务端 IP 可达:ping 110.110.110.104(客户端执行)

问题 2:客户端启动成功,但外部无法访问内网服务

  • 排查:服务端 remote_port 未开放防火墙,或内网服务未启动
  • 解决:
    1. 开放服务端对应 remote_port(如 SSH 的 6000 端口:sudo ufw allow 6000/tcp)
    1. 验证内网服务是否正常: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