跳至內容

Asterisk權威指南/第五章 用戶設備配置

維基教科書,自由的教學讀本

本章我們將研究連接到Asterisk的用戶設備,一般來說是某種形式的VoIP電話。在Asterisk中配置信道供設備使用相對來說比較簡單,但你也需要配置設備本身以使得它知道向誰發起呼叫(這已經跟Asterisk沒有關係了,每個硬件廠商都有自己的工具讓你配置設備的)。換句話說,配置一個設備分為兩個部分:1)告訴Asterisk關於設備的事情,2)告訴設備關於Asterisk的事情。

註:Asterisk跟SIP協議是什麼關係
SIP是一種P2P協議,儘管在有些配置中有服務器的概念(網關作為服務器), 但協議本身還是站在P2P的角度去看問題的。 這意味着SIP電話之間是直連的, 中間不經過PBX。 但實際情況是很多SIP會話是經過服務器的, 以Asterisk為例, PBX是所有連接的中心。 當通過Asterisk撥打SIP電話的時候, 實際上有兩個呼叫: 一個是從主叫設備到Asterisk, 另一個是從Asterisk到被叫設備。 Asterisk把兩個信道連接起來了。 從SIP電話的角度來說, 你需要把它配置成所有的呼叫都要通過Asterisk, 儘管它不通過Asterisk也能連接到其他SIP電話。 SIP很複雜也很靈活, 配置看起來會有點困難, 好在Asterisk並不需要那麼大的靈活性。

儘管大多數設備都有基於Web的參數配置界面,如果實際中有兩部以上的設備的話,我們建議使用基於服務器的配置過程,也就是說只需要在設備中配置文件服務器的地址。設備會找到並下載屬於自己的配置文件。比如說,從FTP服務器上下載XML文件。具體的下載過程和文件語法由設備生產商決定。本章主要是從Asterisk的角度來討論設備的配置問題。

電話命名的概念

[編輯]

在開始討論Asterisk的電話配置問題之前,我們先介紹一下有關電話命名的最佳實踐,以便將用戶、分機號和電話的概念區分開來。

在Asterisk中,系統唯一關心的是信道名。根本就沒有用戶的概念(實際上,Asterisk想在內部通過users.conf實現用戶和設備的分離;但是,一般只有Asterisk GUI用到它。通過撥號計劃在邏輯上區分更容易理解也更靈活),分機號則用於標識系統中的呼叫處理流程。例如,分機號100可以是呼叫一部電話,也可以是訪問一個語音信箱,播放一個語音提示,或者是加入一個電話會議。有可能分機100在上班時間呼叫一部電話,在休息時間呼叫另外一部電話。反過來,呼出電話在上班時間顯示一個主叫號碼,在休息時間顯示另外一個主叫號碼(很多前台到了夜間就變成了保安崗)。

Asterisk分機號
分機號是一個很關鍵的Asterisk概念。在大多數PBX中,一個分機號就是一組數字,用來呼叫一個電話或一個服務。對Asterisk來說,分機號是撥號計劃中一組指令的名字。把分機號看成腳本名就對了。分機號可以是一組數字,也可以是一個名字(例如voicemail)。整本書都會詳細討論分機號的問題,但在那之前我們需要先配置一些電話。

區別分機號和它所做的事情是Asterisk的一個重要特性,分機100的行為實際上是由一個腳本定義的。這一特性對「辦公桌輪用」一類的需求就更有意義了。

「辦公桌輪用」允許某人登錄一個設備,然後就可以從該設備接聽他的電話了。打比方,我們有三個銷售,一般都不在辦公室,但每個月都要花幾天時間回辦公室貼發票。考慮到他們不太可能同時出現在辦公室,與其給他們每人配一部電話,不如讓他們分享一部電話(或者更進一步,讓更大的一群人分享一組電話,比如說,三部電話)。這個場景就明顯要求把用戶/分機號和實際的電話設備區分開。

所以哪些名字不適合用來給電話命名呢?像人名,比如說[SimonLeBon],就不合適,因為Joan Jett和Rick Astley也可能用那部電話。同樣,用分機號給電話命名也不適合,比如[100],因為你將來可能會把它用於分機號160,或者讓多個人分享該部電話。出於安全方面的考慮,用數字帳號名也不好,這一點會在第26章 安全中詳細談到。

一種常用的方法是用設備的MAC地址給電話命名。該標識唯一,是跟着設備走的,跟用戶和分機號都沒有關係。很多公司處於資產管理的目的會給電話貼上條形碼和其他信息,只要這些信息是關於設備,而不是關於人的,也可以用來給電話命名。

如何給電話命名取決於你,我們主要是想把電話的概念跟它的所有者,甚至是位置分離開,因為這些不在Asterisk的控制範圍內,而且隨時會變。

本書用MAC地址表示電話。你可能有自己的選擇。

但是有一點,我們關於電話命名的建議不是出於技術上的限制。你想怎樣命名都可以,只要符合Asterisk的設備命名規範(字符、數字,不能有空格)。

硬電話,軟電話,和模擬電話適配器

[編輯]

