第十六章 故障诊断、寻求帮助与报告Bug

        SIP、WebRTC、 PSTN、 Dialplan、 IVR、 Lua、ESL、HTTAPI、 XML_CURL、 NAT、 安全、ITSP、UDP、 RTP、 TLS、 WSS、 证书、话机、软电话、智能手机、APP,你是生而知之者吗?

        本章,我们将阐述如何定位问题;解决FreeSWITCH实现和操作过程中的故障;如何获取并理解调试日志和抓包;如何定位查明上游供应商和下游用户的操作性问题。

        然后,我们将介绍怎样在寻求帮助前搜索文档,这里的寻求帮助包括来自社区(邮件列表、hipchat、IRC)的免费帮助,和来自专 业人士的商业支持和咨询。当你发现一个BUG,或者你想知道之前有没有人碰到类似的问题并将之归纳为一个BUG时,你需要用到Jira工具。我们将为你提供研究和报告BUG相关的完整指导。

        最后,我们将介绍ClueCon相关的一些内容,并以此结束本章和本书。ClueCon是我们于8月在芝加哥组织的年度实时通信和物联网大会。ClueCon的座右铭是:“从开发人员中来,到开发人员中去”,这是千真万确的:你能在那里找到我们,以及所有开发人员的开源实时通信与物联网社区。

FreeSWITCH故障诊断

        在实时通信过程中,许多事情都可能出错,而其中大部分不是你负责的,也不是你力所能及的。可能是网络运营商的交换机出现故障、ITSP配置错误、电话固件出现故障、客户防火墙、数据中心拓扑结果更新。

        而且,显而易见的时,我们前面章节所阐述的任何一种技术都有可能出错。最后,也许你的判断是对的,它就是FreeSWITCH的一个BUG。

        下面几节介绍如何对FreeSWITCH环境排除故障,理解判断具体问题是什么,来自何处。

        如果想要了解更多技术与细节,请参考Packt出版社2016年出版的《Mastering FreeSWITCH》一书其中的"Tracing and Debugging VoIP"那一章。

防火墙规则与网络问题

        看起来微不足道,但问题的头号根源就是防火墙配置错误。错误配置的原本目的是允许FreeSWITCH的流量通过。但是,负责维护防火墙规则的人可能不知道FreeSWITCH将产生和需要什么样的流量(地址、协议、端口)。

        在定位这类问题时,首先要保证网络流量没有被阻塞:单向通信、通话30秒后被挂断、没有声音,等等诸如此类的问题。

        先尝试打开FreeSWITCH机器所需要的所有端口和协议试试(比如先彻底禁用防火墙)。写一个脚本/usr/local/bin/disable_iptable.sh,添加以下内容:

#!/bin/sh
echo "Flushing iptables rules..." sleep 1
iptables -F iptables -X iptables -t nat -F iptables -t nat -X
iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT

        赋予它可执行权限,并执行脚本(千万不要逐行执行命令!否则你将有被锁在系统之外的风险):

chmod +x /usr/local/bin/disable_iptable.sh

/usr/local/bin/disable_iptable.sh

 

        现在,重启FreeSWITCH,检察问题是否还在。如果不走运,那么检查以下清单:

  • 部署在NAT之后
    • FreeSWITCH的公网IP是什么?配置文件中的ext-rtp-ip、ext-sip-ip这些参数是否配置为你的公网IP?(进入/usr/local/freeswitch/conf目录,并执行"grep -r ext-"命令)
    • 从外网到FreeSWITCH,是否打开了所有FreeSWITCH需要的端口的协议通道?
  • 如果有外部防火墙,最糟糕的设备
    • 它有没有阻塞你的流量?
    • 它有没有对SIP或其它协议应用某种ALG技术(应用层网关)?这很糟糕,不要寄希望于路由器或防火墙中的任何智能转换。它们不够智能!不够智能,最终会造成轻微的间歇性损伤。记住:禁用路由器和防火墙中的任何智能

 

