Asterisk 22.11.0 配置参数详解

Asterisk 22.11.0 配置参数详解:asterisk.conf/pjsip.conf/rtp.conf/extensions.conf/logger.conf/modules.conf 核心参数逐项说明,新增分机 6002 与日志通道热重载即改即生效实测闭环。

Asterisk即时通信Asterisk2026/10/22

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
拨号计划某 contextdialplan 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.confpjsip show endpointspjsip reload
extensions.confdialplan show <context>dialplan reload
rtp.confrtp show settingsrtp reload
logger.conflogger show channelslogger reload
modules.confmodule show无热重载,需重启服务
asterisk.confcore show settings无热重载,需重启服务
全部配置——core reload(按序重载全部可热重载配置)

⚠️ 注意:上表的「热重载」边界有实测例外——pjsip.conf 的 transport 段参数(如 bind)用 pjsip reload 不会生效,必须重启服务。实测过程与回显见七、Q1。动手改 transport 前请预留重启窗口。

四、参数总览

Asterisk 没有单一的「主配置」,而是按职责拆成上百个文件(样例环境 101 个 .conf,见 3.1 节)。日常运维真正高频打交道的是下面 11 个,按「框架 → 通道 → 媒体 → 拨号 → 可观测」分层:

配置文件职责代表参数详解章节
asterisk.conf目录布局与内核运行选项astetcdir、maxcalls、runuser5.1
modules.conf模块加载白名单/黑名单autoload、noload、preload5.6
pjsip.confSIP 信令:传输、端点、认证type=transport/endpoint/auth/aor5.2
rtp.confRTP 媒体端口段与传输安全rtpstart/rtpend、strictrtp5.3
extensions.conf拨号计划(呼叫路由逻辑)context、exten、include5.4
logger.conf日志通道与级别console、messages.log5.5
manager.confAMI 管理接口(TCP 5038)enabled、secret——
http.conf内置 HTTP 服务(AMI over HTTP / ARI)enabled、bindport——
ari.confARI REST 接口enabled、password——
voicemail.conf语音信箱上下文与邮箱——
sorcery.confPJSIP 对象存储后端映射实时数据库接入——

关键差异与阅读建议:前 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.).
...

生产中值得关注的选项逐项说明(未列出的保持默认即可):

参数默认建议与影响
verbose0控制台详细输出级别,CLI 可用 core set verbose N 临时调;生产保持 0,排障临时开
debug0调试日志级别,量极大;样例 logger.conf 注释明确建议生产不要开
maxcalls不限制全局最大并发呼叫数,超限新呼叫被拒;防话务风暴的保险丝,如设 10
maxload0.9负载均值超过该值停止接新呼叫(0.9 = 90% 单核);小机器防过载
maxfiles系统限制进程最大打开文件句柄数;大量注册/RTP 流时调高(实测未设置时运行值为 1024)
minmemfree0空闲内存低于该 MB 数停止接新呼叫;内存紧张的整机保险
runuser/rungroup——以 root 启动时的降权目标;systemd 单元已写 User=asterisk 时无需重复
documentation_languageen_US样例实值 en_US;core show application 等帮助文本的语言
live_dangerouslyno允许 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监听哪个协议/地址/端口收发 SIPtransport-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 消息带大头域
tlsTCP + 加密(sips:),证书双向可验证公网/跨分支信令加密
ws / wssWebSocket 承载,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原理适用场景
rfc4733DTMF 用独立 RTP 事件包承载(默认,实测 6001 为该值)绝大多数现代话机/软终端
inbandDTMF 混在语音流里,靠 DSP 识别个别老旧网关
infoDTMF 走 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: YesrtpchecksumsyesRTP 包 UDP 校验和
DTMF Timeout: 1200dtmftimeout3000(样例注释值)/1200(22.x 实际默认)无 end 标记的 DTMF 持续上限(采样数)
Strict RTP: Yesstrictrtpyes学习期锁定合法 RTP 源地址,丢弃未知来源包(防 RTP 注入/窃听)
Probation: 4 framesprobation4学习期需连续 4 个序列号正确的包才锁定源
Replay Protect: YessrtpreplayprotectionyesSRTP 重放保护
ICE support: Yesicesupportfalse(样例注释)/ 实际启用ICE 候选交换,NAT 穿透用
STUN: disabledstunaddr未配置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:拨号计划为静态文件,不由 CLI dialplan 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_callidsyes日志附带 Call-ID,按通话聚合排障必备
appendhostnameno文件名追加主机名,多机集中日志时开
queue_logyes队列事件写 queue_log 文件(实测 /var/log/asterisk/queue_log 存在)
rotatestrategysequential轮转策略:none/sequential/rotate/timestamp 四选一
exec_after_rotate——轮转后执行的系统命令(如压缩旧日志)
logger_queue_limit1000日志内存队列上限,超出丢弃(实测 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 回显),不需要时无需理会。

八、参考链接