有三種終端設備可以提供給用戶當成電話使用。他們是硬電話、軟電話和模擬電話適配器(ATA)。

硬電話是一種設備。它看起來像辦公室電話:它有聽筒、號碼按鍵等。它直接連接到網絡,也稱為VoIP電話。

軟電話是一種運行在台式機或筆記本上的軟件。語音要經過計算機的聲音系統,所以用這種軟件時一般用耳機效果會好些。最近也有了運行智能手機上的軟電話。軟電話的界面一般看起來像是普通電話,但不是必須的。

模擬電話適配器(ATA)使得傳統的模擬電話(或者其他模擬設備,像傳真機、無繩電話和尋呼機等)可以接入SIP網絡,一般是一個三明治大小的盒子,有一個RJ-11口(一般稱為FXS口)用來接電話機,一個RJ-45口用來接網絡,和一個電源口。有的ATA支持不止一個電話。

硬電話的優點是它在聲音方面的效果會好一些。一般質量好一點都會過濾環境噪音,保留人類語音,並調整波形。人們用傳統電話用習慣了,硬電話更容易被人接受些。還有,硬電話並不要求你打開計算機才能打電話。

缺點是,相對於很多免費的高質量軟電話來說,硬電話有點貴,也不好攜帶。另外,你的辦公桌可能不夠地方,又或者你並不總是待在一個地方。

軟電話解決了攜帶性的問題,你只要裝到你的筆記本或智能電話中就可以了。另外它的價格也很有吸引力(免費,或者30美元最多)。由於免費的緣故,你連接到Asterisk的第一個用戶設備可能就是軟電話。因為軟電話僅僅是一種軟件,表示它很容易安裝和升級,通常還包含一些使用外設的特性,像是用webcam進行視頻電話,又或者拿文件發傳真。

軟電話的缺點是它不太像一台設備,打電話時要戴上耳機,計算機有可能會時不時地執行一些後台任務導致CPU卡死。

ATA的優點是允許你把模擬設備接入SIP網絡,像無繩電話、尋呼機和響鈴器等。網絡不好的時候還可以接入老的線路。

ATA的缺點是有些SIP特性用不了。畢竟模擬電話技術有一百年了。

對於Asterisk來說,你選哪一種都不是問題,不管是硬電話、軟電話還是ATA。一樣的分機號可以呼叫桌面電話、筆記本上的軟電話、手機、甚至是閃光燈(有些地方響鈴器聽不見)。

配置Asterisk

[編輯]

本節我們將介紹如何在/etc/asterisk目錄中創建sip.conf和iax.conf文件,以定義SIP和IAX2設備和你的系統通訊所需的參數。

Asterisk允許設備以各種不同的協議和它對話(從而也包括設備之間的對話)。畢竟,SIP和IAX2協議是最歡迎也是最成熟的VoIP模塊,所以我們將專注於它們。如果是初次接觸Asterisk,你最好不要把別的協議攪和進來(像是Skinny/SCCP,Unistim,H.323,和MGCP),先把SIP和IAX2搞熟練了再說。其他協議的配置都是類似的,並且示例配置文件包含很多信息和例子,所以一旦你把基礎的東西搞定了,其他協議應該是很容易上手的。

信道配置文件,像是sip.conf和iax.conf,包含信道驅動(chan_sip.so、chan_iax2.so等)的配置,以及電話設備跟Asterisk聯繫(或交互)所需信息和憑據。

有關信道驅動的公用信息包含在位於配置文件頂部的[general]段中。所有段名是用方括號括起來的,設備名也是。段名(或設備名,對我們來說是一樣的)後面的所有東西都歸屬於該段。[general]段也能用於定義設備配置的缺省值,該值可以被設備段或模板中的值覆蓋。Asterisk也硬編碼了一下缺省值,所以儘管一些設置是必須的,另一些則可以忽略,只要你覺得缺省值沒問題的話。

Asterisk將會以下列順序檢查參數:
  1. 檢查設備段
  2. 檢查設備段的模板
  3. 檢查[general]段
  4. 使用硬編碼的缺省值
這表示說,沒有設置某個參數的值並不意味着該參數沒有設置。如果你不放心,你可以在設備段或模板中顯式設置某個參數。
往後面讀,這一概念你會有切實體會的。

信道配置文件是如何跟撥號計劃配合工作的

[編輯]

儘管我們還沒有討論過撥號計劃,如果能夠設想信道配置文件(sip.conf,ias.conf)和撥號計劃(extensions.conf)的關係的話,還是很有用的。撥號計劃是一個Asterisk系統的心臟:它控制呼叫邏輯是如何應用到信道中的連接的,比如當一個設備撥打分機號101時系統做什麼,當一個外部入局呼叫到達時系統做什麼,等等。信道配置文件和撥號計劃都參與系統的呼叫處理過程。圖 5.1,「sip.conf和extensions.conf的關係」用圖形化的方式表示了sip.conf和extensions.conf的關係。

當一個呼叫到達Asterisk時,系統先是找到該協議(該次呼叫所使用的協議)所對應的信道配置文件,然後找到該呼叫所對應的設備段。信道配置文件也會處理認證問題,以及定義撥號計劃中的處理入口。

