Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

168.6. Asterisk (OpenSource Linux PBX that supports both SIP and H.323)

http://www.asteriskpbx.com/

168.6.1. Redhat/CentOS/RockyLinux/AlmiLinux

			
[root@netkiller ~]# dnf install asterisk asterisk-pjsip
			
		
			
[root@netkiller ~]# ls /etc/asterisk/
acl.conf              cdr.conf              dnsmgr.conf       modules.conf           say.conf
adsi.conf             cdr_custom.conf       dsp.conf          musiconhold.conf       sla.conf
aeap.conf             cdr_manager.conf      dundi.conf        muted.conf             smdi.conf
agents.conf           cdr_syslog.conf       enum.conf         osp.conf               sorcery.conf
alarmreceiver.conf    cel_beanstalkd.conf   extconfig.conf    phoneprov.conf         stasis.conf
amd.conf              cel.conf              extensions.conf   prometheus.conf        statsd.conf
ari.conf              cel_custom.conf       features.conf     queuerules.conf        stir_shaken.conf
ast_debug_tools.conf  cli_aliases.conf      followme.conf     queues.conf            telcordia-1.adsi
asterisk.adsi         cli.conf              http.conf         resolver_unbound.conf  udptl.conf
asterisk.conf         cli_permissions.conf  indications.conf  res_parking.conf       users.conf
ccss.conf             codecs.conf           logger.conf       res_stun_monitor.conf  vpb.conf
cdr_beanstalkd.conf   confbridge.conf       manager.conf      rtp.conf
[root@netkiller ~]#
			
		
			
[root@netkiller ~]# cp /etc/asterisk/asterisk.conf{,.original} 
			
		
			
[root@netkiller ~]# cp /etc/asterisk/extensions.conf{,.original} 

[root@netkiller ~]# cat /etc/asterisk/extensions.conf
[from-internal]
exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()
			
		
			
[root@netkiller ~]# cp /etc/asterisk/pjsip.conf{,.original}			
[root@netkiller ~]# cat /etc/asterisk/sip.conf
[general]
context=default

[6001]
type=friend
context=from-internal
host=dynamic
secret=unsecurepassword
disallow=all
allow=ulaw
			
		
			
[root@netkiller ~]# vim /etc/asterisk/pjsip.conf
[root@netkiller ~]# cat /etc/asterisk/pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[6001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
allow=gsm
auth=6001
aors=6001

[6001]
type=auth
auth_type=userpass
username=6001
password=unsecurepassword

[6001]
type=aor
max_contacts=1
			
		
			
[root@netkiller ~]# systemctl enable asterisk
[root@netkiller ~]# systemctl start asterisk
[root@netkiller ~]# systemctl status asterisk
● asterisk.service - Asterisk PBX and telephony daemon.
     Loaded: loaded (/usr/lib/systemd/system/asterisk.service; disabled; preset: disabled)
     Active: active (running) since Sat 2025-03-01 18:34:36 CST; 10s ago
   Main PID: 3321189 (asterisk)
      Tasks: 42 (limit: 100479)
     Memory: 32.3M
        CPU: 493ms
     CGroup: /system.slice/asterisk.service
             └─3321189 /usr/sbin/asterisk -f -C /etc/asterisk/asterisk.conf

Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] WARNING[3321189]: loader.c:2487 load_modules: Module 'app_>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] WARNING[3321189]: loader.c:2487 load_modules: Module 'app_>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: Error loading >
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: Error loading >
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: Failed to reso>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: res_stir_shake>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: cdr_syslog dec>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: Failed to reso>
Mar 01 18:34:38 netkiller asterisk[3321189]: [Mar  1 18:34:38] ERROR[3321189]: loader.c:2508 load_modules: res_http_media>
Mar 01 18:34:38 netkiller asterisk[3321189]: Asterisk Ready.
			
		
			
[root@netkiller ~]# ss -lnp | grep asterisk
u_str LISTEN 0      2                                                              /run/asterisk/asterisk.ctl 30717648               * 0    users:(("asterisk",pid=3322611,fd=5))

udp   UNCONN 0      0                                                                                 0.0.0.0:56265            0.0.0.0:*    users:(("asterisk",pid=3322611,fd=8))

udp   UNCONN 0      0                                                                                 0.0.0.0:4520             0.0.0.0:*    users:(("asterisk",pid=3322611,fd=17))

udp   UNCONN 0      0                                                                                 0.0.0.0:5060             0.0.0.0:*    users:(("asterisk",pid=3322611,fd=10))

