GB/T 28181 视频前置接入:让摄像头进得来,又碰不到内网
需求一句话说得清:外部的摄像头、执法头盔要把实时视频送进内网的视频平台。
难点也一句话说得清:这些设备在互联网、4G 和专线上,而内网平台在业务网段里,两者一步都不能直连。
GB/T 28181 是国标的视频联网协议(SIP 信令 + RTP 媒体)。它解决”怎么互通”,不解决”怎么安全地互通”。后半截是网络工程师的活。
拓扑
前端监控 / 执法头盔 │ 互联网 / 4G / 专线 │ 边界防火墙(ACL) │ 前置机(DMZ) ← SIP 信令 + RTP 媒体 │ 视频接入网关 ← 级联 SIP + RTP │ 内网视频平台中间那台 DMZ 前置机是整个方案的核心。它的存在只为一件事:让两边永远不见面。
三条隔离原则
这三条是不可协商的,其他所有配置都是为了保证它们成立:
- 摄像头只能和前置机互通——不能直达内网任何业务网段
- 内网平台只能和前置机 / 网关互通——不能直接去连摄像头
- 媒体必须经前置机中继,不能端到端直通
第三条最容易被忽略。有些实现为了省带宽会协商成设备与平台直接传 RTP——那样前面两条隔离就白做了,等于在防火墙上开了一条谁也说不清的路。宁可多一跳中继,也不能让码流绕过前置机。
前置机的双重身份
这台前置机在国标体系里同时扮演两个角色,这一点是整个方案最容易想错的地方:
- 对前端设备(摄像头 / MCU),它是国标上级平台——设备向它注册、向它推流
- 对内网视频平台,它是国标下级域——它向平台注册、把流级联上去
于是媒体要做两段 RTP 中继:设备 → 前置机是一段,前置机 → 平台是另一段,中间由前置机重新做 SDP 协商。这正是”不能端到端直通”在实现层面的样子——前置机不是透传的代理,它是两侧各自的对端。
搞不清这层关系,就会在两边的国标 ID、SIP 端口和媒体端口段上反复配错。
单网卡还是双网卡
两套都做了方案,取舍如下:
| 单网卡(host 网络) | 双网卡 | |
|---|---|---|
| 部署 | 简单,一块网卡走 DMZ | eth0 对设备、eth1 对内网网关 |
| 隔离强度 | 靠防火墙 ACL 保证 | 物理链路天然分开 |
| 适用 | 成本敏感、边界防火墙可信 | 生产首选 |
生产上推荐双网卡:DMZ 侧和内网侧走不同物理口,即使 ACL 配错了,也不至于一条规则就把两张网连通。
网络一律静态配置,不上 DHCP——前置机的地址要写进防火墙工单和平台配置,不能变。方案阶段是按 Ubuntu / netplan 写的,实际落地的机器是 Anolis OS,改用 NetworkManager,配置方式不同但原则一样。
端口:只开必需的,逐条写清楚
前置机跑 WVP + ZLMediaKit,Docker 部署用 network_mode: host,让 SIP 和 RTP 端口直接监听,避免 NAT 端口映射把媒体协商搞乱(这是容器化跑 SIP 类应用最常见的坑)。
| 方向 | 端口 | 用途 |
|---|---|---|
| 设备 → 前置机 | 24600 UDP/TCP | SIP 注册与信令 |
| 设备 → 前置机 | 24601-24624 UDP | 实时音视频 RTP/RTCP |
| 前置机 → 设备 | 5060 UDP/TCP | 回呼 INVITE |
| 前置机 → 网关 | 5060 UDP/TCP | 级联 SIP |
| 前置机 → 网关 | 22000-22023 UDP | 媒体送网关 |
| 运维网段 → 前置机 | 22 / 18080 / 8080 TCP | SSH 与管理界面,限源 |
媒体端口段的宽度直接决定并发路数。上面这套对应约 12 路并发;要扩容就把设备侧扩成 24601-24700、网关侧扩成 22000-22100,并同步更新防火墙工单——不同步的话下次排障没人知道实际开了哪些口。
主机侧 ufw 默认拒绝入站,只放行上表的端口。管理口(WVP Web、ZLM API)绝不对全网开放。
防火墙工单要写成可审计的样子
这类项目最后落到边界防火墙上,就是一张工单。写工单有两个原则:
逐条写源、目的、协议、端口、动作、说明。 不要图省事写 any。工单里我专门加了一行:
不要开通 0-65535 any。
这不是废话——现场为了”先通了再说”开全端口,然后就永远没人敢关了。
要有明确的拒绝项。 工单不能只写放行什么,还要写清楚禁止什么:
- 摄像头 / 公网 不得直达内网业务网段
- 内网业务终端 不得直达摄像头
- 数据库 3306、Redis 6379 不对非本机开放
拒绝项是给后来人看的。半年后有人问”能不能让平台直接连摄像头”,工单上白纸黑字写着不行,就不用重新讨论一遍。
现场环境比协议更难对付
真实项目里,协议本身反而是最可控的部分。难的是现场给你什么条件:
| 约束 | 影响 |
|---|---|
| 服务器无互联网 | 镜像只能离线导出、拷贝、导入,不能 docker pull |
| Anolis OS 8.8 | RHEL 系但不是 CentOS,部分包源和文档对不上 |
| Docker 19.03(厂商定制版,不允许升级) | 很多新版 compose 语法不能用,只能按老版本写 |
| Compose v2.12.2 可用 | 唯一的好消息,编排还能正常做 |
服务栈是 WVP-PRO + ZLMediaKit + MySQL + Redis,全部要在这台机器上离线跑起来。所有镜像先在有网的机器上 docker save,拷进去再 docker load,版本必须一次选对——进去之后没有第二次机会拉包。
还有一个容易忽略的点:时间必须准。 SIP 鉴权对时间敏感,机器时钟偏了,注册就会莫名其妙失败,而报错信息不会告诉你是时间问题。
后续:MCU 会议 SIP 中继
国标这套跑通之后,接着做的是 MCU 会议系统的 SIP 中继,要支持双向主叫。
这一段没有继续用 WVP,而是换成 Kamailio + rtpengine——因为需求从”视频监控联网”变成了”会议信令路由与媒体中继”,前者的国标栈在这里是多余的。选型跟着需求走,不跟着”上次用了什么”走。
交付物
这个项目最后交付的不只是一台能跑的机器:
- 定稿方案(拓扑、选型、单/双网卡对比、端口互通表)
- 配置交付文档(逐步骤,含 netplan、Docker Compose、WVP 配置样例)
- 前置机完整配置手册(从裸系统到服务可用;方案版基于 Ubuntu,现场版按 Anolis OS 调整)
- 防火墙开通工单(可直接提交给网信 / 安全部门审批)
做集成项目十几年下来的经验是:方案能不能落地,一半取决于文档能不能让别人照着做。 只有你自己能维护的系统,等于埋了个雷。
这套东西能迁移到哪
同一套思路适用于所有”外部设备要进内网”的场景:园区监控联网、门禁平台对接、工业采集设备上云。变的是协议和端口,不变的是前置机 + 强制中继 + 逐条 ACL + 明确拒绝项这个骨架。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!