一旦Asterisk確定了如何處理該呼叫,它會把呼叫控制交給撥號計劃中相應的上下文(context)。信道配置文件中的context參數就是撥號計劃中的處理入口(其中包含了處理呼叫所需的信息)。

Asterisk sip ext

反過來,如果系統對撥打分機號101的處理就是撥打另外一部電話的話,該撥號請求也會用到信道配置文件,以確定認證信息、編碼等。

要記住的關鍵點是信道配置文件不僅控制呼叫如何進入系統,也控制呼叫如何離開系統。所以,比方說,如果一部電話呼叫另一部電話,信道配置文件不僅用於把呼叫交給撥號計劃,也控制着如何把呼叫從撥號計劃交給目標設備。

sip.conf

[編輯]

SIP信道模塊無疑是Asterisk的信道模塊中最成熟和特性最豐富的。這是由於SIP的廣泛流行,它已經「接管」了VoIP/電信行業,並且已經在成千上萬的設備和PBX中實現了。如果你看一下Asterisk源代碼的./configs目錄中的sip.conf.sample文件,你會注意到有大量的選項可供使用。幸運的是,大多數選項都有缺省值,所以對於大多數標準SIP電話來說,你只需要創建一個非常簡單的配置文件就可以把它連接到Asterisk了。

你要做的第一件事就是在/etc/asterisk目錄下創建一個名為sip.conf的配置文件。

在該文件中粘貼或打入下列信息:

[general]
context=unauthenticated         ; default context for incoming calls
allowguest=no                   ; disable unauthenticated calls
srvlookup=yes                   ; enabled DNS SRV record lookup on outbound calls
udpbindaddr=0.0.0.0             ; listen for UDP requests on all interfaces
tcpenable=no                    ; disable TCP support

[office-phone](!)   ; create a template for our devices
type=friend         ; the channel driver will match on username first, IP second
context=LocalSets   ; this is where calls from the device will enter the dialplan
host=dynamic        ; the device will register with asterisk
nat=yes             ; assume device is behind NAT
                    ; *** NAT stands for Network Address Translation, which allows  
                    ; multiple internal devices to share an external IP address.
secret=s3CuR#p@s5   ; a secure password for this device -- DON'T USE THIS PASSWORD!
dtmfmode=auto       ; accept touch-tones from the devices, negotiated automatically
disallow=all        ; reset which voice codecs this device will accept or offer
allow=ulaw          ; which audio codecs to accept from, and request to, the device
allow=alaw          ; in the order we prefer

; define a device name and use the office-phone template
[0000FFFF0001](office-phone) 

; define another device name using the same template
[0000FFFF0002](office-phone)

打開你剛創建的sip.conf文件,我們會逐項解釋。

我們創建了四個段,第一個是[general]段。所有信道配置文件的頂部都有這麼一個標準段,命名也是固定的。[general]段包含和該協議有關的一般性配置選項,也可以用來定義缺省參數。

例如,我們把默認context定義為unauthenticated,以確保我們明確定義了如何處理未經驗證的呼叫。我們稱之為「unauthenticated」是為了讓它的功能顯而易見,呼叫進程在context中不被信任,因此不該讓它做一些類似於向PSTN打出出站呼叫(這有可能會需要付費,或盜竊身份代理)的事情。我們可以使用我們想使用的任何名字,但在這裡需要一個和在extension.conf中相同的名字來定義流向未經驗證呼叫方的呼叫。

下一個選項是allowguest,如果我們不想接受任何未經驗證的呼叫時這個選項就是禁用的。記住在某些信道你可能想接受未經驗證的呼叫。常用於允許通過統一資源標識符(URIs)——像是電子郵箱地址——撥號的公司來准許未經驗證的呼叫。如果我們想讓客戶從他們的電話打給我們而無需驗證,我們可以啟用訪客呼叫並在前一個選項定義的未經驗證選項中處理它們。

註:你可能在想你什麼情況下甚至會准許一個未經驗證的通話。如果你在你的商業名片上打印你的SIP URI(像是sip:leif.madsen@shifteight.org),你的未授权context简单的执行挂断的话是无法打通这个URI的。相反,你该在未经验证context中让入局呼叫进入一个受控的环境。你可能会希望允许这些呼叫,但你不必信任它们。

srvlookup選項用於啟用Asterisk查找DNS SRV的記錄,它基本用在出站連接服務提供商。我們將在12章中詳細的說明Asterisk和DNS這一知識。

udpbindaddr選項獲取一個IP地址或0.0.0.0的值然後告訴Asterisk它該偵聽的網絡接口,由UDP網絡傳輸協議(實際上它也是運載聲音信道的協議)攜帶的請求將從其中通過。如果定義的是0.0.0.0,就是讓信道驅動監聽所有可獲取到的接口。或者,我們可以通過定義IP地址為我們系統中的某一網絡接口來限制這一協議的VoIP連接到特定接口。

現在在Asterisk中udpbindaddr和tcpbindaddr選項都是一個要麼全選要麼指定一個的任務了。換句話說,如果在你的系統中有三個NIS,你就不能限制VoIP流經其中兩個:要麼只選一個,要麼它們三個全選。