检查FreeSWITCH 配置和操作

      如果你确信(反复检查)这不是网络问题,在禁用所有防火墙并对FreeSWITCH开放所有端口与协议的通信之后,问题依然存在,那么,你需要检查FreeSWITCH的配置。

       停止FreeSWITCH (从控制台执行“fsctl shutdown” ),然后重新启动它(或观察systemd重启服务的过程)。在Debian服务器上,你现在可以检查四个最宝贵的文件(很容易在其他操作系统上找到等效的文件):

 

/usr/local/freeswitch/log/freeswitch.log

/var/log/syslog

/var/log/daemon.log

/usr/local/freeswitch/log/freeswitch.xml.fsxml

 

  • freeswitch.log这是你的主要信息来源,它包含了FreeSWITCH的所有自我意识。此外,你可以从这里了解到FreeSWITCH是如何启动的。要特别注意ERR和WARNING级别的日志行。例如,可能你把一个SIP profile配置错了,而这个SIP profile拒绝启动。或者它尝试启动,但发现它的网络端口已经被另外一个进程占用了。

    你可以检查这个文件来了解FreeSWITCH是怎样解释你的分机的:可能你在条件判断中设置的正则表达式不匹配(原因可能是传入的内容与你期望的格式不相符,或正则表达式写错了)。

    通过读取freeswitch.log日志文件,可以发现很多线索,比如:我设置了变量,但是忘记使用"inline"属性之类的。
  • syslog/daemon.log包含操作系统生成的日志消息,可能会报告FreeSWITCH没有启动的原因
  • freeswitch.xml.fsxml是FreeSWITCH自身的“大脑转储”。它包含了FreeSWITCH启动过程中在内存里构建的整棵XML树。它是读取硬盘中的XML配置文件构建的,包括默认设置、计算设置(比如本地IP地址),和宏展开后的变量。它可能是最具启发性的文件。

fsctl loglevel 7

        如果要实时检查FreeSwitch内部交互的细节,没有什么比控制台或fs-cli更有价值。连接上fs-cli之后,请先执行"fsctl loglevel 7"命令,这样能输出详尽的调试信息。从呼叫创建到拨号方案解释与执行,所有细节信息你都可以实时观察。

        别忘了:可以过滤控制台上的日志记录,以便只看到与特定呼叫uuid相关的输出。先执行"show channels"或"show calls"命令,记下你所关心的uuid,然后执行"/uuid "命令,当然,后面要跟上你刚才记下的uuid作为参数。如果执行得太晚,控制台上已经开始刷屏,可以grep freeswitch.log来获取呼叫的uuid。

全局开启sofia siptrace

          在FreeSWITCH控制台上,通过"sofia global siptrace on"命令可以实时打印所有profile的SIP包。在运行日志级别为7的控制台上下文中,这个功能非常有用:你可以清楚地看到拨号方案、处理过程与SIP数据包之间的因果关系。此外,通过少量的实践,你将能够发现诸如不兼容编码、NAT问题(SIP数据包中的错误地址)、密码错误、域不匹配等问题。

 

 

verto debug=10

          如果你在/usr/local/freeswitch/conf/autoload_configs/verto.conf.xml把"debug"参数的值设置为"10",那么所有JSON协议的交换细节都将明文显示在控制台上(它们传输的过程中是加密的)

        你可以从中看到任何的异常信息(比如密码错误、操作失败),同时也能让你了解更多VERTO协议本身的信息。

