局域网服务器如何实现外网访问:Ubuntu 22.04 搭建 FRP 内网穿透服务器
工业现场、企业局域网和工厂 MES 系统中,服务器没有公网 IP 时如何实现外网远程访问?本文以 Ubuntu 22.04 为例,完整演示 FRP 内网穿透方案:frps 服务端配置、frpc 客户端配置、Systemd 开机自启、多工厂统一接入、HTTPS 安全架构以及完整的故障排查与安全建议。
在工业现场、企业局域网和工厂 MES 系统中,经常会遇到一个实际问题:服务器部署在局域网内部,没有公网 IP,外部人员却需要远程访问 ERP、MES、Web 管理平台或者设备服务。
传统方式通常需要在企业路由器上配置端口映射,但是很多生产网络存在以下限制:
- 运营商没有提供公网 IP
- 企业网络存在多级 NAT
- 工厂网络不允许直接开放入站端口
- MES 服务器不能直接暴露到互联网
- 现场网络由第三方管理,无法修改路由器
- 不同工厂需要统一远程运维
这时候可以采用 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 特别适合:
- 工厂 MES
- ERPNext
- 工业网关
- PLC 数据采集服务器
- 视觉检测服务器
- AGV 调度服务器
- 远程维护服务器
- Raspberry Pi 工业网关
- 没有公网 IP 的企业服务器
二、首先确认 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 │
└───────────────┘
这种架构中:
- HTTPS 负责公网访问安全
- FRP 负责内网穿透
- Nginx 负责域名、HTTPS、反向代理
- 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,形成完整的工业互联网远程接入架构。