IPv6在sip.conf中

在版本1.8中,Asterisk的SIP和RTP通信都支持IPv6了。在/etc/asterisk/sip.conf中的配置選項中涉及能接受無論是IPv4還是IPv6的地址。舉個例子,通過udpbindaddr選項中不同的值來實現:

udpbindaddr值 描述
192.168.100.50 綁定到特定IPv4地址
2001:db8::1 綁定到特定IPv6地址
0.0.0.0 綁定到系統上所以IPv4地址

tcpenable選項允許我們接受來自TCP網絡傳輸協議的請求。現在我們一般禁用它,因為UDP方法現在更成熟(也更流行)。我們儘可能的嘗試消除障礙。可以說,一旦你很好地配置了你的設備你可以隨便測試TCP支持。

註:還有tlsenable和tlsbindaddr選項用於啟用經由TLS協議的SIP(加密了SIP)。我們將在第七章談到加密SIP的配置。

下個section中我們定義了一個命名為[office-phone](!)的模板。我們創建它作為模板以便我們在所以設備中都能使用其中的值。

註:在section名後加(!)是告訴Asterisk將它作為一個模板處理。這樣做我們可以不用重複的添加改變每一個我們選擇定義的設備的配置選項。模板是非常有用的而且可以在所有Asterisk的配置文件中使用。如果你想要為單獨的提前在這個設備的模板中定義了的設備改變一些設置,你可以在section頭部做修改,它會覆蓋模板中定義的設置。使用模板並不是必須的,但它們很方便,我們也很廣泛的使用模板。

在[office-phone]模板我們定義了一些鑒權和使用這一模板控制呼入呼出設備需要的選項。我們配置的第一個選項就是type,設置為friend。這告訴信道驅動先去匹配名字再匹配IP地址。

SIP配置匹配和類型選項

在我們提供的示例中,SIP電話的配置是設置type=friend。你可以使用這兩種類型定義:user和peer。它們的不同之處在於Asterisk如何處理入局SIP請求匹配。規則如下表中所示:

type= Description
peer 使用源IP地址和端口號匹配入局請求到配置入口
user 使用SIP請求表單頭部的用戶名匹配入局請求到配置入口。這個用戶名和sip.conf某section中的方括號([])中的同一名字是匹配的。
friend peer和user兩種匹配規則都可以。它是SIP電話中設置得最多的選項。

當一個來自電話的請求被Asterisk接受和鑒權,被請求的分機號碼由設備配置中的context定義的撥號計劃進行處理。在我們的案例中,這個context叫LocalSets。

host選項用於當我們需要發送請求到電話(比方說我們想打給誰)。Asterisk需要知道設備在網絡的哪個位置。定義該值為dynamic,我們讓Asterisk知道電話會告訴我們它的網絡位置而不是靜態定義好它的地址。如果我們要靜態定義該地址,我們能把dynamic改成像是192.168.128.30的IP地址。

nat選項用於告訴Asterisk啟用一些技巧使一個SIP電話定位在NAT後面時電話能正常呼叫。這是很重要的功能選項,因為SIP協議在信息中包括了IP地址。如果一個電話在一個私用的網絡中,它可能會中斷定位在SIP信息中的私用地址,它會經常失效。

設備的密碼由secret參數定義。雖然不是嚴格要求,但你會發現很多討厭鬼們運行釣魚腳本查找暴露的使用不安全的密碼和簡單設備名的VoIP賬號(比如所設備名100密碼1234)。使用一個不常見的設備名如MAC地址和有點難猜到的密碼,我們能顯著地降低我們系統暴露在外面的風險

iax.conf

[編輯]

IAX2意為Asterisk內部交換協議(Inter-Asterisk eXchange protocol)版本2.IAX2是為簡化攜帶VoIP呼叫通過防火牆(通過攜帶信號和媒體通過同一連接)的進程以及讓穿過配置了NAT設備的網絡(這個問題一直困擾着SIP協議)更簡單而設計的。

Asterisk發展了有些年了,IAX2協議也變得成熟起來。一個RFC信息文件(RFC 5456 - IAX: Inter-Asterisk eXchange Version 2)在2010年發布了。然後,IAX2沒有在硬件廠商中流行起來,可能是因為IAX2 RFC相對來說太新了,但可以肯定的是,很大程度上可以歸因於SIP協議在大眾中的佔有率來說是最受認可的VoIP協議。(也就是,非專業人士更多的是聽說SIP而不是VoIP協議。)但是IAX2也有它值得探討的優點。

IAX最主要的優點就是單端口穿防火牆。所有流量,包括信號和音頻數據,通過一個單獨的UDP端口(默認端口號為4569)傳輸轉移,這能大大地簡化外部連接到Asterisk12的配置和排除故障。

IAX2的另一個優點是它的中繼兼容性,把語音幀封裝成相同數據包,使用同一個IAX2頭部。好處是減少了在兩個終端間發送一些同步呼叫時的頻寬開銷。IAX2中繼節省下來的頻寬數,在只是在地點間發送一對呼叫時是微不足道的,但當你開始擴展到數十甚至數百計的呼叫時,省下來的開銷就相當大了。

