ZeroOne AI
← 返回文章列表

局域网服务器如何实现外网访问:Ubuntu 22.04 搭建 FRP 内网穿透服务器

👁 1
分类:工业互联网

工业现场、企业局域网和工厂 MES 系统中,服务器没有公网 IP 时如何实现外网远程访问?本文以 Ubuntu 22.04 为例,完整演示 FRP 内网穿透方案:frps 服务端配置、frpc 客户端配置、Systemd 开机自启、多工厂统一接入、HTTPS 安全架构以及完整的故障排查与安全建议。

在工业现场、企业局域网和工厂 MES 系统中,经常会遇到一个实际问题:服务器部署在局域网内部,没有公网 IP,外部人员却需要远程访问 ERP、MES、Web 管理平台或者设备服务。

传统方式通常需要在企业路由器上配置端口映射,但是很多生产网络存在以下限制:

这时候可以采用 FRP(Fast Reverse Proxy)建立一条由内网主动发起的反向连接。

整体思路是:

 Internet
 │
 │
 ┌──────▼──────┐
 │ 公网云服务器 │
 │ Ubuntu 22.04│
 │ FRPS        │
 └──────┬──────┘
        │
   FRP 长连接
        │
 ┌────────▼────────┐
 │ 企业局域网       │
 │                  │
 │ ┌───────────┐    │
 │ │ MES服务器  │    │
 │ │ 192.168.x │    │
 │ └─────▲─────┘    │
 │       │          │
 │     FRPC         │
 └───────┼──────────┘
         │
      工厂设备

公网服务器运行 frps,局域网服务器运行 frpc。局域网服务器主动连接公网服务器,因此不需要公网服务器主动进入企业内网。

一、FRP 是什么?

FRP 是一个开源的反向代理和内网穿透工具。

它最核心的工作模式是:

内网服务器
 │
 │ 主动连接
 ▼
公网 FRPS
 │
 │ 接收外部请求
 ▼
互联网用户

传统端口映射是:

Internet
 │
 ▼
企业路由器
 │
 ▼
局域网服务器

而 FRP 是:

局域网服务器
 │
 │ 主动建立连接
 ▼
公网 FRPS
 ▲
 │
Internet 用户

因此,FRP 特别适合:

二、首先确认 Ubuntu 服务器架构

在安装 FRP 之前,首先确认服务器平台。

执行:

uname -m

如果返回:

x86_64

说明服务器是:

Linux x86_64
FRP:linux_amd64

如果返回:

aarch64

说明服务器是:

Linux ARM64
FRP:linux_arm64

还可以执行:

lsb_release -a

确认 Ubuntu 版本。

例如:

Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy

查看更加完整的 CPU 信息:

lscpu

对于普通云服务器,最常见的是:

Architecture: x86_64

这种情况下下载 linux_amd64 版本即可。

三、FRP 网络架构

假设现在有一台公网服务器:

公网服务器
IP:123.123.123.123
系统:Ubuntu 22.04

工厂内部有一台 MES 服务器:

MES服务器
IP:192.168.10.100

MES Web 服务:

192.168.10.100:8000

希望最终实现:

Internet
 │
 │ http://123.123.123.123:8000
 ▼
公网服务器
 │
 │ FRP
 ▼
192.168.10.100:8000

也就是说:

公网IP:8000
 ↓
内网MES:8000

四、安装 FRP 服务端

FRP 官方项目可以从 GitHub 获取:FRP 官方项目

进入公网 Ubuntu 服务器:

ssh root@123.123.123.123

创建安装目录:

mkdir -p /opt/frp
cd /opt/frp

下载对应架构的 FRP。

例如服务器是 x86_64,下载:

wget https://github.com/fatedier/frp/releases/latest/download/frp_linux_amd64.tar.gz

然后解压:

tar -zxvf frp_linux_amd64.tar.gz

实际安装时,应根据当前 FRP 官方 Release 的文件命名选择对应版本。

查看:

ls

找到:

frps
frpc

服务端只需要 frps,客户端使用 frpc。

五、配置 FRPS 服务端

创建配置文件:

vim /opt/frp/frps.toml

例如:

bindPort = 7000
auth.method = "token"
auth.token = "CHANGE_THIS_TO_A_LONG_RANDOM_TOKEN"
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7

这里 7000 是 FRP 服务端与客户端建立连接使用的端口。

而 auth.token 用于客户端身份认证。

生产环境不要使用 123456 这种简单密码。

建议使用随机字符串,例如:

7d8c9a2f3e1b4c6d8e9f...

六、开放云服务器防火墙端口

如果使用云服务器,还需要在云厂商安全组开放:

TCP 7000

例如:

协议:TCP
端口:7000
来源:客户端所在网络

如果使用 FRP TCP 映射 8000,还需要开放对应的公网端口:

TCP 8000

Ubuntu 本机如果启用了 UFW:

ufw status

可以开放:

ufw allow 7000/tcp
ufw allow 8000/tcp

查看:

ufw status

七、启动 FRPS

先手动测试:

cd /opt/frp
./frps -c frps.toml

如果正常,会看到类似:

frps started successfully

此时可以查看:

ss -lntp | grep 7000

应该看到:

LISTEN 0 4096 0.0.0.0:7000

说明 FRPS 已经监听 0.0.0.0:7000。

八、设置 FRPS 开机自动启动

生产环境不能每次服务器重启以后手动运行。

创建:

vim /etc/systemd/system/frps.service

内容:

[Unit]
Description=FRP Server
After=network.target

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

[Install]
WantedBy=multi-user.target

然后:

systemctl daemon-reload

设置开机启动:

systemctl enable frps

启动:

systemctl start frps

查看:

systemctl status frps

实时查看日志:

journalctl -u frps -f

九、配置局域网 FRPC

接下来进入工厂内部的 MES 服务器。

例如:

Ubuntu
192.168.10.100

同样安装 FRP,但是这里运行的是 frpc。

创建:

mkdir -p /opt/frp
cd /opt/frp

创建配置文件:

vim frpc.toml

配置:

serverAddr = "123.123.123.123"
serverPort = 7000
auth.method = "token"
auth.token = "CHANGE_THIS_TO_A_LONG_RANDOM_TOKEN"

[[proxies]]
name = "mes-web"
type = "tcp"
localIP = "192.168.10.100"
localPort = 8000
remotePort = 8000

这里最重要的是:

serverAddr = "123.123.123.123"

表示公网 FRPS 地址。

serverPort = 7000

表示连接 FRPS 的端口。

而:

localIP = "192.168.10.100"
localPort = 8000

表示实际 MES 服务。

最后:

remotePort = 8000

表示公网服务器暴露的端口。

十、启动 FRPC

在 MES 服务器执行:

cd /opt/frp
./frpc -c frpc.toml

如果连接成功,FRPC 会与 123.123.123.123:7000 建立连接。

此时网络关系变成:

MES服务器
192.168.10.100:8000
 │
 │ FRPC主动连接
 ▼
123.123.123.123:7000
 │
 │
 ▼
123.123.123.123:8000

十一、测试外网访问

现在从外部网络访问:

http://123.123.123.123:8000

FRPS 收到请求以后:

公网:8000
 ↓
FRPS
 ↓
FRPC
 ↓
192.168.10.100:8000

最终访问到 MES。

十二、FRPC 设置开机启动

同样使用 Systemd。

创建:

vim /etc/systemd/system/frpc.service

内容:

[Unit]
Description=FRP Client
After=network.target

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

[Install]
WantedBy=multi-user.target

执行:

systemctl daemon-reload
systemctl enable frpc
systemctl start frpc

查看:

systemctl status frpc

查看日志:

journalctl -u frpc -f

这样工厂 MES 服务器重启以后,FRPC 会自动恢复连接。

十三、一个 FRPS 可以连接多个工厂

FRP 真正适合工业场景的地方,是一个公网服务器可以同时连接多个工厂。

例如:

 公网FRPS
 123.123.123.123
 │
 ┌──────────────┼──────────────┐
 │              │              │
 FRPC          FRPC          FRPC
 │              │              │
 工厂A          工厂B          工厂C
 │              │              │
 MES-A服务器   MES-B服务器   MES-C服务器

例如:

工厂A → remotePort 8001
工厂B → remotePort 8002
工厂C → remotePort 8003

配置:

[[proxies]]
name = "factory-a"
type = "tcp"
localIP = "192.168.10.100"
localPort = 8000
remotePort = 8001

工厂 B:

[[proxies]]
name = "factory-b"
type = "tcp"
localIP = "192.168.20.100"
localPort = 8000
remotePort = 8002

工厂 C:

[[proxies]]
name = "factory-c"
type = "tcp"
localIP = "192.168.30.100"
localPort = 8000
remotePort = 8003

于是:

公网:8001 → 工厂A MES
公网:8002 → 工厂B MES
公网:8003 → 工厂C MES

这就形成了一个简单的工业互联网远程接入平台。

十四、不要把所有工业设备直接暴露到公网

FRP 虽然方便,但不能简单理解成"把工厂所有设备端口都映射到公网"。

尤其不要直接暴露:

PLC
Modbus TCP
OPC DA
OPC UA
工业机器人
摄像头
交换机
数据库
Windows RDP

更合理的架构是:

Internet
 │
 ▼
公网FRPS
 │
 ▼
工业网关 / MES服务器
 │
 ├── ERPNext
 ├── MES
 ├── MQTT
 ├── OPC
 ├── PLC
 ├── AGV
 └── Vision

也就是说,公网只进入工业网关/MES,工业设备继续留在生产网络内部。这样安全性明显更高。