sngrep: SIP对话可视化

        这是一款曾经引发通信世界风暴的工具。不要错过它。Debian、CentOS和OpenWRT/LEDE这些平台甚至直接提供它的安装包,可以直接安装!如果需要它的安装指南和完整文档,请访问https://github.com/irontec/sngrep。我们只会触及sngrep所能做的事情的皮毛。

        它由Ivan Alonso (IRC: kaian)开发,它是通过远程连接终端监视SIP通信的完美方式。

        下面是一个SIP dialog(呼叫):最左边是SIP消息的时间和增量,然后是主叫的源IP和端口,接着是SIP方法和应答的交换(正在可视化的消息粗体显示,图中的第二条INVITE),接下来是被叫的IP地址和端口,最右边是展开的可视化消息。请注意第二条INVITE消息中携带(协议的)授权证书(Proxy-Authorization),它是FreeSWITCH对第一条INVITE消息的应答消息407要求的。FreeSWITCH鉴权通过(然后建立呼叫),发送"200 OK"应答,最后话机会发一条"ACK"进行确认。话机发送"BYE"消息后,通话结束,FreeSWITCH对这个消息响应"200 OK"。

        此外,请注意INVITE消息中的包体内容,我们可以看到媒体描述(SDP部分)中的zrtp-hash属性,它说明我们的客户端(这里用的是Linphone),正在为媒体流尝试协商ZRTP加密。

        使用sngrep,能够降低你理解SIP的障碍,陡峭的学习曲线将变得平滑起来。

Tcpdump抓包并存储为pcap文件

        当你为实时通信问题寻求帮助时,对方经常(总是)会要求你提供包含有问题会话的网络流量"pcap"抓包文件。此外,你也经常需要把远程通信数据保存为文件,以方便后续分析(可以通过sngrep或wireshark)。

        它是一款是非常实用的工作,几乎在所有的操作系统下都是可用的。它的最基本用法(反所有经过网卡的包都抓下来并保存为文件):

 

tcpdump -nq -s 0 -i eth0 -w /tmp/dump.pcap

 

        你可以对端口过滤,比如只保存进出5060端口的包(不限定协议,因此TCP和UDP端口都会保存,完整的“传统”SIP信令):

 

tcpdump -nq -s 0 -i eth0 -w /tmp/dump.pcap port 5060

 

寻求帮助

        好吧,好吧,我们都曾经到过那里。我们当中有许多人曾经多次到过那里。其中最厉害的家伙甚至每天都去过那里。在你抵达知识边界时寻求帮助,这仅仅意味着你在超越自己的极限。如果它(寻求帮助)成为你真正超越自我极限的一个契机,那么这是非常好。

        有人帮忙。FreeSWITCH有两个不可思议的优势:一个是拥有独立的社区,知识渊博,对新来者非常尊重和关心。让社区知道你已经完成了你的工作,你已经研究了文档和档案,你已经从一个良好的配置开始,但是问题仍然存在。顶级专家会向你询问更多信息,并会尽力帮助你。

        另一个优势是,FreeSWITCH开发人员和顶级贡献者同时也是专业顾问,他们拥有数十年的商业级支持和咨询经验。你的项目技术成功是有保证的!

请首先阅读文档!

        如果你已经尽了自己的职责,那么你寻求帮助才会更加令人信服,也更用利于社区知道如何更有效地帮助你。如果在谷歌搜索一下,答案就在第一条搜索结果中,这样你还去找别人帮助,收到这样的消息或读取这样的邮件无疑是令人恼火的(至少我是)。我们都是普通工作者,把这样的消息发到我们的消息栈中(是的,我们会读取邮件列表、IRC和HipChat)无疑是在浪费我们的时间,因为你的时间是如此宝贵,以至于你不愿意花点时间去谷歌或阅读在线文档!

        此外,阅读文档可以让你收集我们回答问题所需要的全部信息,掌握基本知识将让你有能力提出正确的问题。

 

confluence

          http://freeswitch.org/confluence—你需要查询的第一个知识源就是我们的Confluence文档系统。它是一个类似wiki的web服务,但与我们的开发、BUG管理系统和源码管理环境相互连接。它由Atlassian开发,它是开源的,它的使用的FreeSWITCH项目一样,没有成本。

        Confluence有卓越的搜索功能,还有FreeSWITCH自身以及相关的所有最新信息和文档。我们在官方文档上做了很多努力,请阅读并搜索它。

 