現在,我們只對獲得我們的能相互通信的IAX2終端所需的最低配置感興趣,所以讓我們開始探索如何在iax.conf中進行配置來實現這一功能吧。

因為IAX2更多地用於在Asterisk系統中建立中繼設備,我們準備提供這樣的一個例子(而不是在用戶設備使用IAX2的示例)。如果你有一個IAX2用戶設備(例如一個軟電話),你會發現熟悉sip.conf會幫助你在配置IAX.conf時處理分機。

首先,我們需要創建我們的iax.conf文件。注意因為示例是討論一個IAX中繼的,為了配置這個,你將需要兩個Asterisk系統,每一個都有一份工作着的撥號計劃。每個終端你都需要一個合適的iax.conf。在/etc/asterisk配置目錄創建一個名為iax.conf的文件, 然後添加如下配置信息:

 [general]
; don't stall for a long time if other endpoint doesn't respond
autokill=yes
; disable DNS SRV lookups for outbound calls
srvlookup=no
; ---------------------------------------------------
; template for IAX-based inter-office connections
[null [inter-office-trunk](!)]
 ; Asterisk will allow calls to and from this phone
type=friend
; the context where incoming requests will enter the dialplan
context=[null LocalSets]
delayreject=yes ; delay authentication reject (limit brute force attacks)
disallow=all ; reset the available voice codecs
allow=ulaw ; prefer the ulaw codec
allow=alaw ; but also allow the alaw codec
; ---------------------------------------------------
; define a trunk to our first location
[head-office](inter-office-trunk)
; a secure password -- which means DON'T USE THIS ONE!
secret=NuFuYhg4iHI
; Define the IP address of the Asterisk system at the
; other end of this connection
host=[ip address of far end]
; ---------------------------------------------------
; define another trunk using the same template
[branch-office](inter-office-trunk)
; a secure password -- which means DON'T USE THIS ONE!
secret=o8XBEf2DfQI
; IP address of Asterisk system at the other end
host=[ip address of far end]

註:在這個例子中使用LocalSets上下文來簡化一些東西。在生產環境中, 一般是要建立兩個相互獨立的上下文來處理你的中繼設備。只對安全性很重要,因為你必須使未授權的呼叫的風險降到最低。

來仔細查看我們添加到文件中的選項吧,開頭的是[general]小節。在這裡我們定義我們的默認配置,全局選項和常用信道驅動安裝。我們在這裡定義了很多選項,我們也建議你好好看看在你Asterisk資源的配置文件目錄下的iax.conf.sample文件,但因為我們要做的是簡單配置,就允許應用很多默認選項。下一節中我們定義了一個叫做[inter-office-trunk](!)的,它是一個包括了我們所有的IAX迴路中常用選項的範本。

就像在前一節中提到的,小節名後面跟隨的(!)告訴了Asterisk將這個小節作為一個範本對待。範本很有用,所以使用它們(!)。

我們在範本中配置的第一個選項是type。將type定義為friend,告訴Asterisk我們計劃撥打電話迴路和接受來自迴路的(呼叫)請求。

註:另外兩個type是user和peer。在IAX2,friend是user和peer的組合,這個屬性很常用因為局間中繼往往這兩種type的呼叫都會存在。我們也可以用相同的名字分別定義兩個類型為user和peer的小節,然後定義在每種類型中只定義所需的信息;或者如果我們只希望用一個小節來發送呼叫或者線上等待(例如在僅入站或僅出站的服務提供商這樣一個實例中),我們會只講它定義為一個user或一個peer。然而,在大多數情況下,直接使用friend的type是最合理的選擇。

注意在iax.conf於sip.conf中type選項含義的差別(在104頁查看「SIP設置和type選項」)。在iax.conf中,它的意義更簡單,只用來處理電話呼叫的方向。

在type選項後面,我們設置了host為dynamic,它意味着電話會動態地註冊它網絡上的位置(以便於我們知道向何處發送它的呼叫)。同樣,我們也可以靜態定義一個IP地址,例如192.168.128.50,所以呼叫都會被送往這個地址或者來自該地址的呼叫都會被接收(where all calls will be sent to and accepted from)。只有設備一直有相同的IP地址時這種方式的定義才會工作。

context選項定義了信道進入撥號計劃的上下文。當電話撥打了一個呼叫而Asterisk接受了請求,它會由撥號計劃(extensions.conf)中配置的context中的定義的邏輯進行處理。

delayreject=yes選項告訴Asterisk對因為驗證失敗而拒收的信息採用輕微延遲。目的是增強對暴力破解(它默認配置能在大約數秒的時間內發送數以百計的嘗試)的防護等級。

接下來是disallow和allow選項。它們定義了信道中採用的編碼解碼器(按偏好排列)。disallow=all的指令重置了所以可能在[general]小節(或者信道默認的部分)中開啟的默認編碼解碼器。然後,我們定義了我們准許使用的指定編碼解碼器。在我們的例子中我們明確地允許ulaw和alaw編碼解碼器。一般被推薦用於測試目的。

