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

相关推荐
星辰徐哥7 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥7 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约7 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee7 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐7 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs7 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐7 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司7 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
码农阿豪7 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
追逐时光者7 小时前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
后端·.net