两天两夜!这个 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 设置,祝大家少踩坑!

相关推荐
东风破_8 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
jay神10 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
kekekzt11 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
2601_9620738113 小时前
Spring全面详解(基础版)
java·后端·spring
IT_陈寒13 小时前
Vite打包时的静态资源坑,我帮你踩过了
前端·人工智能·后端
考虑考虑13 小时前
kubectl命令
运维·后端·自动化运维
第五页的你13 小时前
ElasticSearch结合本地消息表实现搜索功能
后端
谢亮_vipxieliang14 小时前
ValidX分组验证详解:不同场景使用不同验证规则
java·spring boot·后端·spring cloud·eclipse·hibernate
超兔一体云14 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
. . . . .14 小时前
服务端监控
后端