既然已經有了範本,我們現在就能為我們想要支持的每個終端創建指定信道定義。我們只需要指定範本中沒有被定義的那些參數。

我們命名了兩個信道,head-office和branch-office。你可以將你的信道命名為任何你想要的;然後記住因為我們使用了type=friend,信道的端點和迴路都需要用同樣的名字,因為需要是在兩個端點都合乎情理的名字。

我們分配了範本inter-office-trunk給兩個信道,它將自動分配範本中的所有參數給信道。

secret參數定義了密碼。

註:你應該確認你實行了一個安全的密碼,尤其是如果你計劃將你的系統向外界完全開放。不要用一些很傻的密碼例如1234,否則你會後悔的。嚴肅,我們沒有開玩笑,甚至不要用於實驗室。

對VoIP電話系統(不僅僅是Asterisk)的成功攻擊的數量正在上升,而且還會繼續變得糟糕。通常來說,成功的侵入都是因為密碼薄弱。如果你現在就養成了用強密碼的習慣,你會在未來有更多的防護。

註:你可以用網絡上可用的或者操作系統自帶的密碼生成器生成一個複雜的密碼。這是一個簡單的腳本,你可以在Linux shell中運行它即時地生成一個適合當做密碼的字符串:

$ dd if=/dev/random count=1 bs=8 2>/dev/null | base64 | sed -e 's/=*$//'

註:不要使用我們在示例中定義的密碼。可以確定的是,這本書出版不久後,它會變成暴力破解程序對你系統嘗試的第一個密碼。

最後,我們定義了遠端迴路的IP地址。我們選擇了硬編碼該示例中的IP地址,然後你也可以定義主機為dynamic,這將需要遠端向你註冊。這些就是關於IAX的配置了。

根據環境修改信道配置文件

[編輯]

我們的示例目前都是基於假設的設備名稱的。為了創造你環境中擁有的任何現實的信道,你會想要將sip.conf和iax.conf文件中的名字改為其他更有意義的。

例如,如果你有一個Polycom公司的IP 430,它的MAC地址設為0004f2119698,你會想要在sip.conf中為該設備定義設備識別碼:

[0004f2119698](office-phone)

註:在sip.conf中,你也可以加入描述值,之後在Asterisk控制台中運行sip show peers時可以看到它。比如:

[0004f2119698](office-phone)
description=Polycom IP670 Phone

         當你把東西描述成「Phone in John’s office」或者「Phone in Room 213」,現實是東西會到處搬動,所以最好是保證描述簡單並且是不怎麼會改變的某樣東西(比如說電話的型號是永遠不變的)。有些公司向設備分配了資產追蹤的標籤。這可能是個可以用於記錄一些細節的地方。

你可能也會考慮用description參數作為你範本的一部分(即,description=office-phone),你就可以在Asterisk控制台看到什麼範本設備在使用中了。

如果你在電腦上有一個IAX軟電話,你想要使用它,你的iax.conf文件可能要加入如下的內容:

[001b63a28ccc](office-phone)
secret=n4AgD7LURvg

記住你可以把你的設備命名成任何你想要的(Asterisk不關心),但為了管理方便,最好是選擇一個合理的可擴展的可持續利用的安全的(意思是:不要用分機數字作為信道名)命名慣例。

自帶Asterisk的Digium電話

[編輯]

Digium提供了一系列用於Asterisk工作的SIP電話。雖然它們都是標準的SIP電話,附加的用於Asterisk的DPMA(Digium電話Asterisk功能模塊)模塊允許了這些設備比其他的SIP電話更適用於Asterisk工作。DPMA的自動配置設定也更簡單。

DPMA是一個用於Asterisk系統和Digium電話建立安全連接的專有技術。DPMA的優點是對用戶設備的配置十分簡單,以及啟用DPMA的套裝能更緊密地集合Asterisk特徵。特定的Asterisk集成由DPMA啟用,包括:

• 一個簡化的配置進程。電話自動探索Asterisk服務器並下載配置。

• 新增的電話聯繫方式能儲存在Asterisk服務器上。

• 集合了如下功能:語音郵件,字典,停機,呼叫記錄,呼叫隊列等待。

• 加強了用戶體驗支持

• 可以寫入運行在電話上的Javascript語言編寫的自定義應用。寫入時的兼容性還在測試中,但它肯定是一個非常強大的附加功能。

關於如何設置DPMA的具體文件可以在Digium維基上查找到。

裝載信道配置文件

[編輯]

Asterisk命令行界面

[編輯]

了解你的Asterisk系統發生了什麼的最好辦法是利用Asterisk CLI。Asterisk CLI接口提供了幾個不同的輸出級別以便於你了解你的系統上究竟發生了什麼,並且提供了豐富而有用的實用程序以使得你能影響你運行中的Asterisk系統。讓我們從喚醒你的Asterisk CLI並為你的channel modules加載配置文件開始:

$ sudo asterisk -r
*CLI> module reload chan_sip.so
*CLI> module reload chan_iax2.so 

核實你的新信道已經加載完畢:

*CLI> sip show peers
*CLI> sip show 
*CLI> iax2 show peers
*CLI> iax2 show users

