两天两夜!这个 GB28181 的坑让我差点卸载 VSCode

一、背景介绍

最近搞了个国标视频平台,技术栈是若依框架 + WVPPRO+ZLM,协议用的是 GB/T 28181-2016。内网测试时,摄像头们像听话的小奶狗一样秒注册,结果一部署到京东云服务器,某厂商的摄像头直接摆烂,死活连不上。但海康的设备却能正常注册,这就离谱!

二、排查过程

1. 初现端倪:401 Unauthorized 的困惑

用 Wireshark 抓包发现,平台确实回复了 401 认证请求,但设备死活不回带Authorization头的注册包。这就像你去餐厅吃饭,服务员说 "请出示会员卡",结果你扭头就走,留服务员在风中凌乱。

2. 模拟设备:发现 Via 头的猫腻

用模拟设备测试时,发现日志报错:

plaintext

ini 复制代码
[2025-04-26 17:47:45] : [ERROR] sip_check_response_via, is_local_if_ip return FALSE via_hdr->ip=0xfb494064

大意是设备检查Via头的 IP 和本地 IP 对不上。一看抓包结果,平台回复的Via头里的 IP 是100.64.38.134,而模拟设备的 IP 明明是192.168.1.142。这就像你给朋友寄快递,地址写的是你家,结果快递单被改成了邻居家,朋友当然收不到。

3. 深入分析:NAT 和 SIP ALG 的锅

进一步分析发现,Via头被 NAT 设备篡改了。NAT 设备会在Via头里添加自己的内网 IP 和端口,同时用receivedrport参数告诉平台真实的公网地址。但设备厂商的设备可能对Via头的 IP 有严格校验,导致认证失败。

graph TD A[设备] --> B[NAT设备] B --> C[平台] C --> D[回复401] D --> B B --> A

4. 曙光初现:端口的魔法

偶然发现设备厂商的平台用的是 5061 端口,于是我把平台端口改成 5070,奇迹发生了!Via头里的 IP 不再被篡改,设备成功注册。这就像你用普通邮箱发邮件总被拦截,换个 VIP 邮箱就畅通无阻。

三、技术解析

1. Via 头的作用

Via头就像快递单的物流信息,记录消息经过的每一跳,确保响应能原路返回。如果被篡改,设备可能无法正确回包。

plaintext

css 复制代码
Via: SIP/2.0/UDP 100.64.38.134:61300;received=113.132.64.61;rport=6272;branch=z9hG4bK1631f

2. NAT 和 SIP ALG 的干扰

NAT 设备会修改 IP 和端口,而 SIP ALG(应用层网关)会进一步篡改Via头,导致设备校验失败。特别是 5060 端口,很多网络设备默认对其启用 SIP ALG。

3. 端口的玄学

改用非标准端口(如 5070)后,SIP ALG 可能未被触发,Via头保持正确,设备注册成功。这就像避开高峰期,堵车自然少。

四、解决方案

1. 临时方案:换端口

将平台端口从 5060 改为 5070,绕过 SIP ALG 的干扰。

2. 终极方案:禁用 SIP ALG

如果是自建防火墙,可以参考以下步骤:

  1. 登录防火墙管理界面
  2. 找到 ALG 配置
  3. 禁用 SIP ALG

3. 设备厂商的锅

如果设备厂商的设备对Via头校验过于严格,建议联系他们调整配置。

五、总结

这个问题的核心是 NAT 设备和 SIP ALG 对Via头的篡改,导致设备无法通过认证。通过更换端口或禁用 SIP ALG,可以解决问题。整个排查过程就像破案,从抓包分析到模拟测试,再到偶然发现端口的魔法,每一步都充满了惊喜和挫败。最后,感谢 Wireshark 和模拟设备,让我不至于在凌晨三点砸键盘。

提示:如果你也遇到类似问题,记得检查Via头、NAT 配置和 SIP ALG 设置,祝大家少踩坑!

相关推荐
H5css�海秀7 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang8 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长8 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34168 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
代码栈上的思考9 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
程序员小假9 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha10 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji341610 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Victor35611 小时前
MongoDB(57)如何优化MongoDB的查询性能?
后端
钛态11 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos