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

相关推荐
ikkkkkkkl13 分钟前
P2P架构
网络协议·计算机网络·p2p
愚昧之山绝望之谷开悟之坡38 分钟前
HTTP与HTTPS协议的核心区别
网络协议·http·https
无敌最俊朗@42 分钟前
**HTTP/HTTPS基础** - URL结构(协议、域名、端口、路径、参数、锚点) - 请求方法(GET、POST) - 请求头/响应头 - 状态码含义
爬虫·python·网络协议·http·https
还是鼠鼠1 小时前
JMeter 教程:使用 HTTP 请求的参数列表发送 POST 请求(form 表单格式)
网络协议·jmeter·http
Code哈哈笑2 小时前
【图书管理系统】用户注册系统实现详解
数据库·spring boot·后端·mybatis
用手手打人2 小时前
SpringBoot(一)--- Maven基础
spring boot·后端·maven
Code哈哈笑4 小时前
【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
数据库·spring boot·后端·mysql·mybatis·交互
Javatutouhouduan4 小时前
线上问题排查:JVM OOM问题如何排查和解决
java·jvm·数据库·后端·程序员·架构师·oom
爱学习的张哥5 小时前
UDP--DDR--SFP,FPGA实现之ddr读写控制模块
网络协议·fpga开发·udp
多多*5 小时前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet