Asterisk 22.11.0 配置参数详解
Asterisk 22.11.0 配置参数详解:asterisk.conf/pjsip.conf/rtp.conf/extensions.conf/logger.conf/modules.conf 核心参数逐项说明,新增分机 6002 与日志通道热重载即改即生效实测闭环。
Asterisk 22.11.0 配置参数详解
目标:逐项讲清 Asterisk 22.11.0 六大核心配置文件(asterisk.conf、pjsip.conf、rtp.conf、extensions.conf、logger.conf、modules.conf)的关键参数含义、默认值与改法,并给出「修改 → 热重载 → CLI 验证」的标准闭环。全部命令与回显均在 Ubuntu 22.04 x86_64 服务器的 Asterisk 22.11.0 实测采集;安装过程见 《Ubuntu 22.04 安装 Asterisk 指南》,组件定位与选型背景见 《Asterisk 22.11.0 介绍与选型指南》。
一、环境信息
本文所有命令与回显均在以下环境实测采集:
- 操作系统:Ubuntu 22.04 LTS(x86_64);
- Asterisk 版本:22.11.0(当前最新 LTS,源码编译安装,
make samples生成样例配置); - 配置目录:
/etc/asterisk,实测ls /etc/asterisk/*.conf | wc -l为 101 个 .conf 样例文件; - 运行用户:
asterisk(systemd 单元User=asterisk托管,服务名asterisk.service); - 信令端口:SIP/UDP 5060(pjsip.conf transport 监听);
- 媒体端口:RTP/UDP 10000-20000(rtp.conf 收窄后,默认 5000-31000);
- 日志目录:
/var/log/asterisk; - 示例分机:6001、6002(PJSIP endpoint,密码统一为测试口令
q1w2e3r4)。
二、前置条件
本章确认阅读与复现本文所需的环境基线:一台已安装 Asterisk 22.11.0 的 Ubuntu 22.04 服务器(完整安装步骤见 《Ubuntu 22.04 安装 Asterisk 指南》),且安装时执行过 make samples(样例配置是本文参数讲解的蓝本)。
先确认 Asterisk 可执行并能应答 CLI:
asterisk -V
实测回显:
Asterisk 22.11.0
确认服务处于托管运行状态:
systemctl is-active asterisk
实测回显:
active
确认样例拨号计划已加载(本文 5.4 节会用到 [from-internal] 这个定制 context):
asterisk -rx "dialplan show from-internal"
实测回显:
[ Context 'from-internal' created by 'pbx_config' ]
'6001' => 1. NoOp(demo call to 6001) [extensions.conf:892]
2. Dial(PJSIP/6001,20) [extensions.conf:893]
3. Hangup() [extensions.conf:894]
-= 1 extension (3 priorities) in 1 context. =-
💡 说明:以上三条命令都通过即可开始本文实验。
asterisk -rx "<命令>"的-r表示连接远程控制台、-x表示执行完即退出,是对运行中的 Asterisk 下发 CLI 命令的标准方式;-rx不穿透配置重载语义,重载必须显式执行(见 3.4 节)。
三、参数查看与修改方式
本章建立 Asterisk 配置管理的基本工作法:配置文件放哪、怎么读当前运行值、怎么改才能生效。Asterisk 的配置修改不会自动生效,必须配套执行对应模块的重载命令——这是它与多数「改完即生效」的现代软件最大的差异,也是初学者最常见的踩坑点。全部 CLI 命令的完整用法与实测回显另见 《Asterisk 22.11.0 常用 CLI 命令与工具详解》,本章只取与配置强相关的最小集。
3.1 配置文件的存放与构成
Asterisk 的全部配置集中在 /etc/asterisk 目录,由 make samples(源码安装)或软件包(apt 安装)生成。实测样例环境文件规模:
ls /etc/asterisk/*.conf | wc -l
实测回显:
101
配置文件采用 INI 风格语法,四条基本规则:
- 段(section):方括号包围,如
[general]、[6001]; - 键值:
key = value,段内一行一个;=>与=完全等价(拨号计划习惯用=>); - 注释:行首分号
;到行尾(与很多配置用#注释不同); - 模板段:段名以
(!)结尾表示「模板」,不会被加载生效,需其他段用use=模板名继承后再改写——pjsip.conf 批量定义分机时常用。
此外,多数文件的默认值都以注释形式写在样例文件里(如 ;verbose = 3),样例注释是官方维护的第一手参数文档,查参数含义时应优先读样例注释而不是上网搜。
3.2 用 CLI 查看参数运行值
改参数前先学会看「运行值」:文件里写的是期望值,真正生效的要看 CLI 的实时输出。最常用的查看命令分三层。
第一层:config list——哪些模块加载了哪些配置文件。
asterisk -rx "config list"
实测回显(输出节选,实测首尾;全量约 90 行):
core /etc/asterisk/acl.conf
res_adsi /etc/asterisk/adsi.conf
core /etc/asterisk/agents.conf
app_alarmreceiver /etc/asterisk/alarmreceiver.conf
...
pbx_config /etc/asterisk/extensions.conf
logger /etc/asterisk/logger.conf
manager /etc/asterisk/manager.conf
...
rtp /etc/asterisk/rtp.conf
core /etc/asterisk/modules.conf
app_voicemail /etc/asterisk/voicemail.conf
💡 说明:左列是加载该文件的模块名(
core表示主框架),右列是文件路径。据此可以反查「某个 conf 是谁在读」——例如改rtp.conf后要找rtp模块的重载命令。pjsip.conf在列表中会出现十余行(每类 PJSIP 对象各注册一次),属正常现象。
第二层:core show settings——内核级运行值总览。
asterisk -rx "core show settings"
实测回显(输出节选,实测首尾):
PBX Core settings
-----------------
Version: 22.11.0
Maximum calls: Not set
Maximum open file handles: 1024
Root console verbosity: 0
Debug level: 0
Maximum load average: 0.000000
Minimum free memory: 0 MB
Default language: en
Running directory: /var/lib/asterisk
...
* Directories
-------------
Configuration file: /etc/asterisk/asterisk.conf
Configuration directory: /etc/asterisk
Module directory: /usr/lib/asterisk/modules
Spool directory: /var/spool/asterisk
Log directory: /var/log/asterisk
Run/Sockets directory: /var/run/asterisk
PID file: /var/run/asterisk/asterisk.pid
VarLib directory: /var/lib/asterisk
Data directory: /var/lib/asterisk
ASTDB: /var/lib/asterisk/astdb
IAX2 Keys directory: /var/lib/asterisk/keys
💡 说明:这一屏是 asterisk.conf
[options]与[directories]两段参数的「运行值快照」——例如实测Maximum calls: Not set说明 maxcalls 未设置(样例默认注释),Maximum open file handles: 1024是未设置 maxfiles 时系统的默认软限制。5.1 节将逐项对照。
第三层:各子系统专属查看命令。 常用五个(回显见 5.x 各节详表):
| 查看对象 | 命令 |
|---|---|
| RTP 端口段与媒体设置 | rtp show settings |
| PJSIP 端点列表 | pjsip show endpoints |
| 单个端点全部参数 | pjsip show endpoint 6001 |
| 拨号计划某 context | dialplan show from-internal |
| 日志通道 | logger show channels |
3.3 修改参数的标准闭环(实测:新增分机 6002)
本节用「新增一个 PJSIP 分机 6002」演示改参数的完整动作序列:改文件 → 重载 → 验证。这套「三步走」适用于绝大多数配置变更。
步骤 1:向 /etc/asterisk/pjsip.conf 追加端点定义(PJSIP 每个分机由 endpoint/auth/aor 三类对象组成,语法详见 5.2 节):
;---- demo extension 6002 ----
[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6002
aors=6002
[auth6002]
type=auth
auth_type=userpass
username=6002
password=q1w2e3r4
[6002]
type=aor
max_contacts=2
步骤 2:向 /etc/asterisk/extensions.conf 的 [from-internal] context 追加拨号规则(语法详见 5.4 节):
exten => 6002,1,NoOp(demo call to 6002)
same => n,Dial(PJSIP/6002,20)
same => n,Hangup()
步骤 3:执行两个模块的重载命令(pjsip.conf 归 res_pjsip 模块族管,extensions.conf 归 pbx_config 模块管,各重各的):
asterisk -rx "pjsip reload"
实测回显:
Module 'res_pjsip.so' reloaded successfully.
Module 'res_pjsip_authenticator_digest.so' reloaded successfully.
Module 'res_pjsip_endpoint_identifier_ip.so' reloaded successfully.
Module 'res_pjsip_mwi.so' reloaded successfully.
Module 'res_pjsip_notify.so' reloaded successfully.
Module 'res_pjsip_outbound_publish.so' reloaded successfully.
Module 'res_pjsip_publish_asterisk.so' reloaded successfully.
Module 'res_pjsip_outbound_registration.so' reloaded successfully.
asterisk -rx "dialplan reload"
实测回显:
Dialplan reloaded.
步骤 4:CLI 验证新端点与新拨号规则都已生效:
asterisk -rx "pjsip show endpoints"
实测回显:
Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.>
I/OAuth: <AuthId/UserName...........................................................>
Aor: <Aor............................................> <MaxContact>
Contact: <Aor/ContactUri..........................> <Hash....> <Status> <RTT(ms)..>
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress..................>
Identify: <Identify/Endpoint.........................................................>
Match: <criteria.........................>
Channel: <ChannelId......................................> <State.....> <Time.....>
Exten: <DialedExten...........> CLCID: <ConnectedLineCID.......>
==========================================================================================
Endpoint: 100 Unavailable 0 of inf
InAuth: auth100/100
Aor: 100 2
Endpoint: 6001 Unavailable 0 of inf
InAuth: auth6001/6001
Aor: 6001 2
Endpoint: 6002 Unavailable 0 of inf
InAuth: auth6002/6002
Aor: 6002 2
Objects found: 3
asterisk -rx "dialplan show from-internal"
实测回显:
[ Context 'from-internal' created by 'pbx_config' ]
'6001' => 1. NoOp(demo call to 6001) [extensions.conf:892]
2. Dial(PJSIP/6001,20) [extensions.conf:893]
3. Hangup() [extensions.conf:894]
'6002' => 1. NoOp(demo call to 6002) [extensions.conf:895]
2. Dial(PJSIP/6002,20) [extensions.conf:896]
3. Hangup() [extensions.conf:897]
-= 2 extensions (6 priorities) in 1 context. =-
pjsip show endpoints 末行 Objects found: 3(6002 已出现)与 dialplan show from-internal 中 '6002' => 规则行,即本次闭环生效的判据。端点 State: Unavailable 表示尚无话机注册,属正常状态(见七、Q5)。
3.4 重载命令对照表
不同配置文件归不同模块管,重载命令不同。按 3.2 节 config list 查到的所属模块对号入座:
| 配置文件 | 查看运行值 | 热重载命令 |
|---|---|---|
| pjsip.conf | pjsip show endpoints | pjsip reload |
| extensions.conf | dialplan show <context> | dialplan reload |
| rtp.conf | rtp show settings | rtp reload |
| logger.conf | logger show channels | logger reload |
| modules.conf | module show | 无热重载,需重启服务 |
| asterisk.conf | core show settings | 无热重载,需重启服务 |
| 全部配置 | —— | core reload(按序重载全部可热重载配置) |
⚠️ 注意:上表的「热重载」边界有实测例外——pjsip.conf 的 transport 段参数(如 bind)用
pjsip reload不会生效,必须重启服务。实测过程与回显见七、Q1。动手改 transport 前请预留重启窗口。
四、参数总览
Asterisk 没有单一的「主配置」,而是按职责拆成上百个文件(样例环境 101 个 .conf,见 3.1 节)。日常运维真正高频打交道的是下面 11 个,按「框架 → 通道 → 媒体 → 拨号 → 可观测」分层:
| 配置文件 | 职责 | 代表参数 | 详解章节 |
|---|---|---|---|
| asterisk.conf | 目录布局与内核运行选项 | astetcdir、maxcalls、runuser | 5.1 |
| modules.conf | 模块加载白名单/黑名单 | autoload、noload、preload | 5.6 |
| pjsip.conf | SIP 信令:传输、端点、认证 | type=transport/endpoint/auth/aor | 5.2 |
| rtp.conf | RTP 媒体端口段与传输安全 | rtpstart/rtpend、strictrtp | 5.3 |
| extensions.conf | 拨号计划(呼叫路由逻辑) | context、exten、include | 5.4 |
| logger.conf | 日志通道与级别 | console、messages.log | 5.5 |
| manager.conf | AMI 管理接口(TCP 5038) | enabled、secret | —— |
| http.conf | 内置 HTTP 服务(AMI over HTTP / ARI) | enabled、bindport | —— |
| ari.conf | ARI REST 接口 | enabled、password | —— |
| voicemail.conf | 语音信箱 | 上下文与邮箱 | —— |
| sorcery.conf | PJSIP 对象存储后端映射 | 实时数据库接入 | —— |
关键差异与阅读建议:前 6 个是本文逐项详解的对象,覆盖一台「内网 IPPBX」约 90% 的日常配置面;后 5 个在启用对应功能(管理接口、语音信箱、数据库后端)时才需要动,样例默认即安全态(AMI/ARI 实测均为 Disabled,见 3.2 节 core show settings 的 Subsystems 区)。下文按 5.1-5.6 顺序展开。
五、核心参数分类详解
本章逐文件拆解参数。每个文件先给样例环境的真实配置片段,再逐项说明含义、默认值与修改影响,最后用 CLI 实测验证运行值。
5.1 asterisk.conf:目录布局与运行选项
asterisk.conf 是 Asterisk 的「框架自述」文件:前半段告诉它各目录在哪([directories]),后半段定义内核级行为开关([options]),末尾还有一个控制套接字权限的 [files] 段。样例文件共 154 行,绝大多数参数默认注释(即用内置默认值)。
(1)[directories] 目录布局。样例实值(/etc/asterisk/asterisk.conf):
[directories](!)
astcachedir => /var/cache/asterisk
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk
astsbindir => /usr/sbin
逐项说明:
- 段名
[directories](!):(!)表示这是模板段(见 3.1 节模板语法),编译期默认值与这里一致,因此不取消(!)也能生效——样例注释明确说明「编译内置默认值通常已够用」; astetcdir:配置目录,所有 .conf 的家;astmoddir:模块目录,module show列出的 .so 都在这里;astvarlibdir/astdbdir/astkeydir/astdatadir:可变数据、内置小数据库 astdb、密钥、声音文件的数据根,默认同在/var/lib/asterisk;astagidir:AGI 脚本目录(外部程序通过 AGI 协议参与呼叫控制时放这里);astspooldir:假脱机目录,录音、外呼任务、语音信箱暂存都在/var/spool/asterisk;astrundir:运行时套接字目录(asterisk.ctl控制套接字与 pid 文件所在)——B1 部署篇 systemd 单元里的RuntimeDirectory=asterisk就是为它服务的;astlogdir:日志目录;astsbindir:可执行文件目录。
改目录布局是整机迁移场景(如把日志挪到独立盘),单机部署不建议动。运行值可用 core show settings 的 Directories 区逐一核对(回显见 3.2 节,实测与上表完全一致)。
(2)[options] 内核运行选项。样例默认只启用了一项,其余全部注释:
[options]
;verbose = 3
;debug = 3
...
;maxcalls = 10 ; Maximum amount of calls allowed.
;maxload = 0.9 ; Asterisk stops accepting new calls if the
; load average exceed this limit.
;maxfiles = 1000 ; Maximum amount of openfiles.
;minmemfree = 1 ; In MBs, Asterisk stops accepting new calls if
; the amount of free memory falls below this
; watermark.
...
;runuser = asterisk ; The user to run as.
;rungroup = asterisk ; The group to run as.
...
documentation_language = en_US ; Set the language you want documentation
; displayed in. Value is in the same format as
; locale names.
...
;live_dangerously = no ; Enable the execution of 'dangerous' dialplan
; functions and configuration file access from
; external sources (AMI, etc.).
...
生产中值得关注的选项逐项说明(未列出的保持默认即可):
| 参数 | 默认 | 建议与影响 |
|---|---|---|
verbose | 0 | 控制台详细输出级别,CLI 可用 core set verbose N 临时调;生产保持 0,排障临时开 |
debug | 0 | 调试日志级别,量极大;样例 logger.conf 注释明确建议生产不要开 |
maxcalls | 不限制 | 全局最大并发呼叫数,超限新呼叫被拒;防话务风暴的保险丝,如设 10 |
maxload | 0.9 | 负载均值超过该值停止接新呼叫(0.9 = 90% 单核);小机器防过载 |
maxfiles | 系统限制 | 进程最大打开文件句柄数;大量注册/RTP 流时调高(实测未设置时运行值为 1024) |
minmemfree | 0 | 空闲内存低于该 MB 数停止接新呼叫;内存紧张的整机保险 |
runuser/rungroup | —— | 以 root 启动时的降权目标;systemd 单元已写 User=asterisk 时无需重复 |
documentation_language | en_US | 样例实值 en_US;core show application 等帮助文本的语言 |
live_dangerously | no | 允许 AMI 等外部通道执行 SHELL() 等危险函数与读外部配置文件;生产维持 no |
systemname | 空 | 集群/多实例场景的唯一命名,进日志与事件 |
💡 说明:以上每个参数的运行值都能在
core show settings输出中找到对应行(3.2 节实测:Maximum calls: Not set、Maximum open file handles: 1024、Debug level: 0),改完 asterisk.conf 需重启服务后复核——该文件不支持热重载(见 3.4 节表)。
(3)[files] 控制套接字权限。样例整段注释:
; Changing the following lines may compromise your security.
;[files]
;astctlpermissions = 0660
;astctlowner = root
;astctlgroup = apache
;astctl = asterisk.ctl
说明:asterisk.ctl 是 asterisk -r 远程控制台与本机管理工具连接的 Unix 套接字;默认权限 0660、属主 root。若让 Web 面板(如 FreePBX 的 asterisk 用户)直连套接字,才需要取消注释并精确放权——套接字拿到就能执行任意 CLI,权限务必最小化。
5.2 pjsip.conf:SIP 端点(transport/endpoint/auth/aor)
pjsip.conf 是 Asterisk 22 的 SIP 主配置,围绕四类对象组织。每类对象在文件里是一个段,用 type= 区分:
| type | 作用 | 本文示例 |
|---|---|---|
| transport | 监听哪个协议/地址/端口收发 SIP | transport-udp(UDP 5060) |
| endpoint | 一台话机/一条干线的 SIP 行为(编解码、入局 context、DTMF 等) | 6001、6002 |
| auth | 认证凭据(用户名/密码或 IP 认证) | auth6001 |
| aor | 注册落点:允许几个 contact、过期策略 | 6001(max_contacts=2) |
💡 说明:endpoint 与 auth、aor 是引用关系——endpoint 的
auth=auth6001指向认证段、aors=6001指向注册段;auth 与 aor 段可以与 endpoint 同名(靠type=区分),也可以独立命名。本文示例采用同名写法,文件最紧凑。
样例环境的完整 pjsip.conf(6001 部分实测全文,cat /etc/asterisk/pjsip.conf):
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[100]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=auth100
aors=100
[auth100]
type=auth
auth_type=userpass
username=100
password=q1w2e3r4
[100]
type=aor
max_contacts=2
;---- demo extension 6001 ----
[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001
[auth6001]
type=auth
auth_type=userpass
username=6001
password=q1w2e3r4
[6001]
type=aor
max_contacts=2
(1)transport 段逐项说明:
type=transport:声明传输对象;protocol=udp:SIP 信令承载协议;bind=0.0.0.0:5060:监听全部网卡的 5060 端口;只服务内网时可绑定具体内网 IP。
💡 技术拓展:SIP 信令的传输协议不止本文所用 UDP,常见取值对比——
protocol 特点 适用场景 udp 开销最小,报文超长会分片 内网、局域网话机(本文所用) tcp 可靠传输,报文长不受 MTU 限制 跨网段、SIP 消息带大头域 tls TCP + 加密(sips:),证书双向可验证 公网/跨分支信令加密 ws / wss WebSocket 承载,wss 为加密版 浏览器 WebRTC 软终端 本文因全部话机在同一内网、追求最小开销与排障直观(tcpdump 可见明文),采用 UDP;对外暴露或过公网时至少应切 TLS。
⚠️ 注意:transport 段的任何修改(含 bind、protocol)
pjsip reload不会生效,必须systemctl restart asterisk——实测证据见七、Q1。transport 变更会瞬断全部注册,安排维护窗口。
(2)endpoint 段逐项说明(以 6001 为例):
type=endpoint:端点对象;context=from-internal:该端点来电进入的拨号计划 context——决定「这台话机拨号后走哪套路由」,是 endpoint 与 extensions.conf 的连接点(见 5.4 节);disallow=all+allow=ulaw:先清空全部编解码再精确放行 ulaw(G.711 μ 律)——「先 disallow 再 allow」是控制编解码协商的标准写法;实际给话机用的编解码按对端支持调整(如内网带宽充裕用 ulaw/alaw,跨广域用 g722/gsm);auth=auth6001:引用认证段;aors=6001:引用注册段。
endpoint 可配置参数非常多(pjsip show endpoint 6001 实测输出上百项)。运行值查询:
asterisk -rx "pjsip show endpoint 6001"
实测回显(输出节选,实测首尾;全量约 150 行):
Endpoint: 6001 Unavailable 0 of inf
InAuth: auth6001/6001
Aor: 6001 2
ParameterName : ParameterValue
===================================================================================================
100rel : yes
allow : (ulaw)
allow_overlap : true
aors : 6001
auth : auth6001
callerid : <unknown>
context : from-internal
direct_media : true
dtmf_mode : rfc4733
identify_by : username,ip
media_encryption : no
moh_suggest : default
rewrite_contact : false
rtp_symmetric : false
rtp_timeout : 0
timers : yes
timers_sess_expires : 1800
transport :
webrtc : no
💡 说明:未在 pjsip.conf 写出的参数显示为内置默认值(如
dtmf_mode: rfc4733、direct_media: true)。生产内网 IPPBX 常按需追加的参数:callerid="张三" <6001>(外显号码)、direct_media=no(强制媒体过服务器,便于录音与穿越 NAT)、rtp_symmetric=yes(对端 RTP 地址对称回包,NAT 环境),以及下表的dtmf_mode。
DTMF(按键信号)承载方式是 endpoint 上最容易踩坑的参数之一:
💡 技术拓展:dtmf_mode 决定话机按键如何传给服务器,常见取值对比——
dtmf_mode 原理 适用场景 rfc4733 DTMF 用独立 RTP 事件包承载(默认,实测 6001 为该值) 绝大多数现代话机/软终端 inband DTMF 混在语音流里,靠 DSP 识别 个别老旧网关 info DTMF 走 SIP INFO 消息 与 rfc4733 不兼容的老设备对接 auto 自动在 rfc4733/inband 间协商 设备品牌杂、不好统一定时 本文环境话机均为标准软终端,沿用默认 rfc4733;出现「IVR 收不到按键」时先核对两端 dtmf_mode 是否一致。
(3)auth 段逐项说明:
auth_type=userpass:用户名/口令认证(另一种auth_type=md5传摘要不传明文);username=6001、password=q1w2e3r4:话机侧注册要填的账号口令(演示环境统一测试口令,生产请换强口令并配合 fail2ban 类防护)。
(4)aor 段逐项说明:
max_contacts=2:该分机最多同时注册 2 个 contact(如桌面话机 + 手机软终端同时在线);默认 1;- 注册过期等参数(
maximum_expiration、default_expiration)未配置时用内置默认(3600/60 秒)。
(5)列表与注册状态验证。全部端点一屏总览:
asterisk -rx "pjsip show endpoints"
实测回显见 3.3 节步骤 4(Objects found: 3,含 100/6001/6002)。transport 生效状态单独查:
asterisk -rx "pjsip show transports"
实测回显:
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress....................>
==========================================================================================
Transport: transport-udp udp 0 0 0.0.0.0:5060
Objects found: 1
5.3 rtp.conf:RTP 媒体端口与安全
RTP 承载通话的语音流。SIP 信令只在 5060 上「握手」,握手成功后两端在 RTP 端口段内动态协商端口互发语音——防火墙只放行 5060 是「能注册、单通/无音」的最常见原因。样例环境 /etc/asterisk/rtp.conf 的 [general] 段生效配置(B1 部署篇完成收窄):
[general]
;
; RTP start and RTP end configure start and end addresses
;
; Defaults are rtpstart=5000 and rtpend=31000
;
rtpstart=10000
rtpend=20000
逐项说明:
rtpstart=10000:RTP/RTCP 端口分配起点(默认 5000);rtpend=20000:分配终点(默认 31000)。并发一路通话约占用 4-8 个端口(RTP+RTCP、双向),10000-20000 万级段位足够 50 路并发,同时把防火墙放行面从 2.6 万端口压到 1 万。
运行值验证:
asterisk -rx "rtp show settings"
实测回显:
General Settings:
----------------
Port start: 10000
Port end: 20000
Checksums: Yes
DTMF Timeout: 1200
Strict RTP: Yes
Probation: 4 frames
Replay Protect: Yes
ICE support: Yes
STUN: disabled
Address: 0.0.0.0:0
回显其余字段对应的样例参数(默认注释即默认值)逐项说明:
| 运行值字段 | 对应参数 | 默认 | 说明 |
|---|---|---|---|
| Checksums: Yes | rtpchecksums | yes | RTP 包 UDP 校验和 |
| DTMF Timeout: 1200 | dtmftimeout | 3000(样例注释值)/1200(22.x 实际默认) | 无 end 标记的 DTMF 持续上限(采样数) |
| Strict RTP: Yes | strictrtp | yes | 学习期锁定合法 RTP 源地址,丢弃未知来源包(防 RTP 注入/窃听) |
| Probation: 4 frames | probation | 4 | 学习期需连续 4 个序列号正确的包才锁定源 |
| Replay Protect: Yes | srtpreplayprotection | yes | SRTP 重放保护 |
| ICE support: Yes | icesupport | false(样例注释)/ 实际启用 | ICE 候选交换,NAT 穿透用 |
| STUN: disabled | stunaddr | 未配置 | STUN 服务器地址(配置即启用) |
💡 技术拓展:NAT 后部署 Asterisk 时的媒体穿透手段不止一种,常见方案对比——
手段 原理 适用场景 端口段直通 防火墙放行 rtpstart-rtpend 服务器有公网 IP(首选,本文环境) STUN 服务器向外探测自己在 NAT 后的映射地址 服务器在 NAT 后且 NAT 为锥形 TURN 经中继服务器转发媒体 对称 NAT,STUN 失效时兜底 ICE 融合上述候选地址按优先级连通性检查 WebRTC 场景标配(rtp.conf 的 icesupport) 本文服务器内网直部署,采用「rtp 段收窄 + 防火墙直通」;上公网后再评估 STUN/TURN(rtp.conf 的 stunaddr/turnaddr 段)。
修改 rtp.conf 后执行 rtp reload(或重启服务),再用 rtp show settings 核对 Port start/Port end 即完成闭环(B1 部署篇实测:restart 后 Port start: 10000 / Port end: 20000)。
5.4 extensions.conf:拨号计划
extensions.conf 是 Asterisk 的「程序本体」:呼叫进来走哪个 context、按什么规则路由,全在这份文件里用 Asterisk 专用 DSL 描述。样例文件 894 行,包含 [general]、[globals]、二十余个演示 context 与本文环境定制的 [internal]/[from-internal]。
(1)[general] 段。样例生效的三行:
[general]
static=yes
writeprotect=no
clearglobalvars=no
逐项说明:
static=yes:拨号计划为静态文件,不由 CLIdialplan save回写;writeprotect=no:允许dialplan save命令回写文件(static=yes 时实际不落盘);clearglobalvars=no:重载时不清空 [globals] 变量(热重载追加变量时保留旧值)。
(2)[globals] 段。全局变量,可在所有 context 的拨号逻辑里引用:
[globals]
CONSOLE=Console/dsp ; Console interface for demo
TRUNK=DAHDI/G2 ; Trunk interface
TRUNKMSD=1 ; MSD digits to strip (usually 1 or 0)
逐项说明:CONSOLE 控制台通道演示值;TRUNK 出局中继通道(样例指向 DAHDI 组 2,接 PSTN 硬件线时改);TRUNKMSD 出局拨号剔除的位数。运行值验证:
asterisk -rx "dialplan show globals"
实测回显:
OUTBOUND-TRUNKMSD=1
OUTBOUND-TRUNK="Zap/g2"
CONSOLE-AEL="Console/dsp"
TRUNKMSD=1
TRUNK=DAHDI/G2
CONSOLE=Console/dsp
-- 6 variable(s)
💡 说明:列表里的
OUTBOUND-TRUNK、CONSOLE-AEL是样例环境附加配置(extensions.ael/其他样例)注册的同族变量,非本文件所写;Zap/是 DAHDI 的旧驱动名,仅样例演示用。
(3)拨号计划语法。核心三要素——context(场景分组)、extension(被叫号码或模式)、priority(执行步骤序号)。以本文定制段实测全文为例:
[internal]
exten => 100,1,Dial(PJSIP/100)
same => n,Hangup()
exten => 600,1,Playback(demo-congrats)
same => n,Hangup()
exten => 601,1,Playback(this-file-does-not-exist)
same => n,Hangup()
;---- demo dialplan for extension 6001 ----
[from-internal]
exten => 6001,1,NoOp(demo call to 6001)
same => n,Dial(PJSIP/6001,20)
same => n,Hangup()
exten => 6002,1,NoOp(demo call to 6002)
same => n,Dial(PJSIP/6002,20)
same => n,Hangup()
语法要点逐项说明:
exten => 号码,优先级,应用(参数):完整形态;优先级 1是入口;same => n,应用(参数):续接上一行的下一个优先级(n = next),避免手工编号;Dial(PJSIP/6001,20):呼叫 PJSIP 端点 6001,振铃超时 20 秒;NoOp(...):空操作,用于在 CLI 详细输出里留调试标记;Hangup():挂断,收尾习惯写法;- 特殊 extension:
s(无号码入口,如 [demo] 样例)、t(响应超时)、i(无效号码)——[demo] 样例实测含exten => t,1,Goto(#,1)与exten => i,1,Playback(invalid)。
(4)模式匹配。号码可写成模式(前缀下划线 _),样例真实存在(/etc/asterisk/extensions.conf 的 [trunkld]/[trunklocal] 段):
[trunkld]
exten => _91NXXNXXXXXX,1,Gosub(dundi-e164,s,1(${EXTEN:1}))
exten => _91NXXNXXXXXX,n,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}})
[trunklocal]
exten => _9NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}})
模式字符含义:X 任意 0-9、N 2-9、Z 1-9、. 任意长任意字符、! 非贪婪任意字符。_91NXXNXXXXXX 即「9 长途:1+3 位区号+7 位号码」的北美编号计划样例。${EXTEN:n} 从第 n 位起截取(:1 去掉首位 9)。
(5)include 与 context 复用。context 间用 include 引用,样例 [international] 段:
[international]
ignorepat => 9
include => longdistance
include => trunkint
说明:include => longdistance 让 [international] 继承 [longdistance] 的全部规则(层层传递,longdistance 又 include 了 local);ignorepat => 9 表示拨 9 后继续等号不立即出局。include 有顺序语义——先 include 的 context 优先匹配,出局权限按序放行是常见做法。
(6)拨号计划加载验证。extensions.conf 由 pbx_config 模块在启动与 dialplan reload 时解析(文件头注释原文:「This configuration file is reloaded - With the "dialplan reload" command in the CLI」)。逐 context 验证:
asterisk -rx "dialplan show internal"
实测回显:
[ Context 'internal' created by 'pbx_config' ]
'100' => 1. Dial(PJSIP/100) [extensions.conf:883]
2. Hangup() [extensions.conf:884]
'600' => 1. Playback(demo-congrats) [extensions.conf:885]
2. Hangup() [extensions.conf:886]
'601' => 1. Playback(this-file-does-not-exist) [extensions.conf:887]
2. Hangup() [extensions.conf:888]
-= 3 extensions (6 priorities) in 1 context. =-
[from-internal] 的回显见 3.3 节步骤 4。每行右侧的 [extensions.conf:行号] 直接给出规则在文件中的位置,排障时按行号去对文件即可。
5.5 logger.conf:日志通道
logger.conf 决定「什么级别的日志写到哪个通道」。样例文件 186 行,[general] 管全局行为,[logfiles] 定义通道。
(1)[general] 段常用参数(样例均处于注释默认态):
| 参数 | 默认 | 说明 |
|---|---|---|
dateformat | %F %T 样式 | 时间戳格式,可用 strftime(3) 说明符,%3q 加毫秒 |
use_callids | yes | 日志附带 Call-ID,按通话聚合排障必备 |
appendhostname | no | 文件名追加主机名,多机集中日志时开 |
queue_log | yes | 队列事件写 queue_log 文件(实测 /var/log/asterisk/queue_log 存在) |
rotatestrategy | sequential | 轮转策略:none/sequential/rotate/timestamp 四选一 |
exec_after_rotate | —— | 轮转后执行的系统命令(如压缩旧日志) |
logger_queue_limit | 1000 | 日志内存队列上限,超出丢弃(实测 logger show channels 首行显示 Logger queue limit: 1000) |
(2)[logfiles] 通道语法与样例实值:
console => notice,warning,error
messages.log => notice,warning,error
full.log => notice,warning,error,verbose
语法为 通道名 => 级别列表。通道名三种类型:console(主控制台)、syslog.local0(交给系统 syslog)、文件名(相对 astlogdir,也可写绝对路径)。可用级别清单(样例注释原文):debug、trace、notice、warning、error、verbose(<level>)、dtmf、fax、security、*(全部)。文件名前可加 [json]/[plain] formatter 指定输出格式(default 为人类可读,json 便于日志系统采集)。
(3)实测闭环:新增 full.log 通道。向 logger.conf 追加一行 full.log => notice,warning,error,verbose,热重载并验证:
asterisk -rx "logger reload"
实测回显(成功时无输出,直接返回提示符):
asterisk -rx "logger show channels"
实测回显:
Logger queue limit: 1000
Channel Type Formatter Status Configuration
------- ---- --------- ------ -------------
/var/log/asterisk/full.log File default Enabled - NOTICE WARNING ERROR VERBOSE
/var/log/asterisk/messages.log File default Enabled - NOTICE WARNING ERROR
Console default Enabled - NOTICE WARNING ERROR VERBOSE
新通道出现在列表(full.log 行,Configuration 含 VERBOSE)即生效。落盘验证:
ls -l /var/log/asterisk/
实测回显:
total 36
drwxr-xr-x 2 asterisk asterisk 4096 Oct 21 11:32 cdr-csv
drwxr-xr-x 2 asterisk asterisk 4096 Oct 21 11:26 cdr-custom
drwxr-xr-x 2 asterisk asterisk 4096 Oct 21 11:26 cel-custom
-rw-r--r-- 1 asterisk asterisk 117 Oct 21 17:06 full.log
-rw-r--r-- 1 asterisk asterisk 13785 Oct 21 17:06 messages.log
-rw-r--r-- 1 asterisk asterisk 268 Oct 21 17:06 queue_log
💡 说明:
full.log已由 Asterisk 以 asterisk 用户自动创建并开始写入。生产建议:messages.log(notice 以上)做日常巡检源;full/verbose 级通道只在排障期临时开,用完删行重载——verbose/debug 量极大,样例注释原文明确警告「debug and trace messages ... can and do fill up logfiles quickly」。
5.6 modules.conf:模块加载
Asterisk 功能以 .so 模块交付(约 400 个),modules.conf 决定加载哪些。样例生效配置(/etc/asterisk/modules.conf,51 行):
[modules]
autoload=yes
...
noload = res_hep.so
noload = res_hep_pjsip.so
noload = res_hep_rtcp.so
...
noload = app_voicemail_imap.so
noload = app_voicemail_odbc.so
指令逐项说明:
autoload=yes:加载全部模块,再按 noload 排除——样例默认策略,省心且功能全;noload = 模块.so:黑名单排除。样例排除的 5 个模块:res_hep 三件套(HEP/sipcapture 抓包上报,不用 HEP 监控就无需加载)、app_voicemail_imap/odbc(与默认 app_voicemail 互斥的语音信箱变体,样例注释说明「Load one of the voicemail modules as they are mutually exclusive」);load = 模块.so:与autoload=no配合做白名单加载(只加载列出者);preload = 模块.so:在内核初始化早期强载(样例注释说明现已基本无需);require = 模块.so:该模块加载失败则 Asterisk 以状态码 2 退出(关键模块强校验)。
黑名单生效验证(res_hep 已被排除):
asterisk -rx "module show like res_hep"
实测回显:
Module Description Use Count Status Support Level
0 modules loaded
对照验证 pjsip 模块族在正常加载(module show like pjsip 输出节选,实测尾段):
res_pjsip_transport_websocket.so PJSIP WebSocket Transport Support 0 Running core
res_pjsip_xpidf_body_generator.so PJSIP Extension State PIDF Provider 0 Running core
50 modules loaded
💡 说明:
autoload=yes+ 少量 noload 是生产默认推荐——策略简单、升级新版本不漏模块;对安全敏感的固定场景可改autoload=no白名单,但每次升级都要补新依赖模块,维护成本高。modules.conf 不支持热重载,改后需systemctl restart asterisk。
六、生产配置模板
以下模板整合本文全部实测参数,适用场景:内网 IPPBX,2 核 4GB 内存服务器、NVMe/SATA 盘均可(日志另计),50 分机以内、20 路并发以下,桌面话机/软终端 UDP 注册,编解码 ulaw,媒体端口收窄 10000-20000。五个文件逐个给出可直接复制的完整内容(账号口令为演示值 q1w2e3r4,生产请替换)。
(1)/etc/asterisk/pjsip.conf(内网分机 + UDP transport):
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001
[auth6001]
type=auth
auth_type=userpass
username=6001
password=q1w2e3r4
[6001]
type=aor
max_contacts=2
[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6002
aors=6002
[auth6002]
type=auth
auth_type=userpass
username=6002
password=q1w2e3r4
[6002]
type=aor
max_contacts=2
(2)/etc/asterisk/extensions.conf(在样例文件尾部追加内网互拨 context):
[from-internal]
exten => 6001,1,NoOp(call to 6001)
same => n,Dial(PJSIP/6001,20)
same => n,Hangup()
exten => 6002,1,NoOp(call to 6002)
same => n,Dial(PJSIP/6002,20)
same => n,Hangup()
(3)/etc/asterisk/rtp.conf(媒体端口收窄):
[general]
rtpstart=10000
rtpend=20000
(4)/etc/asterisk/logger.conf([logfiles] 段收敛为三通道):
[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
full.log => notice,warning,error,verbose
(5)/etc/asterisk/modules.conf([modules] 段排除不用的抓包与冗余语音信箱模块):
[modules]
autoload=yes
noload = res_hep.so
noload = res_hep_pjsip.so
noload = res_hep_rtcp.so
noload = app_voicemail_imap.so
noload = app_voicemail_odbc.so
应用与验证:文件写好后重启一次服务(modules.conf/asterisk.conf 类参数需重启,顺带覆盖全部文件):
systemctl restart asterisk
systemctl is-active asterisk
实测回显:
active
三项运行值复核(实测回显分别见 5.2 节 pjsip show endpoints/pjsip show transports、5.3 节 rtp show settings、5.5 节 logger show channels):端点 6001/6002 出现、transport 监听 0.0.0.0:5060、RTP 段 10000-20000、日志通道与模板一致,即部署闭环完成。
七、常见问题(FAQ)
Q1:改了 pjsip.conf 里 transport 的 bind 端口,pjsip reload 后不生效?
实测复现:把 bind=0.0.0.0:5060 改为 bind=0.0.0.0:5061 后执行 pjsip reload,回显仍全部 reloaded successfully,但运行值纹丝不动:
Transport: transport-udp udp 0 0 0.0.0.0:5060
Objects found: 1
解决:transport 段参数不支持热重载,必须重启服务。实测 systemctl restart asterisk 后:
Transport: transport-udp udp 0 0 0.0.0.0:5061
Objects found: 1
改回 5060 再次重启后恢复(实测已还原并确认 active)。结论:endpoint/auth/aor 交给 pjsip reload,transport 变更走重启并预留维护窗口。
Q2:想一次看全部 context,敲 dialplan show contexts 报错?
22.x 实测该命令不存在:
There is no existence of 'contexts' context
Command 'dialplan show contexts' failed.
dialplan show 后面跟的是具体 context 名,不是子命令。正确用法:dialplan show from-internal(单个,见 3.3 节回显);无参数的 dialplan show 输出全部 context(量大,建议配合 grep 过滤);全局变量另有 dialplan show globals(见 5.4 节回显)。
Q3:话机能注册、能打通,但单向无声或完全无声?
SIP 信令(5060)通了、RTP 媒体被拦。按序排查:① 核对防火墙放行 rtp show settings 显示的端口段(实测 Port start: 10000 / Port end: 20000,需放行 UDP 10000-20000);② 服务器在 NAT 后时需在 pjsip.conf 配置外部地址映射(transport 段 external_media_address/external_signaling_address 配合 local_net),并考虑 endpoint 打开 rtp_symmetric=yes、force_rport=yes;③ 仍单通时抓包确认 RTP 实际流向(本文 5.6 节已 noload 的 res_hep 与此无关,勿混淆)。
Q4:日志文件涨得太快?
先看是不是把 verbose/debug 开成长期配置。生产基线只保留 notice/warning/error(5.5 节模板);verbose 通道只在排障期开。级别调低了还涨,检查 queue_log 与 CDR 类文件(/var/log/asterisk 下 queue_log、cdr-csv 目录)是否被业务量推大,必要时在 logger.conf 用 rotatestrategy=rotate + exec_after_rotate=gzip -9 ${filename}.2 做轮转压缩。
Q5:pjsip show endpoints 里端点一直显示 Unavailable,是配置错了吗?
不是。Unavailable = 该 endpoint 名下没有已注册的 contact(pjsip show aors 可看 contact 状态)。话机用分机号/口令成功注册后,Aor 行下会出现 Contact 条目、状态转 Available。验证注册通路可用话机侧注册日志配合服务器 pjsip set logger on 抓 SIP 报文对照。
Q6:make samples 装了上百个 conf 和一堆看不懂的 context,要从哪读起? 按本文四章的分层来:日常只动 asterisk.conf/pjsip.conf/rtp.conf/extensions.conf/logger.conf/modules.conf 六个文件(样例里 dundi-e164、iax2-trunk、trunkdial 等演示 context 不会被你的 endpoint 进入,因为 endpoint 的 context 只指向你指定的 [from-internal])。其余文件保持样例默认即安全态——AMI/ARI 实测均为 Disabled(3.2 节 core show settings 回显),不需要时无需理会。
八、参考链接
- 官方文档站配置手册(Configuration):https://docs.asterisk.org/
- 官方 GitHub 仓库(含各配置样例文件源码):https://github.com/asterisk/asterisk
- 官方版本下载站:https://downloads.asterisk.org/pub/telephony/asterisk/
- 本专栏部署篇(安装与 systemd 托管全过程):《Ubuntu 22.04 安装 Asterisk 指南》
- 本专栏命令篇(CLI 命令全集与实测回显):《Asterisk 22.11.0 常用 CLI 命令与工具详解》
- 本专栏选型篇(版本线与同类对比):《Asterisk 22.11.0 介绍与选型指南》