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

相关推荐
欧先生^_^1 小时前
OSPF网络协议
网络·网络协议·智能路由器
iuyou️1 小时前
Spring Boot知识点详解
java·spring boot·后端
一弓虽1 小时前
SpringBoot 学习
java·spring boot·后端·学习
姑苏洛言1 小时前
扫码小程序实现仓库进销存管理中遇到的问题 setStorageSync 存储大小限制错误解决方案
前端·后端
光而不耀@lgy1 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
方圆想当图灵2 小时前
由 Mybatis 源码畅谈软件设计(七):SQL “染色” 拦截器实战
后端·mybatis·代码规范
毅航2 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
我的golang之路果然有问题2 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
柏油3 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
写bug写bug4 小时前
Java Streams 中的7个常见错误
java·后端