FRP实战:为ARM工控机搭建稳定,安全的4G远程SSH运维通道

前言

  • 本文目标: 为处于任何网络环境下的ARM工控机,搭建一套稳定、安全、可扩展的远程SSH运维通道.解决设备位于4G网络、NAT内网等无法直接访问的痛点,实现对多台设备的统一、便捷管理.

云服务器端(frps)部署 - 搭建我们的“中继总机”

云服务器是整个远程体系的中枢,它的配置关乎所有设备能否正常接入.

准备工作:下载并解压FRP

首先,我们通过SSH登录云服务器.我的服务器是标准的x86_64架构,因此选择linux_amd64版本.

1
2
3
4
5
6
7
8
9
# 前往FRP的GitHub Release页面获取最新版本链接
# https://github.com/fatedier/frp/releases

# 下载并解压(请注意替换为最新版本号)
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz
tar -zxvf frp_0.59.0_linux_amd64.tar.gz

# 进入目录方便后续操作
cd frp_0.59.0_linux_amd64

核心配置:编写 frps.ini

我们需要编辑服务端配置文件 frps.ini,为我们的“总机”设定规则.

1
nano frps.ini

我采用了极简且安全的配置,清空文件后写入以下内容:

1
2
3
4
5
6
7
[common]
# frps服务监听的端口,用于接收客户端的连接
bind_port = 7000

# 认证令牌(token),客户端必须提供相同的token才能连接
# 这是我们安全体系的第一道防线,务必设置为一个高强度的随机字符串!
token = aL8kR2jP9bX7yZcE_a_very_long_and_random_string

安全加固:配置防火墙

遵循“最小权限”原则,我们只向公网暴露绝对必要的端口.

  • 7000/tcp: FRP服务端监听端口,供所有客户端连接.
  • 6001/tcp: 我规划的第一个设备的远程SSH映射端口.
1
2
3
4
# 以ufw防火墙为例
sudo ufw allow 7000/tcp
sudo ufw allow 6001/tcp
sudo ufw reload

稳定运行:配置Systemd守护服务

为了让frps能在后台稳定运行并实现开机自启,我们为它创建一个Systemd服务.这是生产环境的标配.

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

写入以下服务配置(注意:ExecStart中的路径必须是您服务器上的绝对路径):

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

[Service]
Type=simple
User=root
ExecStart=/path/to/your/frp_folder/frps -c /path/to/your/frp_folder/frps.ini
Restart=on-failure

[Install]
WantedBy=multi-user.target

最后,启动并设置开机自启:

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps # 检查状态,确保显示 active (running)

工控机端(frpc)部署 - 让设备主动报到

现在轮到我们的主角——ARM工控机.我们需要在其上部署frpc客户端.

准备工作:下载并解压FRP(ARM版)

我的工控机是aarch64架构,因此必须下载linux_arm64版本,这一点至关重要.

1
2
3
4
# 登录工控机后执行
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_arm64.tar.gz
tar -zxvf frp_0.59.0_linux_arm64.tar.gz
cd frp_0.59.0_linux_arm64

核心配置:编写 frpc.ini

同样,我们编辑客户端配置文件 frpc.ini,告诉它如何找到“总机”.

1
nano frpc.ini

清空并写入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[common]
# 云服务器的公网IP
server_addr = 123.45.67.89
# 云服务器的监听端口
server_port = 7000
# 认证令牌,必须与服务端frps.ini中的token完全一致
token = aL8kR2jP9bX7yZcE_a_very_long_and_random_string

# 启用TLS加密,保障客户端到服务端的通信安全
tls_enable = true

# 为这台设备的SSH隧道命名
[ssh_A]
type = tcp
local_ip = 127.0.0.1
# 本地SSH服务的端口号
local_port = 22
# 映射到云服务器的远程端口号
remote_port = 6001

稳定运行:配置Systemd守护服务

与服务端一样,我们也为客户端配置守护服务,确保其断线重连和开机自启.

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

写入配置(同样,注意ExecStart中的路径必须是工控机上的绝对路径):

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

[Service]
Type=simple
User=root
ExecStart=/path/to/your/frp_folder/frpc -c /path/to/your/frp_folder/frpc.ini
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc # 检查状态

验证成果:实现首次远程穿透

所有铺垫工作完成,激动人心的时刻到了.现在,我可以在我的本地电脑上,打开终端,执行一条简单的命令:

1
2
# ssh <工控机用户名>@<云服务器IP> -p <远程端口>
ssh root@123.45.67.89 -p 6001

输入工控机的密码后,我成功登录了!这标志着我们的远程运维通道已经完全打通.

横向扩展:管理多台设备

这套架构的美妙之处在于其强大的扩展性.当我需要接入第二台、第三台设备时,操作非常简单.

  • 服务端:只需在防火墙上为新设备开放一个新的远程端口即可(如6002).
  • 客户端:在新设备上部署frpc,修改其frpc.ini文件中的隧道名称和**remote_port**,确保它们是唯一的.

例如,为“工控机B”的配置:

1
2
3
4
5
6
7
# ... [common]部分不变 ...

[ssh_B] # 独一无二的隧道名
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6002 # 独一无二的远程端口

这样,我便可以通过访问服务器的6002端口来单独管理工控机B.

批量部署:镜像灌装的最佳实践

对于批量生产,我采用了镜像灌装的方式.但需要注意,直接复制镜像会导致所有设备的frpc.ini配置冲突.我的最佳实践流程是:

  1. 制作一个包含FRP程序和frpc.service的“模板镜像”.
  2. 将镜像灌装到新设备.
  3. 在新设备首次开机后,必须执行一个初始化脚本或手动修改frpc.ini文件,为其分配一个唯一的隧道名和remote_port.
  4. 最后重启frpc服务 (systemctl restart frpc),使新配置生效.