UDP 连接未被识别为 UDP 流

UDP 连接未被识别为 UDP 流

来自 VoIP 领域的一个问题。

NAT 后面的几个设备想要与发送方 IP 建立 UDP 连接。UDP 的 NAT 设置如下

net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 120

设备向服务器发送 REGISTER 并建立 UDP 连接。通常的游戏如下:

->Proxy Authentication Required
<-REGISTER nonce
->OK

并且 99% 以上都被识别为 UDP 流。如果 SenderIP 现在每 60 秒发送一个 SIP 数据包,则连接始终与 UDP 流保持在同一端口上。我在 conntrack 中看到(例如,对于 2 个设备):

udp 17 114 src=internalIP1 dst=SenderIP sport=5060 dport=5060 src=SenderIP dst=externalIP sport=5060 dport=8382 [ASSURED] mark=0 use=1
udp 17 119 src=internalIP2 dst=SenderIP sport=5060 dport=5060 src=SenderIP dst=externalIP sport=5060 dport=22919 [ASSURED] mark=0 use=1

但是,我(很少)遇到这种情况(这里 TTL 从 30 秒减少到 9 秒,无法识别为流)

udp      17 9 src=InternalIP dst=SenderIP sport=5060 dport=5060 src=SenderIP dst=ExternalIP sport=5060 dport=20932 mark=0 use=1

一分钟后:

udp      17 26 src=SenderIP dst=ExternalIP sport=5060 dport=20932 [UNREPLIED] src=ExternalIP dst=SenderIP sport=20932 dport=5060 mark=0 use=1

端口已关闭,SenderIP 无法访问设备。

当我分析此案例时,我看到此 dport (20932) 上有时间戳:

<-REGISTER:
15:17:41.728188 IP (tos 0x60, ttl 63, id 12923, offset 0, flags [none], proto UDP (17), length 621)
->Proxy Authentication Required:
15:17:41.732859 IP (tos 0x10, ttl 59, id 3219, offset 0, flags [none], proto UDP (17), length 527)
<-REGISTER with auth:
15:17:41.733459 IP (tos 0x60, ttl 63, id 12925, offset 0, flags [none], proto UDP (17), length 627)
->OK:
15:17:41.738826 IP (tos 0x10, ttl 59, id 3220, offset 0, flags [none], proto UDP (17), length 564)

在 conntrack 中我可以看到 TTL 9 秒,这不被识别为流:

udp      17 9 src=internalIP dst=SenderIP sport=5060 dport=5060 src=SenderIP dst=externalIP sport=5060 dport=20932 mark=0 use=1

总共只有 2100 个连接,因此不会达到限制。

为什么有些连接不能被识别为流?

将连接识别为 UDP 流的算法是什么?

在哪些情况下它可能失败?

相关内容