近期由于研究FreeSwitch高可用性,用来提高AI机器人话务处理单元的稳定性,避免AI处理模块异常导致通话异常,需要对呼叫进行详细的跟踪和分析。
虽然可以通过fs_cli的窗口,查看详细的sip消息内容,并根据SIP消息各个字段进行debug。但是这种方式是命令行模式,所有信息都需要人工逐一仔细分析。单台freeSwitch的情况下,做SIP信令分析还勉强能接受,超过2台以上的fs协作交互时,一个呼叫下来消息通常是几十条,这时候基于文本的协议分析就变得异常困难,和消耗个人精力。分析过程异常艰难,调试问题也变得十分缓慢。
后来想到著名的抓包分析软件 WireShark,具有图形化分析能力,能快速直观的看到呼叫过程。
这个比较简单,安装完Wireshark后,直接打开,选择一个本地的网络接口,直接抓包即可。
在过滤器一栏直接输入“sip”,就可以查看本机和服务器之间的sip消息了,如下图
呼叫结束后,选择“电话->SIP流”,即可看到刚才做的sip呼叫
这个图形直观易懂,而且点击时,可以直接关联显示具体的sip消息内容,非常的方便,分析调试效率大大提高。
本地实时抓包优点是及时性,只要拨打电话后,即可重复上面的操作,进行SIP呼叫流程的图形化查看分析。
缺点也比较明显,就是只能查看本机sip话机的信令,而无法查看服务器端的交互记录,特别是多freeSwitch协作的情况下。当多台freeSwitch又不在同一个网段的情况下,变得极为困难。
一般来说,我们通用的解决办法就是用tcpdump这个工具,利用下面的命令
tcpdump -w '1.cap'
将服务器上的数据包进行抓取存盘,然后通sftp的方法,下载到本机,然后用wireshark的打开文件功能进行分析
这样就实现了对服务器的呼叫流程分析。
服务器抓包的优点和缺点同样明显,那就是服务抓的信息更全,更有利于全呼叫链路分析。缺点是步骤繁琐,不能做到实时分析,每一次都需要重复 “抓包->下载->打开–>分析” 这样的步骤。
有没有办法实现多机以及跨网络的抓包方案呢?
答案是有的!
那就是用NetCat这个宝贝工具来进行抓包数据的网络传送,从而实现远程抓取,实时分析的目的!!!
rpcap – 网上好多教材提到了这个方案,可以在2022年,这个方案已经过期了,wincap已经明显的不维护了,我下载源码进行编译也未能成功,因此放弃此方案
ssh – 这个方案有一定的可取之处,但是我未能成功执行
注意:win10下,如果在powerShell窗口下执行,是无法弹出wireshark窗口的,需要“Win+R -->cmd”打开传统的命令行窗口才行。
注意:这里nc无论哪一方做svr都可以的,不限定。上图是本机nc作为svr接收数据,服务器端nc作为client连接上来。实际上反过来也是ok的
tcpdump -s 0 -U -n -w - -i enp0s3 | nc 172.21.153.85 5555
nc -l -p 5555 | "D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
或者这样
tcpdump -s 0 -U -n -w - -i enp0s3 |nc -l -p 5555
nc 172.21.152.7 5555 |"D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
两种方式都OK
甚至通过ssh 隧道转发可以工作,核心思想就是建立起两个nc之间的连接。(下面有详细解释)
网络上有很多技巧,这里就不详细说明了。上图展示的是服务端可以直接访问客户机的模式。
此外还有一种常见的情况就是服务器在公网上,而我们的客户机在内网,这里面又有不少网络推送技巧了。
包括利用xshell的ssh forward能力,在本机开启监听端;nc启用数据管道转发能力。参考这篇文章
原理如下图:
连接上服务器后,在本机检查一下ssh隧道是否启用监听
服务端此时肯定没有这个监听端口的。
需要执行抓包监听指令方可以。
tcpdump -s 0 -U -n -w - -i enp0s3 |nc -l -p 5555
然后再新开一个连接窗口,执行端口查询命令
netstat -putln
这个时候,客户端一旦连接了127.0.0.1:5555端口,就相当于连接了服务端的5555端口了。
执行下面的命令
nc 127.0.0.1 5555 |"D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
我们可以看到,和直接连接服务器的区别就是ip地址的不同,一个直接连接服务器公网ip,一个连接的是本机的ip。这就是利用的ssh的隧道转发技术,实现了远端服务器的“虚拟直连”。
相当的直观,相当的Nice!
通过常用的nc和xshell工具,加上WireShark强大的分析能力,能够搭建复杂的,实时调试环境,提高工作效率。
1.windows下载nc,https://eternallybored.org/misc/netcat/
2.解压后,放到windows目录下
3.linux服务器安装nc, apt install net-cat
4.linux服务器安装tcpdump, apt install tcpdump
5.启动linux抓包及nc监听服务,tcpdump -s 0 -U -n -w - -i enp0s3 |nc -l -p 5555
6.启动客户端接收(注意,windows下不能用powershell,需要用cmd窗口,否则无法启动wireshark)
nc 172.21.152.7 5555 |"D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
本机的wireshark安装在 "D:\Program Files\Wireshark"目录下
本机的ip地址为:172.21.153.85
本机操作系统:Win10
服务器的ip地址为:172.21.152.7
服务器的操作系统:Debian 11
tcpdump -s 0 -U -n -w - -i enp0s3 | nc 172.21.153.85 5555
nc -l -p 5555 | "D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
tcpdump -s 0 -U -n -w - -i enp0s3 |nc -l -p 5555
nc 172.21.152.7 5555 |"D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -
tcpdump -s 0 -U -n -w - -i enp0s3 |nc -l -p 5555
nc 127.0.0.1 5555 |"D:\Program Files\Wireshark\Wireshark.exe" -k -S -i -