ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Asterisk 1.4安装配置实战:SIP分机与拨号计划核心解析

Asterisk 1.4安装配置实战:SIP分机与拨号计划核心解析 简介一份面向运维人员与网络电话初学者的Asterisk安装配置指南主要解决在类Unix系统上从零搭建电话交换系统的问题。内容先介绍安装前的依赖套件准备再依次说明zaptel、libpri、Asterisk三个组件的下载、编译与安装过程随后以分机配置、拨号方案设定和远端管理账号创建作为核心给出主要配置文件中关键参数的注释说明方便读者理解每一项设置的作用。资源共1个PDF文件压缩包仅90KB轻量便携可离线查阅。目前已有101人学习使用。通过这份指南读者能够掌握Asterisk编译安装的基本流程理清分机注册、呼叫路由和管理接口的配置方法也可以参考其中的参数注释排查实际部署中的常见问题为后续构建小型呼叫中心或企业语音通信环境打下基础。1. Asterisk 1.4 安装与配置一份老配置单为什么现在还值得读做内部电话系统的人手里基本都有一份 Asterisk 的安装与配置笔记。这份 PDF 是 Asterisk 1.4.22 时代流传下来的完整操作单从 yum 装编译套件到 zaptel、libpri、Asterisk 三个源码包按顺序编译再到 sip.conf 加分机、extensions.conf 定拨号规则、manager.conf 开管理接口一条龙写到尾。版本虽然老但 SIP 分机、拨号计划、AMI 管理这些核心概念到 Asterisk 18/20 依然在用只是换了配置格式和模块名。适合两类人一类是在老旧 CentOS 机器上复原传统 PBX 场景的运维另一类是想把 VoIP 底层链路彻底搞懂的新手。照着这份文档能把一套内线互拨系统跑起来至于哪些步骤可以跳过、哪些参数实际会翻车后面几章按顺序说清楚。2. 源码编译三件套zaptel、libpri、Asterisk 的安装顺序与依赖坑2.1 三个源码包各管什么先装谁由依赖方向决定Asterisk 1.4 时代的源码安装不是只编译一个主程序而是三个包联动。zaptel 是内核级驱动模块负责和 Digium 及兼容的模拟卡、数字中继卡打交道它直接操作内核的 tty 和中断资源libpri 是 ISDN PRI主速率接口的信令协议栈处理 Q.921/Q.931 消息只有接 E1/T1 数字中继时才用到Asterisk 本体则是那个话务核心把 SIP、IAX、Zaptel 通道统一成 PBX 呼叫模型。编译顺序为什么必须是 zaptel → libpri → Asterisk因为 Asterisk 的 configure 脚本会在源码目录里找 libpri 和 zaptel 的头文件与库文件找得到才把对应通道编进去。你要是先装 Asterisk回头再补 libpri就得重跑一遍 configure 和 make纯属浪费生命。反过来如果手头只有 SIP 软电话、没有一块板卡zaptel 和 libpri 其实可以整段跳过——SIP 分机互拨完全不依赖这两个包。文档照单全收是求稳实际生产里我一般只装 Asterisk 本体中继网关用 SIP trunk 对接压根不碰内核驱动。2.2 依赖安装与下载编译的具体操作先装编译套件这一步在 CentOS 5/6 上几乎没有悬念yum install gcc gcc-c kernel-devel zlib zlib-devel openssl openssl-devel逻辑说明gcc/gcc-c 提供 C/C 编译器kernel-devel 提供内核头文件zaptel 要编成内核模块必须有和当前内核版本对应的头文件zlib 和 openssl 的开发包是 Asterisk 编译时链接用的Asterisk 的 RTP 和加密功能依赖它们。装完后建议确认一下内核头文件版本和 uname -r 对得上不然编译 zaptel 时头文件路径会对不上错误信息还很玄学。下载源码包统一放到 /usr/local/src这是源码编译的惯例目录cd /usr/local/src/ wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.22.tar.gz wget http://downloads.digium.com/pub/libpri/libpri-1.4.7.tar.gz wget http://downloads.digium.com/pub/zaptel/zaptel-1.4.12.1.tar.gz参数说明-1.4.22、-1.4.7、-1.4.12.1 这三个版本号是配对的Digium 当年按 Asterisk 1.4 分支同步维护不要自己随意混搭版本。wget 下完以后顺手 tar -tzf 看一眼包完整度sourceforge 时代的网络传输容易下出半截包解压时报 unexpected EOF 才知道要重新下浪费时间。zaptel 的编译和加载tar -zxvf zaptel-1.4.12.1.tar.gz cd /usr/local/src/zaptel-1.4.12.1 ./configure make make install modprobe zaptel逻辑说明./configure 检测内核版本并生成 Makefilemake 编译出内核模块和工具make install 把模块装到 /lib/modules/$(uname -r)/ 下modprobe zaptel 把模块载入内核。参数说明这里最容易踩坑的是 ./configure 阶段报找不到 kernel build 目录检查 kernel-devel 装没装、版本匹配不匹配。另外再说一次纯 SIP 场景 modprobe 失败也无所谓不影响 Asterisk 本体跑起来。libpri 的安装要简单得多tar -zxvf libpri-1.4.7.tar.gz cd /usr/local/src/libpri-1.4.7 make make install逻辑说明libpri 是纯用户态协议栈不涉及内核模块所以没有 configure直接 make。装完后 /usr/local/lib 下会有 libpri.soAsterisk 编译时靠它链接 PRI 通道。参数说明如果后面 Asterisk 的 configure 报告找不到 libpri先看是不是 libpri 的 make install 没有把头文件装到默认路径必要时用 ldconfig 刷新动态库缓存。最后是 Asterisk 本体tar -zxvf asterisk-1.4.22.tar.gz cd /usr/local/src/asterisk-1.4.22 ./configure make make install make samples逻辑说明./configure 期间会检测 libpri、zaptel 等可选依赖是否就位make 把源码编成二进制make install 安装到 /usr/lib/asterisk 和 /usr/sbin/asteriskmake samples 最关键生成 /etc/asterisk 下的全套示例配置包括 sip.conf、extensions.conf、manager.conf、iax.conf 等。没有这一步后面直接 vim /etc/asterisk/sip.conf 会发现文件根本不存在。参数说明make samples 覆盖式写入如果你已经手工改过配置它会用 .sample 后缀保留原文件不直接抹掉。2.3 首次启动前台调试模式与后台运行的差别asterisk -vvvc逻辑说明-c 表示前台控制台模式-v 叠加 verbose 日志级别-vvv 是三倍详细模式。这个模式适合第一次启动时观察模块加载情况看 SIP、PBX、RTP 这些模块是否都正常 init。看到 Asterisk Ready. 说明核心起来了CtrlC 退出。参数说明前台模式一退出 Asterisk 就停了不是生产运行方式。实际部署用 service asterisk start 或直接后台启动然后用 asterisk -r 连接已运行的实例。提示make install 之后系统里还没有 init 脚本CentOS 上常见做法是手动复制 contrib/init.d/rc.asterisk 到 /etc/init.d/asterisk 并 chkconfig 加入开机启动Asterisk 1.4 的源码包里自带这个脚本。3. SIP 分机配置逐个拆sip.conf 里的类型、认证与 NAT 参数3.1 一个能直接用的分机注册模板sip.conf 是 chan_sip 的配置文件方括号里是分机号每个 section 定义一个 SIP 端点。以下模板直接抄到 /etc/asterisk/sip.conf 末尾替换密码后就能用[101] callerid101 username101 typefriend secret101 qualifyyes natyes hostdynamic dtmfmoderfc2833 contextinternal canreinviteno callgroup0 pickupgroup0逻辑说明这是一条完整的 SIP 分机注册配置[101] 是账号标识也是分机号callerid 设置来电显示实际场景更常见写法是 callerid张三 101把名称和号码一起带出去typefriend 表示 Asterisk 既接受这台话机注册也能主动向它发起呼叫secret 是注册密码软电话和物理话机都用它认证contextinternal 把这台分机划入 extensions.conf 里的 [internal] 拨号组。参数说明callgroup 和 pickupgroup 不设也不影响基本通话它们是群组广播和代接用的普通内线互拨可以留 0。3.2 参数拆解与选型理由参数可取值作用备注typefriend / user / peerfriend 双向可用user 只接听peer 只发起话机一律 friendhostdynamic / IPdynamic 允许话机任意 IP 注册固定 IP 可写地址省注册包secret任意字符串分机注册密码弱密码是内网风险点qualifyyes / no周期性发送 OPTIONS 探测话机存活一般开 yesnatyes / no启用 NAT 穿透处理老版本参数新版本已拆细dtmfmoderfc2833 / inband / info按键信令传输方式默认 rfc2833context拨号组名关联 extensions.conf 的 section和拨号计划一一对应canreinviteyes / no是否允许媒体直连NAT 环境设 no 避免单通参数说明dtmfmode 原文档写作 dtmfmode正确拼法是 dtmfmode配置项大小写不敏感但拼写必须对写错 Asterisk 会直接忽略这一行按键识别就靠运气了。qualifyyes 会让 Asterisk 每 15 秒左右发一次 SIP OPTIONS 探测代价是寄存器里多出一点心跳流量但换来 Registration 状态实时可见排查问题方便很多。natyes 是 1.4 时代最容易被误解的参数。它告诉 Asterisk 按 SIP 包里的 rport 和 via 地址重写 SDP 连接信息让内网话机穿透 NAT 时能建立 RTP 媒体流。如果话机和 Asterisk 在同一个局域网natyes 和 natno 差别不大一旦话机在另一网段、中间有路由开着 natyes 能省掉一半的单通问题。canreinviteno 值得单独说。reinvite新版本叫 directmedia允许媒体流不经过 Asterisk 直接话机到话机节省服务器带宽。但 NAT 环境下 reinvite 经常导致双方拿到的 IP 是私网地址语音直接单通。所以内网环境可以开 yes跨网段一律 no让媒体流全部走 Asterisk 中转。3.3 注册状态验证sip show peers 与控制台登录配置写完之后重载并确认分机注册asterisk -r sip reload sip show peers逻辑说明asterisk -r 连接正在运行的 Asterisk 控制台sip reload 让 chan_sip 重新读 sip.conf已注册的分机不会掉线sip show peers 列出所有 SIP peer 及其状态。参数说明看到 Status 列是 OK (xx ms) 说明话机已注册且 qualify 探测正常Unmonitored 表示话机注册过但没开 qualify如果显示 UNKNOWN说明话机没注册上来需要回头查密码或网络。注意 sip show peers 只对 typefriend 或 typepeer 的条目有效typeuser 的要 sip show users 看。提示改 sip.conf 不要用 core reload 一把梭sip reload 只重载 SIP 模块比全量重载快得多也不影响正在进行的通话。4. 拨号规则怎么写extensions.conf 的匹配、跳转与重载4.1 拨号计划的最小单元exten、优先级与应用extensions.conf 是 Asterisk 的拨号路由表核心概念就三个exten匹配表达式、优先级同一表达式的执行顺序、应用要执行的动作。原文档给的配置[internal] exten _X.,1,Dial(SIP/${EXTEN}|30) exten _X.,n,Hangup()逻辑说明第一行表示在以数字开头的任意号码上执行 Dial 应用优先级 1第二行的 n 表示上一优先级加一继续执行 Hangup。整个逻辑是收到 101 拨 102 的请求 → _X. 匹配 102 → Dial 拨打 SIP/102 通道 → 振铃 30 秒无人接 → Hangup 挂断。参数说明X. 是 Asterisk 模式匹配语法表示后续是特殊字符X 匹配 0-9 任意一位. 匹配剩下的任意字符所以 101、102、3、8888 都能匹配进来。${EXTEN} 是系统变量保存的是实际拨出的号码Dial 把它拼成 SIP/102 这样的目标地址。30 是超时秒数也可以写成 30 之外的任意数字或者加参数改成带提示音和转语音信箱的流程。4.2 匹配规则的排布谁先匹配谁生效拨号计划是按顺序从上到下扫描的同一 context 内先写精确匹配再写模糊匹配。比如想要 800 开头的号码走特殊处理要放在 _X. 前面[internal] exten 800,1,Playback(hello) exten 800,n,Hangup() exten _X.,1,Dial(SIP/${EXTEN}|30) exten _X.,n,Hangup()逻辑说明800 精确匹配放在前面_X. 放在后面拨 800 时先命中精确条目播一段提示音后挂断拨其他任意号码则落到 _X. 走正常呼叫。参数说明Asterisk 按 exten 定义顺序从上到下匹配同一种 exten 的不同优先级用 n 连接。常见误用是把 _X. 写在 800 前面结果拨 800 也走 Dial精确号码永远路由不到。如果两台话机分属不同用户组可以在 sip.conf 里给分机指定不同 context再在 extensions.conf 里分别定义路由规则实现分机看不到、拨不出某些号码的效果。这是 context 最实用的场景话务员一个组、普通员工一个组各自独立路由逻辑。4.3 重载与验证dialplan show 和实际拨测asterisk -r dialplan reload dialplan show internal逻辑说明dialplan reload 重载 extensions.confdialplan show internal 列出 [internal] context 里所有有效路由规则用来确认 _X. 真的编进去了。参数说明dialplan show 输出里能看到 exten 的匹配模式、优先级和应用调用如果某条规则语法错了reload 的时候控制台会直接打 error 并把该规则跳过。最可靠的验证还是实际拨测——拿起分机拨 102看对方话机响不响。提示extensions.conf 里 context 名称必须和 sip.conf 里分机指定的 context 完全一致。拼错一个字母分机拨号时提示 Call can not be completed日志里报 no matching context这类问题排查起来最费时间。5. 常见问题排查编译失败、注册不上、拨不通的 5 个踩坑记录5.1 编译期报错zaptel 编不过内核模块现象./configure 通过make 时卡在 zaptel 的内核源码头文件报错比如找不到 linux/config.h 或某些结构体成员不存在。原因zaptel 1.4.12.1 是针对 2008 年前后内核写的CentOS 5 的 2.6.18 内核是它的主战场。一旦放到 CentOS 6 的 2.6.32 或更新的内核上部分内核 API 变了旧驱动代码直接编译失败。解决没有 Digium 板卡就走老版本之外的路——把 zaptel 和 libpri 整段跳过只编 Asterisk 本体纯 SIP 环境根本用不到它们。如果确实需要模拟卡支持常见做法是把 zaptel 换成它后继者 DAHDIAsterisk 1.4 后期版本已经开始兼容 dahdi 通道。别在旧代码上耗硬改内核源码性价比极低。5.2 modprobe zaptel 失败模块加载不进去现象make install 成功modprobe zaptel 报 FATAL: Module zaptel not found 或者插入时内核拒绝。原因zaptel 模块编译后的 .ko 文件和当前内核版本不匹配常见于 kernel-devel 装完没重启、内核更新过但没重编模块。解决先确认uname -r和 /lib/modules/$(uname -r)/build 目录存在且版本一致然后回到 zaptel 源码目录重新 make clean、make、make install。如果还是不行按 5.1 的判断直接放弃模块加载SIP 环境不需要它。5.3 分机注册不上sip show peers 一直显示 UNKNOWN现象软电话配置填好分机号、密码、服务器地址点击注册后几秒内掉线sip show peers 显示 UNKNOWN。原因八成是认证信息或网络问题。密码错会收到 401 后认证失败账号错是 404ACL 限制是 403。另外 dtmfmode 拼错这类配置项错误不会导致注册失败但质量检测和按键会有诡异表现。解决按顺序排查——先在软电话上打开 SIP 消息日志或 Asterisk 控制台里sip set debug on后重新注册观察响应码。401 查 secret404 查 username403 查 sip.conf 里的 permit/deny 段。hostdynamic 必须保留如果误写成 host192.168.1.x 且话机 IP 变了注册包直接被拒。5.4 内线互拨提示无法接通dialplan 匹配不到号码现象分机都注册 OK互相拨打时听到 Call can not be completed as dialed但 dialplan show internal 明明有 _X. 规则。原因最常见是分机的 context 和 extensions.conf 的 [internal] 名字对不上。sip.conf 里 contextinterna 少打个 l分机的来电被丢进默认 context而不是 [internal]。解决sip show peer 101看分机实际 context 是什么再和 extensions.conf 的 section 名逐一比对。这个坑的隐蔽点在于 Asterisk 不报错它只是静默地把呼叫路由到别的 context。其次是 Dial 里${EXTEN}拼写错误比如写成${EXTEN}}多了个括号目标通道变成 SIP/直接无效。5.5 能拨通但听不见声音单通或忽大忽小现象双方都接通了但只有一边能听到声音或者通话开始正常几秒后变单向。原因典型是 NAT 穿透问题。话机和 Asterisk 在不同网段时RTP 媒体流的 IP 端口协商失败一方把包发到了错误地址。canreinvite 开成 yes 又碰上 NAT 时媒体直连建立不起来也会单通。解决sip.conf 里把 canreinvite 全部设成 no确保媒体流经过 Asterisk 中转natyes 保持开启。然后用 tcpdump 或rtp set debug on抓 RTP 包的流向看媒体流实际到达哪个 IP。如果话机后面还有运营商 NAT防火墙要放行 UDP 10000-20000 的 RTP 端口段这是 Asterisk 默认的 RTP 端口范围。提示防火墙也是高频坑。Asterisk 默认走 UDP 5060 收 SIP 信令UDP 10000-20000 传 RTP 媒体流。iptables 没放行这两个范围注册可能没问题内网但外网通话要么不通要么单通。6. 用 Asterisk CLI 把系统跑通我固定的一套验证习惯改完配置不是重启就完事我习惯按固定顺序在控制台里把每一层确认一遍再让话机拨一次真实验证。先登录控制台asterisk -r core show version看到版本号确认连的是期望实例避免一台机器上起多个 Asterisk、改的文件和跑的进程不是同一个。然后按层次验证先sip show peers看所有分机是否都 OK再看dialplan show internal确认路由规则编译进了内存最后core set verbose 4打开详细日志实际拿起 101 拨 102。拨号过程中控制台会实时打出呼叫链路从 SIP/101-00000001 is ringing 到 SIP/102-00000002 is ringing再到 answered SIP/102-00000002。看到这两行说明 SIP 通道建立、拨号计划匹配、RTP 媒体协商全部通过。如果某一步断了日志里会给出具体原因比如 No matching context 或 Unable to create channel。有人觉得这套流程啰嗦毕竟电话能不能接通最终只有拿起话机拨一下才知道。但拨一次不响你只能拿到一个结果状态日志里却存着完整的调用链。有一次我改完 extensions.conf 没重载拨号一直转圈控制台里没有任何输出我下意识去看 /var/log/messages 里的 Asterisk 报错翻了几屏才意识到是忘了 dialplan reload——从那以后我每次改完配置都强制走一遍 sip reload、dialplan reload、再实际拨测而不是坐在那盯着配置文件怀疑人生。这套验证习惯帮我省掉的排障时间远比多敲两行命令多。这份 Asterisk 安装与配置的 PDF 正好把底层挂载、分机、拨号、管理接口串成了一条完整链路拿它配合控制台逐层验证希望帮到你。本文还有配套的精品资源点击获取
返回列表