这几天测试FreeSWITCH的Bypass Media功能,FreeSWITCH在公网上,客户端在私网,发现SDP数据被篡改,影响通话。
在客户端抓包,发出去的SDP是这样的(用ngrep抓包,每行会多显示个点)
Content-Length: 544.
.
v=0.
o=- 3693862075 3693862075 IN IP4 192.168.3.119.
s=pjmedia.
b=AS:117.
t=0 0.
a=X-nat:0.
m=audio 4006 RTP/AVP 103 102 104 125 109 3 0 8 9 101.
c=IN IP4 192.168.3.119.
b=TIAS:96000.
a=rtcp:4007 IN IP4 192.168.3.119.
a=sendrecv.
a=rtpmap:103 speex/16000.
a=rtpmap:102 speex/8000.
a=rtpmap:104 speex/32000.
a=rtpmap:125 opus/48000/2.
a=fmtp:125 useinbandfec=1.
a=rtpmap:109 iLBC/8000.
a=fmtp:109 mode=30.
a=rtpmap:3 GSM/8000.
a=rtpmap:0 PCMU/8000.
a=rtpmap:8 PCMA/8000.
a=rtpmap:9 G722/8000.
a=rtpmap:101 telephone-event/8000.
a=fmtp:101 0-16.
在服务端看到的SDP却是这样的:
Content-Length: 542
v=0
o=- 3693862075 3693862075 IN IP4 27.194.24.94
s=pjmedia
b=AS:117
t=0 0
a=X-nat:0
m=audio 4006 RTP/AVP 103 102 104 125 109 3 0 8 9 101
c=IN IP4 27.194.24.94
b=TIAS:96000
a=rtcp:4007 IN IP4 192.168.3.119
a=sendrecv
a=rtpmap:103 speex/16000
a=rtpmap:102 speex/8000
a=rtpmap:104 speex/32000
a=rtpmap:125 opus/48000/2
a=fmtp:125 useinbandfec=1
a=rtpmap:109 iLBC/8000
a=fmtp:109 mode=30
a=rtpmap:3 GSM/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
我们本次实验,希望客户端能保持私网IP,以便我们在Bypass Media的情况下RTP可以直接通过私网互通,不经过服务器。
这一般是ALG在捣鬼。ALG的全称是应用层网关,有时会偷偷地修改SIP协议,然而,检查了路由器的设备,并没有找到相关设置,也无法判定到底是中由器问题还是运营商在中间自作聪明捣了鬼。
另外,不知道你有没有注意到,这个篡改还有个Bug,那就是它没有改rtcp那一行。
上面的SIP使用的是UDP协议,后来,把SIP变成TCP传输就好了。看来,这个ALG只会篡改UDP的包。
还有几天就过年了,最近一年无法想象的忙,更新有点少。这几天如果老板提前放假,我就补几篇。提前祝大家新年快乐。