书籍

         嘿嘿,我知道你喜欢这本书。除了这本书之外,Packt还出版了其它高质量的FreeSWITCH相关书籍。比如《FreeSWITCH 1.6 CookBook》、《"Mastering FreeSWITCH》。我们认识作者,可以为他们背书。

        我经常推荐的另一本书是Wiley出版的《VoIP Deployment for Dummies》。但它根本不是为傻瓜准备的,即使它是2009年出版的,还是为了提供了400页的完整通用教程(涵盖了SIP、LAN度量、处理ITSP这些主题)。

        作为SIP的参考文献,RFC是免费的。还有Johnston所著的《SIP, understanding the Session Initiation Protocol》一书,它由Artech House出版,我发现它很完整,当我需要寻找细节时,很容易查阅。对于架构师和基于SIP复杂系统工作来说,McGraw出版的《Session Initiation Protocol, Controlling Convergent Network》一书是很好的参考书。

        我在这里明确地推荐一本我朋友的书,他们服务于OpenSIPS项目,那就是由Bogdan-Abdrei Iancu 和 Flavio Goncalves合作的《Building Telephony Systems with OpenSIPS》一书,这本书也是Packt出版的,推荐的理由是这本书的第一部分是非常好地奠定了SIP知识(这是阅读这本书的其余部分所需要的)。基于实际实施经验的知识。此外,OpenSIPS作为SIP负载均衡、代理、注册服务器,是FreeSWITCH的良好补充,它们经常一起使用。

 

邮件列表归档

        我敦促你使用FreeSWITCH的邮件列表归档。十多年来,每天都有关于如何使用FreeSWITCH的技术讨论。它们是最聪明的的人们在讨论和解决问题过程中积累下来的,充满着大量令人难以置信的,深刻的,准确的信息。从中,你不仅能找到问题的答案,了解“如何做”,还能理解达到这一点的推理路线。

        通向邮件列表归档之路:

http://lists.freeswitch.org/pipermail/freeswitch-users/

 

google

          网络中有许多博客,人们记录了使用FreeSWITCH的经验,并对他们为什么选择特定的应用程序开发技术以及项目如何实现进行了深入的技术讨论。人们喜欢描述他们的技术成功故事。有时也会记录恐怖故事。

        在那里有很多博客,人们记录了他们与Freeswitch的经验,并对为什么选择了一种特定的应用程序开发技术以及该项目是如何实现进行了深入的技术讨论。人们喜欢描述他们的技术成功故事。有时他们经历的恐怖故事也是如此。

如何寻求社区帮助

        你已经尽力去了解你的系统发生了什么事情,以及项目问题所在的领域。你已经阅读相关的文档和其他人的经验文章,但是还有什么东西不明确,有什么东西不理解,或者有什么与你的经验知识不符的东西。

        我们很乐意为你提供帮助。我们有一个完整的社区,里面有数百名乐于分享和建立知识的专业人士。我们可以通过实时的交互方式沟通,比如通过IRC、HipChat之类的聊天系统,也可以通过邮件列表这样的异步交流方式。

        请准备好提供相关信息:

  • 平台、操作系统、硬件或虚拟化环境
  • FreeSWITCH的"version"命令输出
  • 你的XML拨号方案
  • 你的脚本
  • FreeSWITCH的控制台调试输出(请不要编辑IP地址,这没什么好处,但往往把事情弄得一团糟)
  • FreeSWITCH控制台输出,包含完整的sofia siptrace跟踪信息和verto调试输出
  • 问题重现时的网络抓包文件(pcap格式)

 

          不要在邮件附件中携带这些信息,或者(更糟糕的)直接贴在IRC和HipChat上。这些信息必须以公开可用的webserver提供,可以使用FreeSWITCH的pastebin,它具有特定的语法高亮功能,入口是https://pastebin.freeswitch.org/,在邮件和聊天中,把你的链接发布到所需的文件和页面中。

        请保持耐心,人们都有自己的工作,他们利用业余时间,出于善意和社区意识来帮助你。 不要仅仅因为你赶时间或情况紧急就期望别人立刻答复你。急于求成会让人反感。明确切中要害地提供信息,但不要过多提供,将有助于获得你所需要的答案。

        此外,请注意时区差异问题,还有假日因素。FreeSWITCH社区的大部分成员居住在北美,其次是欧洲(包括西欧与东欧),然后是亚洲(尤其是印度和巴基斯坦)。中国人建立了自己的FreeSWITCH社区,他们的领袖之一(Steven,杜金房)也是英语社区中的活跃成员。俄语中也有自己的活动版块。