udp   UNCONN 0      0                                                                                    [::]:43446               [::]:*    users:(("asterisk",pid=3322611,fd=9))			
			
		
			
[root@netkiller ~]# asterisk -rx "pjsip list auths"

  I/OAuth:  <AuthId/UserName.............................................................>
==========================================================================================

     Auth:  6001/6001

Objects found: 1			
			
		

168.6.2. 源码安装 asterisk-22

		
dnf install -y automake g++
dnf install -y svn
		
		
		
wget https://github.com/pjsip/pjproject/archive/refs/tags/2.15.1.tar.gz
tar zxvf 2.15.1.tar.gz 
cd pjproject-2.15.1
./configure
make dep
make
make install
ldconfig
ldconfig -p | grep pjsip
		
		
		
[root@production pjproject-2.15.1]# pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu 
09:40:24.622         sip_endpoint.c !.Module "mod-pjsua-log" registered
09:40:24.623         sip_endpoint.c  .Module "mod-tsx-layer" registered
09:40:24.623         sip_endpoint.c  .Module "mod-stateful-util" registered
09:40:24.623         sip_endpoint.c  .Module "mod-ua" registered
09:40:24.623         sip_endpoint.c  .Module "mod-100rel" registered
09:40:24.623         sip_endpoint.c  .Module "mod-pjsua" registered
09:40:24.623         sip_endpoint.c  .Module "mod-invite" registered
09:40:24.697             alsa_dev.c  ..ALSA driver found 2 devices
09:40:24.697             alsa_dev.c  ..ALSA initialized
09:40:24.697                  pjlib  ..select() I/O Queue created (0x236cb68)
09:40:24.702         sip_endpoint.c  .Module "mod-evsub" registered
09:40:24.702         sip_endpoint.c  .Module "mod-presence" registered
09:40:24.702         sip_endpoint.c  .Module "mod-dlg_even" registered
09:40:24.702         sip_endpoint.c  .Module "mod-mwi" registered
09:40:24.702         sip_endpoint.c  .Module "mod-refer" registered
09:40:24.702         sip_endpoint.c  .Module "mod-pjsua-pres" registered
09:40:24.702         sip_endpoint.c  .Module "mod-pjsua-im" registered
09:40:24.702         sip_endpoint.c  .Module "mod-pjsua-options" registered
09:40:24.702           pjsua_core.c  .1 SIP worker threads created
09:40:24.702           pjsua_core.c  .pjsua version 2.15.1 for Linux-5.14.1.171/x86_64/glibc-2.34 initialized
09:40:24.702           pjsua_core.c  .PJSUA state changed: CREATED --> INIT
09:40:24.702         sip_endpoint.c  Module "mod-default-handler" registered
09:40:24.702           conference.c  .Add port 1 (ringback) queued
09:40:24.702           conference.c  .Add port 2 (ring) queued
09:40:24.702           pjsua_core.c  SIP UDP socket reachable at 192.168.0.230:5060
09:40:24.702           udp0x23c2dc0  SIP UDP transport started, published address is 192.168.0.230:5060
09:40:24.702            pjsua_acc.c  Adding account: id=<sip:192.168.0.230:5060>
09:40:24.703            pjsua_acc.c  .Account <sip:192.168.0.230:5060> added with id 0
09:40:24.703            pjsua_acc.c  Modifying account 0
09:40:24.703            pjsua_acc.c  Acc 0: setting online status to 1..
09:40:24.703             tcptp:5060  SIP TCP listener ready for incoming connections at 192.168.0.230:5060
09:40:24.703            pjsua_acc.c  Adding account: id=<sip:192.168.0.230:5060;transport=TCP>
09:40:24.703            pjsua_acc.c  .Account <sip:192.168.0.230:5060;transport=TCP> added with id 1
09:40:24.703            pjsua_acc.c  Modifying account 1
09:40:24.703            pjsua_acc.c  Acc 1: setting online status to 1..
09:40:24.703           pjsua_core.c  PJSUA state changed: INIT --> STARTING
09:40:24.703         sip_endpoint.c  .Module "mod-unsolicited-mwi" registered
09:40:24.703           pjsua_core.c  .PJSUA state changed: STARTING --> RUNNING
09:40:24.703                 main.c  Ready: Success
>>>>
Account list:
  [ 0] <sip:192.168.0.230:5060>: does not register
       Online status: Online
 *[ 1] <sip:192.168.0.230:5060;transport=TCP>: does not register
       Online status: Online
Buddy list:
 -none-

+=============================================================================+
|       Call Commands:         |   Buddy, IM & Presence:  |     Account:      |
|                              |                          |                   |
|  m  Make new call            | +b  Add new buddy        | +a  Add new accnt.|
|  M  Make multiple calls      | -b  Delete buddy         | -a  Delete accnt. |
|  a  Answer call              |  i  Send IM              | !a  Modify accnt. |
|  h  Hangup call  (ha=all)    |  s  Subscribe presence   | rr  (Re-)register |
|  H  Hold call                |  u  Unsubscribe presence | ru  Unregister    |
|  o Toggle call SDP offer     |  D  Subscribe dlg event  |                   |
|                              |  Du Unsub dlg event      |                   |
|  v  re-inVite (release hold) |  t  Toggle online status |  >  Cycle next ac.|
|  U  send UPDATE              |  T  Set online status    |  <  Cycle prev ac.|
| ],[ Select next/prev call    +--------------------------+-------------------+
|  x  Xfer call                |      Media Commands:     |  Status & Config: |
|  X  Xfer with Replaces       |                          |                   |
|  #  Send RFC 2833 DTMF       | cl  List ports           |  d  Dump status   |
|  *  Send DTMF with INFO      | cc  Connect port         | dd  Dump detailed |
| dq  Dump curr. call quality  | cd  Disconnect port      | dc  Dump config   |
|                              |  V  Adjust audio Volume  |  f  Save config   |
|  S  Send arbitrary REQUEST   | Cp  Codec priorities     |                   |
+-----------------------------------------------------------------------------+
|  q  QUIT      L  ReLoad       I  IP change     n  detect NAT type           |
|  sleep MS     echo [0|1|txt]                                                |
+=============================================================================+
You have 0 active call
>>> 		
		
		
			
cd /usr/local/src/
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
tar zxvf asterisk-22-current.tar.gz	
cd asterisk-22.3.0/

contrib/scripts/get_mp3_source.sh
contrib/scripts/install_prereq install

./configure
make menuselect	
make -j2
make install

make samples
make basic-pbx

make config
ldconfig
			
		
		
cat >> /etc/default/asterisk <<EOF
AST_USER="asterisk"
AST_GROUP="asterisk"
EOF
		
		
		
sudo addgroup --quiet --system asterisk
sudo adduser --quiet --system --ingroup asterisk --no-create-home --disabled-password asterisk
usermod -a -G dialout,audio asterisk
		
		
		
sudo chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk
sudo chmod -R 750 /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk
		
		
		
systemctl enable asterisk
sudo systemctl start asterisk
		
		

		
5060/udp
10000:20000/udp
		
		

168.6.3. Ubuntu

			
netkiller@shenzhen:~$ apt-cache search Asterisk
asterisk-app-dtmftotext - Text entry application for Asterisk
asterisk-app-fax - Softfax application for Asterisk
asterisk-app-misdn-v110 - V.110 protocol handler for Asterisk
asterisk-chan-capi - Common ISDN API 2.0 implementation for Asterisk
asterisk-chan-misdn - mISDN support for Asterisk
asterisk-oh323 - oh323 channel driver for Asterisk
asterisk-prompt-de - German voice prompts for the Asterisk PBX
asterisk-prompt-es-co - Colombian Spanish voice prompts for Asterisk
asterisk-prompt-fr - French voice prompts for Asterisk
asterisk-prompt-it - Italian voice prompts for the Asterisk PBX
asterisk-prompt-se - Swedish voice prompts for Asterisk
asterisk-rate-engine - Asterisk least cost routing module
asterisk-sounds-extra - Additional sound files for the Asterisk PBX
destar - management interface for the Asterisk PBX
gastman - GUI tool for Asterisk administration and monitoring
iaxmodem - software modem with IAX2 connectivity
kiax - IAX VoIP softphone
libiax-dev - implementation of the Inter-Asterisk eXchange protocol (devel)
libiax0 - implementation of the Inter-Asterisk eXchange protocol
op-panel - switchboard type application for the Asterisk PBX
asterisk-prompt-es - Spanish prompts for the Asterisk PBX
asterisk - Open Source Private Branch Exchange (PBX)
asterisk-bristuff - Open Source Private Branch Exchange (PBX) - BRIstuff-enabled version
asterisk-classic - Open Source Private Branch Exchange (PBX) - original Digium version
asterisk-config - config files for asterisk
asterisk-dev - development files for asterisk
asterisk-doc - documentation for asterisk
asterisk-h323 - asterisk H.323 VoIP channel
asterisk-sounds-main - sound files for asterisk
asterisk-web-vmail - Web-based (CGI) voice mail interface for Asterisk
netkiller@shenzhen:~$
			
		

168.6.4. RasPBX – Asterisk for Raspberry Pi

http://www.raspberry-asterisk.org/

168.6.5. 配置文件

配置文件说明

		
asterisk.conf:主配置文件,通知Asterisk环境目录位置,包含其他所有配置文件所包含的目录,缺省Asterisk会在/etc/asterisk/目录下找到,也可以通过命令参数使用不同的asterisk.conf
agents.conf:配置代理通道
h323.conf:配置H323通道
iax.conf:配置IAX通道
mgcp.conf:配置MGCP(媒体网关控制协议,应用于多媒体网关单元之间)
modem.conf:配置ISDN,不是modem
phone.conf:配置linux电话设备
sip.conf:配置SIP通道,可以添加sip用户,设置用户名,密码,拨号规则等。
sip_notify.conf:配置SIP 消息通知
skinny.conf:配置Cisco SCCP通道
vpb.conf:配置Voicetronix卡通道(是澳大利亚的开放源码的CTI专业制造厂商)
zapata.conf:配置ZAP Digium卡通道
extensions.conf:Asterisk的具体拨号方案,它所有的操作控制和执行流程的主要方案,它控制呼入呼出如何别处理和路由。
extensions.ael:扩展拨号方案语言
features.conf:配置呼叫停泊,parking.conf文件名字已被修改为features.conf , 自定义按键配置,同时还有一些系统默认的功能键
extconfig.conf:通过res_data方式部署扩展配置,例如通过ODBC
alarmreceiver.conf:警报接收配置
enum.conf:电话号码映射查找配置
dundi.conf:分布式全球号码发现(DUNDi)是一个对等(P2P)协议,用于提供等价于那些由电子号码(ENUM)提供的服务。DUNDi有一个超过 ENUM的优点就是它更有弹力,因为也它缺乏一个故障中心点。DUNDi能够被用于增加DNS和它与IP语音(VOIP)服务一起发展。
festival.conf:文本语音转换配置
indications.conf:铃音清晰度配置
meetme.conf:会议配置
musiconhold.conf:音乐保持配置
queues.conf:队列配置
voicemail.conf:语音邮件配置,设置语音存储文件格式,分机号对应的语音邮箱密码和邮箱地址。
alarmreceiver.conf:警报接收配置
alsa.conf:致力于为Linux 提供高质量的声音子系统
cdr_odbc.conf,cdr_pgsql.conf:通话详单数据库存储配置
codecs.conf:Asterisk编码配置文件
dnsmgr.conf:DNS管理(new in Asterisk v1.2)
http.conf:内置http server配置,可以配置绑定的端口,可以访问的IP等。
logger.conf:配置系统日志
manager.conf:配置管理接口,设置管理员账号、密码、登录端口、访问权限等。
modules.conf:配置可加载模块
odbc.conf:ODBC驱动配置
oss.conf:open source software配置
privacy.conf:私密配置
res_odbc.conf:实时数据库加载配置,可以把配置文件放在数据库中
rpt.conf:循环应用配置
rtp.conf:配置RTP(实时)端口
say.conf:读出标准的数字和日期(new in Asterisk v1.4)
users.conf:用户定义配置文件
adsi.conf,asterisk.adsi,telcordia-1.adsi:配置模拟显示服务接口
capi.conf:CAPI是计算机辅助面对面访问(Computer Assisted Personal Interviewing)的简称,是使用基于计算机的问卷的一种调研技术,CAPI可以像CATI一样控制复杂的逻辑,而且,它可以在各种各样的场所使用,购物中心,论坛或者其它公共场所,只要是被访者可以接触到电脑的地方。例如,在定点街访项目,借助端对端网络,它可以从容的管理问卷,控制配额,以及管理数据库,且不需要数据库服务器。 在面对面访问中,问卷可以由访问人员直接采用电脑,被访者同时可以查看的方式进行访问,也可以是被访者自己的电脑上看到电子问卷,自己操作访问。
sirrix.conf:配置Sirrix ISDN通道
cdr_mysql.conf:配置通话详单在mysql中存储
prepaid.conf:预付费卡配置
ldap.conf:访问x.500目录访问的标准协议
bonjour.conf:苹果服务发现接口支持
enumagi.conf:电话号码映射查找配置文件
zeroconf.conf:zeroconf是一个轻量级的服务发现协议,适用于注册和寻找附近的可用协议、设备等等。 他是bonjour的开源名称,bonjour是苹果公司力推的一个service echotraining=yes   ;回音练习(会话前发个声音,用于测试回声)有关配置文件的语法规则,等以后再表。红色标出部分为自己首先要配置的部分。
		
		

168.6.6. 拨号规则设置

extensions.conf

			
[root@netkiller ~]# cat /etc/asterisk/extensions.conf
[from-internal]
exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()	
			
		
			
[from-internal]
exten => 10010,1,Dial(PJSIP/1111) /*当拨打10010时转到分机1111中*/
 
exten => 10086,1,Dial(PJSIP/6666) /*当拨打10086时转到分机6666中*/
 
exten => 110,1,Answer()  /*当拨打110时自动接听*/
same => Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()
			
		
			
asterisk -rx “core restart now”
asterisk -rvvvvv
			
		

168.6.7. pjsip

			
netkiller*CLI> pjsip show auths

  I/OAuth:  <AuthId/UserName.............................................................>
==========================================================================================

     Auth:  6001/6001

Objects found: 1

netkiller*CLI> 			
			
		
			
netkiller*CLI> dialplan show 6001@from-internal
There is no existence of 'from-internal' context
Command 'dialplan show 6001@from-internal' failed.
			
		
			
sip show peers
			
		
			
			
			
		

168.6.8. 配置例子

168.6.8.1. sip.conf

			
[root@netkiller ~]# cat /etc/asterisk/sip.conf
[general]
context=default
bindport=5060
tcpbindaddr=0.0.0.0
tcpenable=yes
externip=139.9.54.211
localnet=192.168.0.0/255.255.255.0;
nat=force_rport,comedia
canreinvite=no
qualify=yes
;directmedia=no
nat=yes
transport=udp


[6000]
type=friend
context=default
username=6000
secret=6000
host=dynamic
;transport=tcp
;transport=udp
;nat=yes
;directmedia=no
disallow=all
allow=ulaw
allow=alaw
allow=g722
allow=g729
;allow=h263
;allow=h264

[6001]
type=friend
context=default
username=6001
secret=6001
host=dynamic
;transport=udp
;nat=yes
;directmedia=no
disallow=all
allow=ulaw
allow=alaw
allow=g722
allow=g729
;allow=h263
;allow=h264

[6002]
type=friend
context=default
username=6002
secret=6002
host=dynamic
;transport=udp
;nat=yes
;directmedia=no
disallow=all
allow=ulaw
allow=alaw
allow=g722
allow=g729
;allow=h263
;allow=h264

[6003]
type=friend
context=default
username=6003
secret=6003
host=dynamic
;transport=udp
;nat=yes
;directmedia=no
disallow=all
allow=ulaw
allow=alaw
allow=g722
allow=g729
;allow=h263
;allow=h264

[6004]
type=friend
context=default
username=6004
secret=6004
host=dynamic
;transport=udp
;nat=yes
;directmedia=no
disallow=all
allow=ulaw
allow=alaw
allow=g722
allow=g729
;allow=h263
;allow=h264			
			
			
			
[root@netkiller ~]# cat /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no

[default]
exten => 6001,1,Dial(SIP/6001)

exten => 6002,1,Dial(SIP/6002)

exten => 6003,1,Dial(SIP/6003)

exten => 6000,1,Dial(SIP/6000)

exten => 6004,1,Dial(SIP/6004)			
			
			
			
			
			
			
			
			
			
asterisk -rx "core restart now"
			
			

168.6.8.2. pjsip.conf

			
[root@netkiller asterisk]# cat pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[6000]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=auth
aors=aors

[auth]
type=auth
auth_type=userpass
username=neo
password=chen

[aors]
type=aor
max_contacts=3

[6001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
allow=gsm
auth=6001
aors=6001

[6001]
type=auth
auth_type=userpass
password=6001
username=unsecurepassword

[6001]
type=aor
max_contacts=1

[6002]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=6002
aors=6002

[6002]
type=auth
auth_type=userpass
username=6002
password=unsecurepassword


[6002]
type=aor
max_contacts=2

[6003]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=6003
aors=6003

[6003]
type=auth
auth_type=userpass
username=6003
password=unsecurepassword

[6003]
type=aor
max_contacts=3