占位符说明:

  • <FRP服务端地址>:你的FRP服务端公网IP或域名
  • <内网IP>:需要被穿透的内网主机IP
  • <用户名>:登录系统的用户名
  • <认证Token>:自定义的安全认证字符串,客户端和服务端需一致
  • <自定义域名>:用于HTTP/HTTPS代理的自定义域名
  • <frp安装目录>:frp解压后的实际路径,本教程使用/opt/frp_0.63.0_linux_amd64/
  • <端口号>:本教程使用默认端口号,FRP服务端7000,Web管理界面7500,SSH访问6000

目录

  1. FRP 基础介绍
  2. 环境准备
  3. FRP 服务端配置
  4. FRP 客户端配置
  5. 测试连接
  6. 常见问题与解决方案

1. FRP 基础介绍

1.1 什么是 FRP?

FRP(Fast Reverse Proxy)是一款开源的反向代理应用,旨在帮助用户将位于内网或防火墙后的服务(如 Web 服务、SSH 等)暴露到公网。它支持多种协议,并提供高效的性能和丰富的功能,适用于个人用户和企业级应用。

1.2 FRP 的工作原理

FRP 采用客户端-服务端架构:

  • 服务端(frps:部署在拥有公网 IP 的服务器上,负责接收来自客户端的连接请求。
  • 客户端(frpc:部署在内网环境中,连接到服务端,并将内网服务(如 SSH)通过服务端进行转发。

这种方式避免了内网服务器直接暴露在公网,提高了安全性,同时简化了内网穿透的过程。

1.3 FRP 的优势

  • 高性能:采用高效的网络传输协议,支持多种代理类型。
  • 易于配置:配置文件简洁明了,适合新手快速上手。
  • 灵活性:支持多种场景,如 HTTP/HTTPS、TCP、UDP 等。
  • 安全性:支持多种认证方式,确保连接的安全。

2. 环境准备

2.1 系统要求

  • 操作系统:Ubuntu(适用于其他 Linux 发行版,步骤类似)
  • 账户信息:普通用户(例如 user),无需 root 权限
  • 网络信息
    • 内网 IP:<内网IP>(部署 frpc 的内网机器)
    • FRP 服务器地址:<FRP服务端地址>(拥有公网 IP 的服务器,用于部署 frps
  • 工具wget, tar, systemd(Ubuntu 默认已安装)

2.2 端口规划

在开始配置前,请规划好以下端口:

用途 端口号 说明
FRP服务端监听端口 7000 客户端连接服务端的端口
FRP Web管理界面 7500 可选,用于监控FRP状态
SSH远程访问端口 6000 通过FRP访问SSH的端口

注意:请确保这些端口在防火墙中已开放,且未被其他服务占用。


3. FRP 服务端配置

3.1 下载并安装 FRP

在拥有公网 IP 的服务器(<FRP服务端地址>)上执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
# 切换到 /opt 目录(需要管理员权限)
sudo cd /opt

# 下载 FRP 的压缩包(以 v0.63.0 为例)
sudo wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz

# 解压下载的压缩文件
sudo tar -xzvf frp_0.63.0_linux_amd64.tar.gz

# 进入解压后的 FRP 目录
cd frp_0.63.0_linux_amd64

3.2 配置服务端

创建并编辑服务端配置文件:

1
nano frps.toml

在编辑器中输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
# FRP 服务端配置文件
bindAddr = "0.0.0.0"
bindPort = 7000

auth.method = "token"
auth.token = "<认证Token>"

# Dashboard UI 配置,需要放在 webServer 子表中
[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "password"

配置说明

  • bindPort:FRP 服务端监听的主要端口
  • auth.token:认证令牌,确保安全性
  • [webServer]:Web 管理界面配置(可选)

3.3 启动服务端

方式一:直接启动(测试用)

1
./frps -c frps.toml

方式二:使用 systemd 服务(推荐)

创建 systemd 服务文件:

1
sudo nano /etc/systemd/system/frps.service

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=FRP Server Service
After=network.target

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

[Install]
WantedBy=multi-user.target

启动并启用服务:

1
2
3
4
5
6
7
8
9
10
11
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 FRP 服务
sudo systemctl start frps

# 检查服务状态
sudo systemctl status frps

# 设置开机自启
sudo systemctl enable frps

4. FRP 客户端配置

4.1 下载并安装 FRP

在内网机器(IP:<内网IP>)上执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
# 切换到 /opt 目录(需要管理员权限)
sudo cd /opt

# 下载 FRP 的压缩包(与服务端相同的版本)
sudo wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz

# 解压下载的压缩文件
sudo tar -xzvf frp_0.63.0_linux_amd64.tar.gz

# 进入解压后的 FRP 目录
cd frp_0.63.0_linux_amd64

4.2 配置客户端

创建并编辑客户端配置文件:

1
nano frpc.toml

在编辑器中输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# FRP 客户端配置文件

# 基本配置
serverAddr = "<FRP服务端地址>" # FRP 服务端地址
serverPort = 7000 # 服务端监听端口

# 认证配置
auth.method = "token" # 认证方法
auth.token = "<认证Token>" # 认证令牌,需与服务端匹配

# 代理配置
[[proxies]]
name = "ssh" # 代理名称,用于识别该代理
type = "tcp" # 代理类型,这里使用 TCP 代理
localIP = "127.0.0.1" # 本地服务 IP,通常为 127.0.0.1
localPort = 22 # 本地服务端口,SSH 默认使用 22 端口
remotePort = 6000 # 服务端对外暴露的端口,通过此端口可访问 SSH

4.3 启动客户端

方式一:用户级服务(推荐)

创建用户级 systemd 服务:

1
2
3
4
5
# 创建用户级 systemd 服务目录
mkdir -p ~/.config/systemd/user

# 创建并编辑 frpc.service 文件
nano ~/.config/systemd/user/frpc.service

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=FRP Client Service
After=network.target

[Service]
Type=simple
ExecStart=/opt/frp_0.63.0_linux_amd64/frpc -c /opt/frp_0.63.0_linux_amd64/frpc.toml
Restart=always
RestartSec=5

[Install]
WantedBy=default.target

启动并启用服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新加载用户级 systemd 配置
systemctl --user daemon-reload

# 启动 FRP 客户端服务
systemctl --user start frpc

# 检查服务状态
systemctl --user status frpc

# 设置开机自启
systemctl --user enable frpc

# 允许用户级服务在用户退出登录后继续运行
sudo loginctl enable-linger user

方式二:系统级服务

创建系统级 systemd 服务:

1
sudo nano /etc/systemd/system/frpc.service

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=FRP Client Service
After=network.target

[Service]
Type=simple
User=<用户名>
Group=<用户名>
ExecStart=/opt/frp_0.63.0_linux_amd64/frpc -c /opt/frp_0.63.0_linux_amd64/frpc.toml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

启动并启用服务:

1
2
3
4
5
6
7
8
9
10
11
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 FRP 客户端服务
sudo systemctl start frpc

# 检查服务状态
sudo systemctl status frpc

# 设置开机自启
sudo systemctl enable frpc

5. 测试连接

5.1 检查服务状态

检查服务端状态

1
2
3
4
5
6
7
8
9
# 检查 FRP 服务端状态
sudo systemctl status frps

# 检查防火墙状态(以 UFW 为例)
sudo ufw status

# 如果未开放端口,执行以下命令开放
sudo ufw allow 7000/tcp
sudo ufw allow 7500/tcp # 如果启用了 Web 状态面板

检查客户端状态

1
2
# 查看 FRP 客户端状态
systemctl --user status frpc

5.2 测试 SSH 连接

在远程主机上,使用 SSH 客户端通过 FRP 暴露的端口连接到内网机器:

1
ssh -p 6000 user@<FRP服务端地址>

参数说明

  • -p 6000:指定连接的端口,此处为 frpc 配置的 remotePort
  • user@<FRP服务端地址>
    • user:内网机器的用户名
    • <FRP服务端地址>:FRP 服务端的域名或 IP 地址

5.3 验证连接成功

如果连接成功,您应该能够正常登录到内网机器,并看到类似以下的提示:

1
2
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-88-generic x86_64)
user@hostname:~$

6. 常见问题与解决方案

6.1 连接失败

问题:无法通过 FRP 连接到 SSH 服务

解决方案

  1. 检查 FRP 服务端和客户端是否正常运行
  2. 确认防火墙设置,确保相关端口已开放
  3. 验证配置文件中的端口号和认证令牌是否正确
  4. 检查网络连接是否正常

6.2 服务启动失败

问题:FRP 服务无法启动

解决方案

  1. 检查可执行文件权限:sudo chmod +x /opt/frp_0.63.0_linux_amd64/frps
  2. 验证配置文件语法是否正确
  3. 查看服务日志:sudo journalctl -u frps -f
  4. 确认路径配置是否正确

6.3 连接不稳定

问题:SSH 连接经常断开

解决方案

  1. 在 SSH 客户端配置中添加保活设置
  2. 检查网络稳定性
  3. 考虑使用 KCP 协议提高连接稳定性
  4. 调整 FRP 的重连参数

6.4 安全建议

  1. 使用强密码:为 SSH 用户设置强密码
  2. 密钥认证:使用 SSH 密钥替代密码认证
  3. 限制访问:在 FRP 配置中限制允许的 IP 地址
  4. 定期更新:保持 FRP 版本更新
  5. 监控日志:定期检查 FRP 和 SSH 日志

总结

通过以上步骤,您已经成功配置了 FRP 来实现 Ubuntu 服务器的远程 SSH 访问。FRP 提供了一个安全、高效的内网穿透解决方案,让您能够轻松访问位于内网或防火墙后的服务器。

关键要点

  • 确保服务端和客户端的认证令牌一致
  • 正确配置防火墙规则
  • 使用 systemd 服务确保自动启动
  • 定期检查服务状态和日志

如果您在使用过程中遇到任何问题,请参考常见问题与解决方案部分,或查看 FRP 官方文档获取更多帮助。