現在,你的Asterisk系統應該已經被配置好可以處理你的電話設備的註冊了。直到註冊完成,這些電話設備才能打出或接聽電話。由於每種電話設備各有不同,配置電話設備的具體細節不是本書的主要內容。

測試,確認設備已註冊

[編輯]

一旦你的電話設備成功註冊到 Asterisk,你就可以通過 Asterisk CLI 查詢這個電話設備的 地址和狀態。

關於註冊(registration)的一個常見的誤解是,認為註冊是指一個設備通 過認證,從而獲得呼出電話的權限。這是錯誤的看法。認證的唯一作用是 允許設備標明它在網絡中的地址,因此 Asterisk 就可以知道如何向它發送 與其相關的呼叫。 呼出電話的認證是一個完全獨立的過程,並且在每次呼叫時都會發生,而 不管它是否成功註冊。這就意味着你的電話可能能呼出,但不能呼入。這 一般發生在設備沒有成功註冊時(所以 Asterisk 不知道它的網絡地址), 但它依然可以正確的認證(因此 Asterisk 可以接受它發出的呼叫)。

為了檢查設備的註冊狀態,首先喚醒Asterisk CLI:

sudo asterisk -r

輸入如下命令,則返回Asterisk所有已知設備的列表(不管其狀態如何):

*CLI> sip show peers
Name/username               Host    Dyn Nat ACL  Port Status
0000FFFF0001/0000FFFF0001 192.168.1.100 D  N  5060 Unmonitored
0000FFFF0002/0000FFFF0002 192.168.1.101 D  N  5060 Unmonitored       

你可能注意到Name/username字段不總是顯示設備的全名。因為這個字段限制在25字符內。

類比電話

[編輯]

有兩種方法可以將類比電話連接到Asterisk系統。一個方法是使用ATA,這是最通常使用SIP協議連接Asterisk的方式。為ATA做的Asterisk配置與為任何基於SIP的電話機做的一樣。另一個方法是利用諸如Digium這樣公司生產的電話板卡,直接把類比電話連接到Asterisk服務器上。Digium銷售的電話板卡可以增加到你的服務器上並提供FXS接口用於連接類比電話(或傳真機)。出於說明配置的目的,我們將以Digium AEX440E卡為例進行說明。AEX440E是由AEX410半長PCI-e卡再加上4個FXS模塊組成的,AEX440E支持硬件回聲抵消。

無論你使用那種硬件,請翻閱廠商文檔查找詳細硬件配置要求。

首先,確保Asterisk和DAHDI都被安裝好了(參考第三章)。注意DAHDI必須在你安裝Asterisk之前安裝。當你安裝DAHDI時,請確保也安裝了init腳本。這是為了保證當系統啟動時你的硬件能被正確的初始化。Init腳本可以從DAHDI-tools安裝包中安裝。

Init腳本利用/etc/dahdi/modules文件決定哪些modules會被加載以支持系統中安裝的硬件。Init腳本的安裝會嘗試自動配置這個文件,但你應該檢查這個文件以確保正確:

# Autogenerated by tools/xpp/dahdi_genconf (Dahdi::Config::Gen::Modules) on
# Tue Jul 27 10:31:46 
# If you edit this file and execute tools/xpp/dahdi_genconf again,
# your manual changes will be LOST.
wctdm24xxp

DAHDI需要的配置文件還包括:/etc/dahdi/system.conf。這個文件看起來如下所示:

# Specify that we would like DAHDI to generate tones that are
# used in the United States.
loadzone = us
defaultzone = us
# We have 4 FXS ports; configure them to use FXO signaling.
fxoks = 1-4

以上配置假設在美國使用。關於國際化的說明請參見第九章。

如果你所選用的板卡不支持硬件回聲抵消,則需要在/etc/dahdi/system.conf中增加一行以使能軟件回聲抵消:

echocanceller = mg2,1-4

MG2是推薦的回音抵消器,它包含在DAHDI發行包的正式版本中。我們還有另外一個開源的回聲抵消器可供選擇,叫做OSLEC(Open Source Line Echo Canceller)。很多用戶都報告說OSLEC的效果非常好。更多關於安裝OSLEC的信息,請參考網頁http://www.rowetel.com/blog/oslec.html

現在,我們利用init腳本來安裝適當的modules並初始化硬件:

$ sudo /etc/init.d/dahdi start
Loading DAHDI hardware modules:
wctdm24xxp:                                                  [ OK ]
Running dahdi_cfg:                                           [ OK ]

現在,DAHDI已經被配置好了,該進行Asterisk的相關配置了。一旦Asterisk安裝完成,確保chan_dahdi已經安裝。如果它沒有安裝,請檢查它是否在/usr/lib/asterisk/modules/下。如果它在那裡,編輯/etc/asterisk/modules.conf來加載chan_dahdi.so。如果chan_dahdi在硬盤上不存在,說明在Asterisk安裝前並沒有安裝DAHDI;請立即返回安裝DAHDI(參考第三章)。你可以通過下述命令檢查它的存在:

