其實,只要你吃透了前些章節(jié)的內(nèi)容,做 FreeSWITCH 級聯(lián)是沒有任何問題的。但這個問題還常常被眾網(wǎng)友問到,我就索性再寫一篇。
雙機級聯(lián)
假設你有兩臺 FreeSWITCH 機器, 分別為A和B,同樣IP分別為 192.168.1.A 和 192.168.1.B。每臺機器均為默認配置,也就是說在每臺機器上 1000 ~ 1019 這 20 個號碼可以互打電話。位于同一機器上的用戶稱為“網(wǎng)內(nèi)用戶”,如果需要與其它機器上的用戶通信,則其它機器上的用戶就稱為“網(wǎng)外用戶”。
現(xiàn)在你需要在兩臺機器之間的用戶互撥,因此你想了一種撥號方案。如果A1000想撥打B1000,則B1000相對于A1000來說就是“網(wǎng)外用戶”。就一般的企業(yè)PBX而言,一般撥打外網(wǎng)用戶就需要加一個特殊的號碼,比方說“0”。這樣,“0”就稱為“出局字冠。
好了,我們規(guī)定,不管是A用戶還是B上的用戶,撥打外網(wǎng)用戶均需要加0. 下面我們僅配置A打B,把B打A的情況留給讀者練習。
在A機上,把以下 dialplan 片斷加到 default.xml 中:
<action application="bridge" data="sofia/external/sip:$1@192.168.1.B:5080"/>
其中,expression= 后面的正則表示式表示匹配以0開頭的號碼,“吃”掉0后,把剩下的號碼送到B機的5080端口上。
所以,如果用戶1000在A上撥 01000,將會發(fā)送 INVITE sip:1000@192.168.1.B:5080 到B上。B收到后,由于5080端口默認走public dialplan,所以查找 public.xml,找到1000后將電話最終接續(xù)到B機的1000用戶。
除了SIP外,我還在兩臺機器上分別加了兩塊E1板卡,中間用交叉線直連,這樣的話,我希望撥9開頭就走E1到對端,設置如下:
<action application="bridge" data="freetdm/1/a/$1"/>
匯接模式
| 匯接局 X |
/ | \
/ | \
A B C
其實你搞定了第一種模式以后,這種匯接模式也就很簡單了。無非你需要動一動腦子做一下?lián)芴栍媱,比方說到A撥0,B撥1,到C撥2之類的。然后在匯接局配置相關的 dialplan 就OK了。
遇到 dialplan 的問題還是再看一下第八章,還是那句話,使用 F8 打開詳細的 LOG,打一個電話,從綠色的行開始看。
安全性
上面的方法只使用5080端口從 public dialplan 做互通,而發(fā)送到5080端口的INVITE是不需要鑒權的,這意味著,你任何人均可以向它發(fā)送INVITE從而按你設定的路由規(guī)則打電話。這在第一種模式下問題可能不大,因為你的public dialplan 僅將外面的來話路由到本地用戶。但在匯接局模式下,你可能將一個來話再轉(zhuǎn)接到其它外部網(wǎng)關中去,那你就需要好好考慮一下安全問題了,因為你肯定不希望全世界的人都用你的網(wǎng)關打免費電話。
一般說來,解決這個問題有兩種方式,那就是讓所有來話都經(jīng)過認證鑒權后再進行路由(本地用戶發(fā)到5060端口上都是需要鑒權的)。
考慮雙機級聯(lián)的情況,你只需要在A上配置一個到B的網(wǎng)關(將下列內(nèi)容存成XML文件放到 conf/sip_profiles/external/b.xml):
<gateway name="b">
<param name="realm" value="192.168.1.B"/>
<param name="username" value="1000"/>
<param name="password" value="1234"/>
</gateway>
同時把A上的 dialplan 改成:
<action application="bridge" data="sofia/gateway/b/$1"/>
這樣,A上的用戶可以呼通所有B上的用戶,從B的用戶來看,好像所有電話都是從本機的1000這個用戶打進來的(這就是網(wǎng)關的概念,因為對于B來說,A機就相當于一個普通的SIP用戶1000。當然你從A上理解,B就是給你提供了一條SIP中繼,如果在B上解決了“主叫號碼透傳”以后,B就相法于一條真正的中繼了)。如果這么說理解有難度的話,想像一下B是聯(lián)通或電信的服務器網(wǎng)關,你是不能控制的,而它只給了你一個網(wǎng)關的IP,用戶名,和密碼,你把它配到你的A上,就可以呼通電信能呼通的任何固定電話或手機了。