一、背景介绍
最近搞了个国标视频平台,技术栈是若依框架 + 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 和端口,同时用received
和rport
参数告诉平台真实的公网地址。但设备厂商的设备可能对Via
头的 IP 有严格校验,导致认证失败。
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
如果是自建防火墙,可以参考以下步骤:
- 登录防火墙管理界面
- 找到 ALG 配置
- 禁用 SIP ALG
3. 设备厂商的锅
如果设备厂商的设备对Via
头校验过于严格,建议联系他们调整配置。
五、总结
这个问题的核心是 NAT 设备和 SIP ALG 对Via
头的篡改,导致设备无法通过认证。通过更换端口或禁用 SIP ALG,可以解决问题。整个排查过程就像破案,从抓包分析到模拟测试,再到偶然发现端口的魔法,每一步都充满了惊喜和挫败。最后,感谢 Wireshark 和模拟设备,让我不至于在凌晨三点砸键盘。
提示:如果你也遇到类似问题,记得检查
Via
头、NAT 配置和 SIP ALG 设置,祝大家少踩坑!