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参数就是拨号计划中的处理入口(其中包含了处理呼叫所需的信息)。

 

反过来,如果系统对拨打分机号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,并且观察这一简单的方法如何获得了巨大的成果。