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

局域网服务器如何实现外网访问:Ubuntu 22.04 搭建 FRP 内网穿透服务器 文章来源说明本文由 ZeroOne AI 整理发布官网与 CSDN 双端同步首发原文见 www.zeroone-ai.com。在工业现场、企业局域网和工厂 MES 系统中经常会遇到一个实际问题服务器部署在局域网内部没有公网 IP外部人员却需要远程访问 ERP、MES、Web 管理平台或者设备服务。传统方式通常需要在企业路由器上配置端口映射但是很多生产网络存在以下限制运营商没有提供公网 IP企业网络存在多级 NAT工厂网络不允许直接开放入站端口MES 服务器不能直接暴露到互联网现场网络由第三方管理无法修改路由器不同工厂需要统一远程运维这时候可以采用 FRPFast Reverse Proxy建立一条由内网主动发起的反向连接。整体思路是Internet │ │ ┌──────▼──────┐ │ 公网云服务器 │ │ Ubuntu 22.04│ │ FRPS │ └──────┬──────┘ │ FRP 长连接 │ ┌────────▼────────┐ │ 企业局域网 │ │ │ │ ┌───────────┐ │ │ │ MES服务器 │ │ │ │ 192.168.x │ │ │ └─────▲─────┘ │ │ │ │ │ FRPC │ └───────┼──────────┘ │ 工厂设备公网服务器运行 frps局域网服务器运行 frpc。局域网服务器主动连接公网服务器因此不需要公网服务器主动进入企业内网。一、FRP 是什么FRP 是一个开源的反向代理和内网穿透工具。它最核心的工作模式是内网服务器 │ │ 主动连接 ▼ 公网 FRPS │ │ 接收外部请求 ▼ 互联网用户传统端口映射是Internet │ ▼ 企业路由器 │ ▼ 局域网服务器而 FRP 是局域网服务器 │ │ 主动建立连接 ▼ 公网 FRPS ▲ │ Internet 用户因此FRP 特别适合工厂 MESERPNext工业网关PLC 数据采集服务器视觉检测服务器AGV 调度服务器远程维护服务器Raspberry Pi 工业网关没有公网 IP 的企业服务器二、首先确认 Ubuntu 服务器架构在安装 FRP 之前首先确认服务器平台。执行uname -m如果返回x86_64说明服务器是Linux x86_64 FRPlinux_amd64如果返回aarch64说明服务器是Linux ARM64 FRPlinux_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 网络架构假设现在有一台公网服务器公网服务器 IP123.123.123.123 系统Ubuntu 22.04工厂内部有一台 MES 服务器MES服务器 IP192.168.10.100MES 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 root123.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 8000Ubuntu 本机如果启用了 UFWufw 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] DescriptionFRP Server Afternetwork.target[Service] Typesimple ExecStart/opt/frp/frps -c /opt/frp/frps.toml Restartalways RestartSec5[Install] WantedBymulti-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:8000FRPS 收到请求以后公网:8000 ↓ FRPS ↓ FRPC ↓ 192.168.10.100:8000最终访问到 MES。十二、FRPC 设置开机启动同样使用 Systemd。创建vim /etc/systemd/system/frpc.service内容[Unit] DescriptionFRP Client Afternetwork.target[Service] Typesimple ExecStart/opt/frp/frpc -c /opt/frp/frpc.toml Restartalways RestartSec5[Install] WantedBymulti-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/tcp4. 检查客户端网络在工厂 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. 使用强 Tokenauth.method token auth.token 随机长字符串2. 不要暴露不必要的端口只开放真正需要的7000 443业务端口尽量通过 Nginx 统一入口。3. 尽量使用 HTTPS例如https://mes.example.com而不是http://公网IP:80004. 工业设备不要直接公网映射尤其是PLC Modbus OPC 摄像头 数据库 RDP5. 定期升级 FRP关注官方 ReleaseFRP 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 访问、设备状态监控和工业数据