第十六章 故障診斷、尋求幫助與報告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,一個屬於開發者的天堂,我們每年都聚集在芝加哥,享受真正的樂趣。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章