freeswitch對接WEBRTC的一個candidate問題


 

概述

近幾年,WEBRTC的完善與成熟,使得網頁上使用webrtc的應用越來越多。

Freeswitch是一個開源的軟交換平台,可以直接支持webrtc的對接方式。

最近在測試fs和webrtc的對接中碰到一個問題。記錄如下。

問題描述。

客戶A,使用webrtc頁面注冊到fs,並發起呼叫到客戶B。

A客戶收到488 SIP響應碼,結束呼叫。

 

環境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.8.7

GCC:4.8.5

 

問題分析

SIP的488錯誤碼一般是由於媒體協商問題造成的。

檢查A/B路和fs的codec設置,並沒有發現問題。

查看fs日志,發現掛斷前的日志如下:

2022-03-24 14:50:48.663204 [DEBUG] switch_core_codec.c:111 sofia/internal/075512345678@webrtc Original read codec set to PCMA:8

2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3481 Save audio Candidate cid: 1 proto: udp type: host addr: 192.167.10.207:55231

2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3523 Searching for rtp candidate.

2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3523 Searching for rtcp candidate.

2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3567 sofia/internal/075512345678@webrtc no suitable candidates found.

...

a=candidate:3284465256 1 udp 2122260223 192.167.10.207 55231 typ host generation 0 network-id 1

a=candidate:2370243224 1 tcp 1518280447 192.167.10.207 9 typ host tcptype active generation 0 network-id 1

...

2022-03-24 14:50:48.663204 [NOTICE] switch_channel.c:3515 Hangup sofia/internal/075512345678@webrtc [CS_EXECUTE] [INCOMPATIBLE_DESTINATION]

2022-03-24 14:50:48.663204 [DEBUG] switch_ivr_originate.c:3848 Originate Resulted in Error Cause: 88 [INCOMPATIBLE_DESTINATION]

 

從日志中,可以看到在媒體協商的過程,有一個“no suitable candidates found”的信息。意思是webrtc中的ice框架沒有找到合適的可選媒體地址。

同時,SDP中又有“a=candidate: udp 192.167.10.207 55231”的信息。

 

日志看起來比較奇怪,明明打印出來的有candidate信息,為什么又說找不到合適的candidate。

 

我們嘗試百度了一下“192.167.10.207”這個地址,居然是屬於意大利的IP,是一個公網地址。

 

經過和客戶溝通,客戶側反饋信息是“192.167.10.207”是公司的內網地址。。。網管是個人才。

 

打開conf/sip_profile/internal.xml配置文件,查找“candidate”,看到如下配置:

<param name="apply-candidate-acl" value="rfc1918.auto"/>

這個配置的意思是,對ice框架中candidate可選地址設置acl規則,對不符合rfc1918規范的IP地址進行攔截。

Rfc1918規定的地址段如下,一般情況下,內網地址都要按照這3個網段來配置:

10.0.0.0        -   10.255.255.255  (10/8 prefix)

172.16.0.0      -   172.31.255.255  (172.16/12 prefix)

192.168.0.0     -   192.168.255.255 (192.168/16 prefix)

 

問題就出在這里,fs對candidate設置了acl規則為rfc1918,客戶配置的candicate又只有192.167的一個公網地址,造成了沒有可選的媒體地址的問題。

 

解決方案

首先,客戶修改本地地址是最簡單的解決方式,只需要把192.167的內網地址修改為192.168網段即可。

 

但是回到fs服務器本身來看,如果有客戶通過公網地址對接,即candidate無法獲取到內網地址,還是會有上述的問題存在。

最終,從fs服務端出發的解決方案。

方案1,修改 internal.xml,增加candidate的acl規則,讓公網地址也可以通過可選規則。

<param name="apply-candidate-acl" value="rfc1918.auto"/>

<param name="apply-candidate-acl" value="wan.auto"/>

這樣,無論客戶的candidate中只有公網地址,還是只有私網地址,fs服務端都可以正常的建立媒體。

 

方案2,從acl自定義規則出發,設置candidate的acl規則為允許所有。

修改 acl.conf.xml

<list name="ice_candidate" default="allow">

</list>

修改 internal.xml

<param name="apply-candidate-acl" value="ice_candidate"/>

但是,該方案在實際測試過程中是有問題的,會造成公網和私網地址都無法通過candidate的acl規則,詳細原因還未展開,留待后續跟蹤。

 

總結

Freeswitch和WEBRTC對接簡單方便。

對於客戶來說,webrtc可以直接使用web瀏覽器發起呼叫,而不需要額外安裝任何軟件或插件,非常的友好。

希望fs和webrtc的發展越來越好。

 

空空如常

求真得真


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM