10 Asterisk 实际部署
Asterisk 部署笔记(2025-08-16)
环境信息
- 系统:Debian GNU/Linux 6.1
- 主机 IP:183.255.38.28
- 登录用户:sysadmin(切换至 root)
操作记录(部分)
su -
# 输入 root 密码
apt update && apt full-upgrade -y
mkdir -p /data/software/asterisk
cd /data/software/asterisk
apt clean
apt install -y build-essential git curl wget libedit-dev uuid-dev libjansson-dev libxml2-dev libsqlite3-dev libssl-dev subversion libncurses5-dev libnewt-dev unixodbc-dev libasound2-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libsrtp2-dev libspandsp-dev python3-dev
apt install -y build-essential wget git curl libncurses5-dev libssl-dev libxml2-dev uuid-dev libjansson-dev sqlite3 libsqlite3-dev
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-21.8.0.tar.gz
tar xzvf asterisk-21.8.0.tar.gz
cd asterisk-21.8.0/
./contrib/scripts/install_prereq install
make -j$(nproc)
make install
make config
ldconfig
service asterisk start
service asterisk status
Pjisip 配置和讲解
; =============================================================================
; 统一传输通道(单网口,限制仅内网使用)
; - 监听所有地址:0.0.0.0
; - local_net 仅允许内网段注册,禁止外网注册与媒体使用
; =============================================================================
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=172.9.9.0/24
;external_signaling_address=<YOUR_PUBLIC_IP>
;external_media_address=<YOUR_PUBLIC_IP>
; =============================================================================
; 外线中继(注册制)——xxxx-xxxxxx
; 说明:
; 1) registration 向 VOS 注册(使用内网 IP)
; 2) endpoint + aor 控制出站与媒体/信令策略
; 3) identify 兼容匹配 VOS 内网/公网来话源 IP
; =============================================================================
;用于定义注册或通话时所需的身份认证信息(用户名/密码),主要供:
;Asterisk 向 VOS 注册使用(即 registration 模块引用)
;或在呼叫过程中对端需要认证时使用(如 outbound_auth)
[auth-xxxxx]
type=auth ; 类型为认证
auth_type=userpass ; 使用用户名/密码方式认证
username=xxxxxx ; SIP 注册用户名(VOS 分配)
password=xxxxxx ; 对应的密码
;AOR(Address of Record)是 SIP 中逻辑“地址”,对应于可达的具体物理位置(即 contact URI)
;用来定义要注册到的 VOS 地址(内网),以及 Asterisk 向这个 AOR 发起请求。
;endpoint 对端通过 aors=aor-xxxxx 关联
;让 Asterisk 知道向哪个地址发 SIP 请求
[aor-xxxxx]
type=aor
contact=sip:xxx.x.x.xxx:5060 ; VOS 内网信令地址
max_contacts=1 ; 最多只允许一个联系点
qualify_frequency=60 ; 每 60 秒发一次 OPTIONS 检查对端可达性
qualify_timeout=3.0 ; 超时时间,超过视为不可达
remove_existing=yes ; 新注册到来时清除旧的 contact
;endpoint 对端通道段,用于定义与对端(VOS)通话时的 SIP 参数
;[reg-xxxxx]:注册成功后使用该 endpoint 发起或接收呼叫
;[trunk-xxxxx-identify]:来话识别匹配时绑定该 endpoint
[trunk-xxxxx]
type=endpoint
transport=transport-udp
context=from-carrier ; 来话匹配的 dialplan 上下文
disallow=all
allow=ulaw,alaw ; 启用音频编码
aors=aor-xxxxx ; 绑定的联系地址
outbound_auth=auth-xxxxxx ; 呼出时的认证账号
direct_media=no ; 禁止直接媒体(由 Asterisk 转发)
rtp_symmetric=no ; 关闭对称 RTP(适合内网)
force_rport=yes ; 强制使用返回端口(穿透 NAT 时重要)
from_domain=xxx.x.x.xxxx ; SIP 域头(重要!对 VOS 认证)
from_user=xxxxxxxxxx ; 来话主叫号码
send_pai=yes ; 发送 P-Asserted-Identity(主叫身份)
trust_id_outbound=yes ; 信任 PAI/FROM 主叫号码
user_eq_phone=yes ; 启用号码格式兼容(数字即为用户)
;定义来话源 IP 地址与哪个 endpoint 匹配。
;用于当 Asterisk 收到 SIP INVITE 等请求时,快速识别来源对应哪个 endpoint 配置。
;Asterisk 收到 INVITE 请求
;提取其来源 IP
;和 identify 配置的 match 进行比较
;若匹配,则使用绑定的 endpoint 处理该请求(即 trunk-xxxxx)
[trunk-xxxxxx-identify]
type=identify
endpoint=trunk-xxxxxx ; 匹配后关联的 endpoint
match=xxx.x.x.xxxx ; VOS 内网地址(优先匹配)
match=xxxx.xxxx.xxx.xx ; VOS 公网地址(备用匹配)
;用于向远端(VOS)注册本号码(xxxxxxx),以便能接收来话。
;启动后定时向 VOS 注册号码
;注册成功后,VOS 可将来话发到 Asterisk
;Asterisk 使用 endpoint=trunk-xxxxxx 来处理呼叫
[reg-xxxxx]
type=registration
outbound_auth=auth-xxxxxx ; 注册所用的账号密码
server_uri=sip:xxxx.x.x.xxxx:5060 ; VOS 的 SIP 注册地址(内网)
client_uri=sip:xxxxx@xxx.x.x.xxx
contact_user=xxxxxxx ; 注册的联系人标识(和电话号码一致)
transport=transport-udp
retry_interval=60 ; 注册失败后重试间隔
expiration=3600 ; 注册有效期(1小时)
line=yes ; 表示这是一个线路注册(可接来话)
endpoint=trunk-xxxxxxx ; 注册成功后对应的 endpoint
; =============================================================================
; 通用分机模板(在 include 之前,仅限内网使用)
; =============================================================================
[ext-template](!)
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw,alaw
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
max_audio_streams=1
max_video_streams=0
timers=no
; ===============
; 包含分机定义
; ===============
#include "pjsip_extensions_ceshi.conf"
一、来电(手机拨打号码 xxxxx -> 分机)
目标:外部手机拨打号码 xxxxx,呼入 Asterisk,再转接到内部分机
流程逻辑:
1. 注册成功:
[reg-xxxx] 完成向 VOS 的注册。
VOS3000 知道号码 xxxxx 已注册至 Asterisk。
2. 呼入触发:
外部用户拨打 xxxxx。
IMS → VOS3000 → 向 Asterisk 发起 SIP INVITE(可能来自公网 IP 或内网 IP)。
2.识别来源:
Asterisk 收到 INVITE 后,使用 [trunk-961996-identify] 匹配 match=xx.xx.xx.xx。
一旦匹配,就知道这通呼叫是来自哪个 endpoint。
3. 关联 endpoint:
根据 identify 的匹配结果,系统关联到 [trunk-xxxx] 这个 endpoint。
endpoint 中的 context=from-carrier 就决定了接下来如何处理这通来电。
4. 进入 dialplan:
呼叫进入 extensions.conf 中的 [from-carrier] 上下文。
你可以在此配置按来电号码分发到内部分机(例如通过 DID 匹配拨 xxxxx → 转 1001 分机)。
二、去电(分机拨打外部手机号码)
目标:内网分机拨打外部手机号码,由 Asterisk 通过 VOS3000 发出
流程逻辑:
1. 分机注册成功:
分机使用 PJSIP 注册,绑定的是你配置的分机段(如 [101](ext-template))。
注册进来的分机均是通过内网注册(受 local_net 限制)。
2. 拨打外部号码:
分机拨打手机号码,如 13800000000。
SIP INVITE 进入 Asterisk,根据分机的 context=from-internal 被送入 dialplan 的 [from-internal]。
3. Dialplan 中路由处理:
[from-internal] 匹配拨号规则,如:
[from-internal]
exten => _1[3-9]XXXXXXXXX,1,GoSub(callout-ims,s,1(${EXTEN}))
4. 调用外呼子程序:
GoSub(callout-ims,s,1(13800000000)) → 进入 [callout-ims] 上下文。
5. 子程序中指定外线出口:
[callout-ims] 中通常会包含如下 Dial:
exten => s,1,Dial(PJSIP/${ARG1}@trunk-xxxxx,,r)
这表示通过 trunk-xxxxx 这个 endpoint 发起 SIP 呼叫。
6. 使用中继出口:
[trunk-xxxx] endpoint 中配置了:
aors=aor-xxxxx → 知道要往哪里发(即 xxx.x.x.xxx:5060)
from_user=xxxxxx、from_domain=xx.x.x.xxx → 构造合适的 SIP 头
outbound_auth=auth-xxxxx → 带上正确的用户名密码进行认证
SIP INVITE 被送往 VOS 内网地址(aor 定义的 contact)
7. VOS 接收呼叫并转 IMS:
VOS3000 接收到 Asterisk 发起的 INVITE
根据配置(可能绑定 trunk 或号码前缀路由),将呼叫转发给运营商 IMS
最终成功拨通手机号码