*CLI> module show like chan_dahdi.so
Module                 Description                    Use Count
chan_dahdi.so          DAHDI Telephony Driver         0
1 modules loaded

下一步,你必須配置/etc/asterisk/chan_dahdi.conf。這是chan_dahdi模塊的配置文件,是Asterisk和DAHDI間的接口。它看起來如下:

[trunkgroups]
; No trunk groups are needed in this configuration.
[channels]
; The channels context is used when defining channels using the
; older deprecated method. Don't use this as a section name.
[phone](!)
;
; A template to hold common options for all phones.
;
usecallerid = yes
hidecallerid = no
callwaiting = no
threewaycalling = yes
transfer = yes
echocancel = yes
echotraining = yes
immediate = no
context = LocalSets
signalling = fxo_ks ; Uses FXO signaling for an FXS channel
[phone1](phone)
callerid = "Mark Michelson" <(256)555-1212>
dahdichan = 1
[phone2](phone)
callerid = "David Vossel" <(256)555-2121>
dahdichan = 2
[phone3](phone)
callerid = "Jason Parker" <(256)555-3434>
dahdichan = 3
[phone4](phone)
callerid = "Matthew Nicholson" <(256)555-4343>
dahdichan = 4

你可以通過dahdi show channel CLI命令來檢查Asterisk已經加載的配置:

*CLI> dahdi show channels
Chan Extension Context Language MOH Interpret Blocked State
pseudo         default           default                In Service
1              LocalSets          default                In Service
2              LocalSets          default                In Service
3              LocalSets          default                In Service
4              LocalSets          default                In Service

獲取特定信道的更多的細節信息,你可以運行dahdi show channel 1.

用於測試設備的基本撥號計劃

[編輯]

我們並不打算現在深入討論 dialplan,但是一個基本的,可以幫助我們測試新註冊設備 的 dialplan 還是有幫助的。請將下述內容輸入到/etc/asterisk/extensions.conf 中:

[LocalSets]
exten => 100,1,Dial(SIP/0000FFFF0001) ; replace 0000FFFF0001 with your device name
exten => 101,1,Dial(SIP/0000FFFF0002) ; replace 0000FFFF0002 with your device name
exten => 102,1,Dial(DAHDI/1)
exten => 103,1,Dial(DAHDI/2)
exten => 104,1,Dial(DAHDI/3)
exten => 105,1,Dial(DAHDI/4)
exten =>200,1,Answer()
same => n, Playback(hello-world)
same => n, Hangup()

這個基本的 dialplan 可以允許你通過分機 100 和 101 撥打你之前配置的 SIP 電話機。而之前 安裝的模擬板卡的四個線路則可以通過分機 102 到 105 分別撥打。如果你撥打分機 200,你 會聽到一個 hello-world 提示音。所有這些分機都可以隨意編號,你可以用任何你想用的號 碼。這並不是一個完整的 dialplan,我們將在後續章節進一步完成它。

你需要重載你的 dialplan 以使修改生效。你可以在 Linux shell 下通過下述命令實現重載:

sudo asterisk -rx "dialplan reload"

或者在Asterisk CLI:

CLI> dialplan reload

現在,你可以在你新配置的兩個分機間撥打電話了。我們可以通過Asterisk CLI觀察通話過 程。你會看到類似下面這樣的信息(同時你呼叫的電話應該響鈴):

-- Executing [100@LocalSets:1] Dial("SIP/0000FFFF0001-0000000c",
"SIP/0000FFFF0001") in new stack
-- Called 0000FFFF0001
-- SIP/0000FFFF0001-0000000d is ringing

如果這些沒有發生, 你就需要重新檢查下你的配置文件了,請確保不要敲錯字。

內部原理:第一次呼叫

[編輯]

為了幫助你思考 Asterisk 到底是如何工作的,我們將簡述下當同一個 Asterisk 系統下的兩部分機利用 SIP 協議彼此呼叫時,到底發生了什麼。

請記住這裡實際發生了兩個呼叫:一個是從主叫分機到 Asterisk,另一個 是從 Asterisk 到被叫分機。SIP 是一個點到點的協議,並且從 SIP 協議的觀 點看,就是有兩個呼叫在發生。SIP 協議並不知道 Asterisk 在為這兩個呼 叫進行橋接。每個分機只知道它跟 Asterisk 連接,並不知道另一個分機的 情況。這就是 Asterisk 一般被歸為 B2BUA(Back to Back User Agent)的原 因。這也是為什麼 Asterisk 可以非常容易的將不同的協議橋接在一起的原 因。

對於你剛才進行的呼叫來說,會話流程如 Figure 5-2 中描述。 關於 SIP 協議如何工作的進一步詳細信息,請參考附件 B 和 SIP RFC 文檔 http://www.ietf/rfc/rfc3261.txt。

結束語

[編輯]

在本章中,我們學習了設備命名的最佳實踐是分離用戶、分機號碼,以及設備本身的概 念。並且學習了如何在 channel 配置文件中定義配置和認證參數。下一步,我們將深入研究 Asterisk 的神奇之處 —— dialplan,並且觀察這一簡單的方法如何獲得了巨大的成果。