十五、进一步使用域名访问

如果已经拥有 mes.example.com,可以采用:

Internet
 │
 ▼
mes.example.com
 │
 ▼
Nginx
 │
 ▼
FRPS
 │
 ▼
FRPC
 │
 ▼
MES

最终用户直接访问:

https://mes.example.com

而不是:

http://123.123.123.123:8000

这对于 ERPNext、MES、工业管理平台更加适合。

十六、FRP + HTTPS 推荐架构

生产环境建议:

 Internet
 │
 │ HTTPS
 ▼
 ┌───────────────┐
 │ 公网服务器    │
 │ Ubuntu 22.04  │
 │               │
 │ Nginx         │
 │               │
 │ FRPS          │
 └───────┬───────┘
         │
    FRP连接
         │
 ┌───────▼───────┐
 │ 工厂局域网    │
 │               │
 │ FRPC          │
 │               │
 │ MES           │
 └───────────────┘

这种架构中:

四者职责清晰。

十七、结合 ERPNext + MES 的实际架构

如果工厂使用 ERPNext 16 构建 MES,可以进一步形成:

 云服务器
 │
 ┌────────┴────────┐
 │                 │
 Nginx           FRPS
 │                 │
 └────────┬────────┘
          │
       Internet
          │
    FRP 长连接
          │
 ┌────────▼────────┐
 │ 工厂工业网关    │
 │ FRPC            │
 └────────┬────────┘
          │
      Factory LAN
          │
 ┌──────────────┼──────────────┐
 │              │              │
 ERPNext      MES           MQTT
 │              │              │
 ERP        生产数据       设备数据
 │
 ┌────────────┼────────────┐
 │            │            │
 PLC         OPC        Vision
 │            │            │
 设备       注塑机      相机/AI

进一步还可以让每个工厂的工业网关主动向云端注册:

工厂网关
 │
 │ Register
 ▼
云端 Registry
 │
 ├── Factory-A
 ├── Factory-B
 ├── Factory-C
 └── Factory-D

云端根据 factory_id、device_id、frpc 状态、IP、端口、在线状态管理不同工厂。

这比单纯使用 FRP 做端口映射更适合做成工业互联网平台。

十八、故障排查

如果 FRPC 无法连接 FRPS,按照下面顺序检查。

1. 检查公网服务器

ss -lntp | grep 7000

确认 7000 正在监听。

2. 检查云服务器安全组

确认 TCP 7000 已经开放。

3. 检查 Ubuntu 防火墙

ufw status

必要时:

ufw allow 7000/tcp

4. 检查客户端网络

在工厂 MES 服务器:

ping 123.123.123.123

然后:

nc -vz 123.123.123.123 7000

如果返回 succeeded,说明 FRPS 端口可以访问。

5. 检查 FRP 日志

服务端:

journalctl -u frps -f

客户端:

journalctl -u frpc -f

重点观察 authentication failed、connection refused、proxy already exists、port already used 等错误。

十九、生产环境安全建议

FRP 部署完成以后,不建议直接认为系统已经安全。

至少应该做好以下措施:

1. 使用强 Token

auth.method = "token"
auth.token = "随机长字符串"

2. 不要暴露不必要的端口

只开放真正需要的:

7000
443

业务端口尽量通过 Nginx 统一入口。

3. 尽量使用 HTTPS

例如:

https://mes.example.com

而不是:

http://公网IP:8000

4. 工业设备不要直接公网映射

尤其是:

PLC
Modbus
OPC
摄像头
数据库
RDP

5. 定期升级 FRP

关注官方 Release:FRP Releases,及时升级到稳定版本。

二十、总结

解决"局域网服务器被外网访问"的核心,并不是让局域网服务器获得公网 IP,而是建立一条反向连接:

局域网服务器
 │
 │ 主动连接
 ▼
公网 FRPS
 ▲
 │
 │ 外部访问
 │
Internet

最基础的部署结构就是:

公网服务器
Ubuntu 22.04
 │
 FRPS
 │
 │ TCP 7000
 │
 ▼
企业局域网
 │
 FRPC
 │
 ▼
MES / ERPNext

对于工业现场而言,更推荐进一步发展为:

 云端
 │
 ┌────────┴────────┐
 │                 │
 FRPS           Registry
 │                 │
 └────────┬────────┘
          │
    FRP 长连接
          │
 ┌────────┴────────┐
 │                  │
 工厂A           工厂B
 FRPC            FRPC
 │                  │
 MES-A           MES-B
 │                  │
 PLC/OPC        PLC/OPC

最终可以实现多工厂统一接入、远程运维、MES 访问、设备状态监控和工业数据上云。

FRP 本身解决的是"网络穿透"问题,而在实际工业系统中,可以进一步结合 Nginx + HTTPS + 工业网关 + MQTT + Registry + ERPNext/MES,形成完整的工业互联网远程接入架构。

评论(0