使用 frp 搭建内网穿透服务器
Haiya Lv3

1. 下载 frp

Github Releases

根据对应架构选择文件,Linux 可以通过 uname -a 命令查看。下载的文件以实际版本为准。例如在本文中:

  • 服务器是 x86_64 架构:下载 frp_0.58.1_linux_amd64.tar.gz
  • 客户端是 aarch64 架构:下载 frp_0.58.1_linux_arm64.tar.gz

2. 启动服务端

1
2
3
4
5
6
7
8
9
10
# 解压文件
tar xzvf frp_0.58.1_linux_amd64.tar.gz
# 进入目录
cd frp_0.58.1_linux_amd64
# 查看配置,默认情况下 frp 运行在 7000 端口上
cat frps.toml
# bindPort = 7000

# 启动 frp 服务端
./frps -c frps.toml

输出内容如下:

1
2
3
2024-06-21 17:31:49.861 [I] [frps/root.go:105] frps uses config file: frps.toml
2024-06-21 17:31:49.935 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2024-06-21 17:31:49.935 [I] [frps/root.go:114] frps started successfully

** 如果使用的是云服务器,还需要在安全组开放 frp 服务端口 **

至此,frp 服务端启动完成。

3. 启动本地服务(可选)

此步骤启动了一个用于测试的本地服务,如果你的本地服务已经启动,可以跳过。

首先启动要映射到公网的服务,此处使用 Python 启动了一个简单的 Web 服务,运行在内网服务器的 12345 端口:

1
python3 -m http.server 12345

4. 启动客户端

1
2
3
4
5
6
# 解压文件(此处是 arm64 的客户端,解压的文件需要替换成你实际下载的文件)
tar xzvf frp_0.58.1_linux_arm64.tar.gz
# 进入目录
cd frp_0.58.1_linux_arm64
# 修改配置
vi frpc.toml

文件内容如下:

1
2
3
4
5
6
7
8
9
serverAddr = "123.123.123.123"
serverPort = 7000

[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 19999
remotePort = 6000

文件内容说明:

  • serverAddr:服务器地址,即第 2 步中启动了 frp 服务端的服务器地址
  • serverPort:服务器端口,即第 2 步中启动了 frp 服务端的服务器端口
  • name:客户端代理名称,可以自定义
  • type:代理类型,此处为 tcp
  • localIP:本地服务地址
  • localPort:本地服务端口,即第 3 步中启动的本地服务的端口
  • remotePort:映射到公网的端口,此处为 6000,映射完成后可以通过 123.123.123.123:6000 访问到本地服务

** 如果使用的是云服务器,还需要在安全组开放 frp 客户端端口 **

更多配置可以参考:配置文件

配置文件修改完成后,使用如下命令启动客户端

1
2
# 启动 frp 客户端
./frpc -c frpc.toml

输出内容如下:

1
2
3
4
5
2024-06-21 17:45:36.127 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2024-06-21 17:45:36.128 [I] [client/service.go:294] try to connect to server...
2024-06-21 17:45:36.252 [I] [client/service.go:286] [23400a3005b9864b] login to server success, get run id [23400a3005b9864b]
2024-06-21 17:45:36.252 [I] [proxy/proxy_manager.go:173] [23400a3005b9864b] proxy added: [test-tcp]
2024-06-21 17:45:36.301 [I] [client/control.go:168] [23400a3005b9864b] [test-tcp] start proxy success

5. 测试

通过 123.123.123.123:6000 可以访问到本地服务

6. 身份认证

为了确保安全,强烈建议为 frp 配置身份认证。目前 frp 支持 Token 和 OIDC 两种认证方式,本文使用 Token 方式配置:

6.1. 修改服务端配置

1
2
3
vi frps.toml
# 新增一行
auth.token = "your_token"

6.2. 修改客户端配置

1
2
3
vi frpc.toml
# 新增一行
auth.token = "your_token"

6.3. 重新启动服务

1
2
3
4
# 服务端
./frps -c frps.toml
# 客户端
./frpc -c frpc.toml

如果客户端配置的 Token 不正确,则启动失败报错:

1
2
3
4
5
6
2024-06-21 17:52:19.453 [I] [sub/root.go:142] start frpc service for config file [frpc.toml]
2024-06-21 17:52:19.454 [I] [client/service.go:294] try to connect to server...
2024-06-21 17:52:19.577 [E] [client/service.go:279] token in login doesn't match token from configuration
2024-06-21 17:52:19.578 [W] [client/service.go:297] connect to server error: token in login doesn't match token from configuration
2024-06-21 17:52:19.578 [I] [sub/root.go:160] frpc service for config file [frpc.toml] stopped
login to the server failed: token in login doesn't match token from configuration. With loginFailExit enabled, no additional retries will be attempted

此时服务端也会输出日志:

1
2
2024-06-21 17:52:19.539 [I] [server/service.go:576] [ba3229df1d1f803f] client login info: ip [116.116.116.116:53964] version [0.58.1] hostname [] os [linux] arch [arm64]
2024-06-21 17:52:19.539 [W] [server/service.go:446] register control error: token in login doesn't match token from configuration

至此,frp 身份认证配置完成

7. 使用 systemd 管理 frp 服务

每次手动启动,或者使用 nohup 等方式启动 frp 比较麻烦,可以使用 systemd 管理 frp 服务。

服务端

1
vi /etc/systemd/system/frps.service

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target

保存后,可以使用 systemd 命令管理 frps 服务

1
2
3
4
5
6
7
8
9
10
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 开机自动启动
sudo systemctl enable frps

客户端

1
vi /etc/systemd/system/frpc.service

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
# 服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frpc -c /path/to/frpc.toml

[Install]
WantedBy = multi-user.target

保存后,可以使用 systemd 命令管理 frpc 服务

1
2
3
4
5
6
7
8
9
10
# 启动frp
sudo systemctl start frpc
# 停止frp
sudo systemctl stop frpc
# 重启frp
sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc
# 开机自动启动
sudo systemctl enable frpc

References

由 Hexo 驱动 & 主题 Keep