IRC

        这个聊天系统在任何极客的心中都有一个特殊的位置:多年以来,通过IRC进行了大量的技术讨论和相互帮助。

          FreeSWITCH的IRC通道是irc.freenode.net 上的"#freeswitch"(注意打头的井号#)。为了连接IRC,你需要一款类似Pidgin的客户端,然后选择加入我们的通道,你可以潜水一段时间了解它的用法。需要时,键入"~take-a-number",然后是你的问题描述。礼貌而非正式地询问事情,不需客套,不需许可,直奔主题,然后耐心等待。最终会有人回答你的问题。我们将邀请你提供更多信息。做好准备。如果几个小时后你没有得到答案,那么再问一次。

HipChat

        HipChat是一个新的聊天系统,它拥有许多IRC不具备的高级功能,它还是我们所使用的Atlassian软件开发管理工具套件所集成的部分之一。特别是,HipChat聊天历史记录总是存档的,可以搜索,所以不会丢失任何内容。我们发现它在我们内部使用很方便,而且我们还向整个社区开放了一些房间。最好的交互方式是在我们的BUG跟踪系统(http://jira.freeswitch.org)上注册一个账号,然后通过你机器上的HipChat客户端,使用该账号和密码登录。你可以Google搜索HipChat客户端并下载。你必须在设置中插入hipchat.freeswitch.org作为服务器。你还可以通过页面加入聊天,链接是https://hipchat.freeswitch.org/

邮件列表

        在我看来,邮件列表是寻求帮助的最主要途径。异步邮件意味着人们很可能会找到合适的时间来回答问题,而与他们所居住的时区或生活方式无关。你首先订阅邮件列表,当你的注册被批准后(大约一天左右),你就可以向邮件列表推送邮件了。至少在开始时,请您花点时间搜索和阅读邮件列表存档,了解如何交换信息。然后,不费吹灰之力,你可以提出你的问题了。尝试使用明确而又具体的邮件主题,繁忙的专业人士不太会关注“FreeSWITCH问题”或“FreeSWITCH不工作”之类的主题。主题一定要抓住知识渊博的人们的好奇心,比如"Timeout in playandgetdigit does not work for me",或者"Registered user not reachable from failover machine"。你占用了别人忙碌中的宝贵时间,请以最好的方式去做。

        你可以从这里订阅邮件列表:

http://lists.freeswitch.org/mailman/listinfo/freeswitch-users

官方商业支持和咨询

         专业支持合同和项目咨询可以联系"[email protected]"。我们将为您提供解决方案,您将被介绍给我们所有的商业伙伴,有专人负责定义您的案例。您的案例会分配资源解决,您的问题和忧虑将会很快消失。FreeSWITCH Solutions是FreeSWITCH核心开发者的官方公司,可以访问http://freeswitch.com/了解更多信息。

 

报告问题

        如果你碰到BUG应该怎么办?首先,请尝试理解你是否真的碰到一个FreeSWITCH的BUG了。检查FreeSWITCH周围一切可能引发故障的因素:网络、防火墙、数据库、上游及下游的供应方,等等。好吧,让我们假设你已经检查过所有的可能情况了。

        接下来,下载并安装FreeSWITCH的最新稳定版本。你会被问及:“这个问题是否会影响最新的稳定版本?”如果你不给出肯定的答案(并提供证据),那么你的问题将得不到重视(它可能在最新版本中已经解决了)。

        接下来,对FreeSWITCH的最新开发版本(MASTER分支)做相同的验证。准备好回答这个样的问题“这个问题会影响master吗?”。如果它已经在master中解决了,它可能会被反向合入稳定版本,这仅是一种可能性。

不要在邮件列表中报告BUG!

        我们的开发人员和贡献者讨厌在邮件列表中报告BUG。在某种程度上,出于某种原因,人们相信他们可以在邮件列表上草草写下一封邮件,然后我们中的一个人会仔细阅读该邮件,然后仔细填写非常详细的错误报告表单。这是根本不会发生的。你只会收到一个稍微恼火的回复“我是我第10000次重申:BUG报告是Jira的事,不要在邮件列表中报告BUG”。如果我们用邮件作为bug跟踪工具,那么所报的bug将永远无法得到解决,它或回归,或被遗忘。或许其他人已经报告了你的问题,这不是一个bug,而JIRA问题解决方案将告诉你如何使它工作。

 

如何上Jira上提交bug

        使用http://jira.freeswitch.org的第一印象可能是令人恐惧的,但听我说,事实上它简单又快捷。这也是你唯一的选择,这是一条高速公路。

        你需要先注册并获取一个jira账号,才能创建一个“问题单”。你将看到一个冗长而又让人生畏的表单,但实际上我们想要的是保证重现BUG所需要的全部信息,并且你已经在最新的FreeSWITCH版本上重现过这个问题。

        尽量更完整,更精确地描述问题,同时兼顾言简意赅。特别是,所有补丁、日志、相关文件、脚本 都必须以附件形式上传,不要贴在评论中。还要注意附件的扩展名,以便下载时浏览器能够自动识别它们:补丁是.diff文件,日志是.log文件,等等。

        当你的bug报告发布完成后,你应该首先感到自豪与高兴,因为你已经帮助到FreeSWITCH项目和社区了。请给点耐心。下列场景你将会自动收到通知消息:评论、疑问、分配、解决、拒绝,等等,如果要求你进一步提供信息,请尽快提供给他们。现在除了等待,你似乎无能为力了。嗯,事实上,如果想在jira中让你的问题比其它问题拥有更高的优先级,那么让联系[email protected],以获取成本和其它细节。

 

ClueCon

        ClueCon是我们的年度大会,是那些对实时通信和物联网有线索的人的大会。每年八月在美丽的芝加哥召开,所有专业的VoIP、WebRTC制造商,梦想家和科学家共聚一堂,为期一周的编码、玩笑、介绍、比萨、培训和游戏。所有与通信相关的开源项目都集中在那里,你会发现自己与心目中的开发英雄们擦肩而过。访问网页https://www.cluecon.com/,就可以看到演讲者和议程,现在,就可以注册参加下一届会议了(越早注册,成本越低)。

总结

        最后一章概述如何解决FreeSWITCH中的问题及潜在的问题(防火墙、网络、路由器、配置,等等),以及如何检查这些问题。

        我们介绍了如何可视化是查看FreeSWITCH的调试日志和通信信令内容,包括SIP和Verto。

        我们研究了要阅读哪些文档,在哪里可以找到解决问题的相关信息:邮件列表归档、官方文档网站、博客、书籍。

如果我们一番努力之后问题还是未能解决,那么还可以寻求帮助。社区提供免费的咨询服务,将尽最大的能力帮助大家,可以联系[email protected]寻求商业支持。

        如果我们确信发现了一个FreeSWITCH的bug,可以向https://freeswitch.org/jira/secure/Dashboard.jspa报告。不要在邮件列表中报告bug

        本书的最后,简要介绍了ClueCon,一个属于开发者的天堂,我们每年都聚集在芝加哥,享受真正的乐趣。

 

猜你喜欢

转载自blog.csdn.net/yetyongjin/article/details/102986343