概述
近幾年,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的發展越來越好。
空空如常
求真得真