重要提示
- 防火墙和 SELinux:在生产环境中,必须正确配置防火墙和 SELinux,本教程为了简化,会尽量关闭它们,但在最后会提供安全加固的建议。
- CentOS 版本:本教程以 CentOS 7 为例,其步骤同样适用于 CentOS 8/9,只需将
yum替换为dnf即可。 - 学习目的:此指南旨在学习和测试,用于生产环境前,请务必深入了解 Asterisk 的安全配置。
第一步:准备工作
- 系统安装:确保您已安装一个最小化的 CentOS 7 系统,并拥有
root权限。 - 网络配置:为服务器设置一个静态 IP 地址,
168.1.100。 - 主机名:设置一个清晰的主机名,
pbx.example.com。
第二步:更新系统并安装依赖
更新系统软件包并安装 Asterisk 所需的编译工具和依赖库。

# 1. 更新系统
sudo yum update -y
# 2. 安装编译工具和依赖
sudo yum groupinstall "Development Tools" -y
sudo yum install \
ncurses-devel \
openssl-devel \
newt-devel \
libxml2-devel \
libtiff-devel \
gtk2-devel \
portaudio-devel \
sqlite-devel \
unixODBC-devel \
subversion \
jansson-devel \
uuid-devel \
curl-devel -y
第三步:下载并编译 Asterisk
我们直接从官方源码编译安装,以获得最新版本。
-
下载 Asterisk 源码 访问 Asterisk 官方下载页面 获取最新的稳定版本号(
17.2)。# 创建一个工作目录 cd /usr/src # 下载 Asterisk 源码 (请替换为最新版本) wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18.17.2.tar.gz # 解压 tar -xvzf asterisk-18.17.2.tar.gz cd asterisk-18.17.2
-
运行
configure脚本 这个脚本会检查系统环境,并生成 Makefile。# 运行配置脚本 ./configure
-
选择安装组件 运行
menuselect来选择需要编译的模块,对于初学者,保持默认选择即可。
(图片来源网络,侵删)# 进入菜单选择界面 make menuselect
您可以勾选或取消勾选各种功能模块。
chan_dahdi和app_dahdi通常用于模拟电话线,如果您只使用 SIP,可以不选,确保format_mp3(如果需要录音为 MP3)等您需要的模块被选中,按F12保存并退出。 -
编译和安装 这个过程需要一些时间。
# 编译 make # 安装 make install
-
安装示例配置文件 这些文件非常有用,可以作为配置的起点。
# 安装基本配置文件 make basic-pbx
-
安装初始化脚本 这会让 Asterisk 作为系统服务运行。
# 安装 systemd 服务文件 make config
第四步:配置 Asterisk
Asterisk 已经安装完成,我们需要进行核心配置。
-
进入配置目录 Asterisk 的主配置文件位于
/etc/asterisk/。cd /etc/asterisk
-
配置 SIP 用户(分机) 编辑
sip.conf文件,定义我们的 SIP 分机。nano sip.conf
在文件末尾添加以下内容(如果已有
[general]段,请在其后添加):[general] ; ... (保留默认配置) ... ; --- 定义我们的 SIP 分机 --- [1000] ; 分机号 type=friend ; friend = 既能呼入也能呼出 secret=1000pass ; SIP 密码,非常重要! host=dynamic ; 分机使用动态 IP 注册 context=internal ; 分机拨号的上下文(权限范围) callerid="User 1000" <1000> ; 来显名称和号码 dtmfmode=rfc2833 ; DTMF 信号传输方式 disallow=all ; 默认禁止所有编解码 allow=ulaw ; 允许使用 ulaw 编解码(G.711u,北美标准) allow=alaw ; 允许使用 alaw 编解码(G.711a,欧洲标准)
解释:
[1000]:定义了一个名为1000的分机。type=friend:最常用的类型,表示此分机既可以作为主叫方(呼出),也可以作为被叫方(呼入)。secret:SIP 注册的密码,请务必修改为强密码。host=dynamic:表示此分机会从一个动态 IP 地址注册到服务器。context=internal:定义了分机1000的拨号规则,我们将在下一步创建这个规则。
保存并退出 (
Ctrl+X,Y,Enter)。 -
配置拨号规则(Dialplan) 编辑
extensions.conf文件,定义号码如何被路由和处理。nano extensions.conf
在文件末尾添加以下内容:
[general] ; ... (保留默认配置) ... ; --- 内部通话上下文 --- [internal] ; 拨打 1000 分机 exten => 1000,1,Dial(SIP/1000,20) ; 拨打 SIP 分机 1000,超时 20 秒 same => n,Hangup() ; 挂断 ; 拨打 1001 分机 (如果你添加了第二个分机) exten => 1001,1,Dial(SIP/1001,20) same => n,Hangup() ; --- 演示上下文 --- [demo] exten => s,1,Answer() same => n,Playback(hello-world) same => n,Hangup()
解释:
[internal]:我们之前在sip.conf中为分机1000指定的上下文。exten => 1000,1,Dial(...):这是拨号规则的核心。exten => 1000:匹配拨打1000这个号码。1:优先级 1。Dial(SIP/1000,20):执行Dial动作,通过SIP协议呼叫1000,最长等待 20 秒。
same => n,...:same表示与上一行使用相同的exten和优先级,n表示下一个优先级。
保存并退出。
第五步:启动并测试 Asterisk
-
启动 Asterisk 服务
# 启动服务 systemctl start asterisk # 设置开机自启 systemctl enable asterisk
-
进入 Asterisk CLI(命令行接口)
asterisk -rvv
你会看到类似
*CLI>的提示符。 -
在 CLI 中进行测试
-
重载配置:修改配置文件后,不需要重启整个服务,只需重载即可。
*CLI> sip reload *CLI> dialplan reload
-
检查 SIP 分机状态:
*CLI> sip show peers
在输出中,你应该能看到
1000分机,其状态为OK (Unmonitored),如果状态是UNKNOWN,说明分机还没有注册成功。 -
检查拨号计划:
*CLI> dialplan show internal
-
退出 CLI:
*CLI> exit
-
第六步:配置客户端并注册
现在服务器端已经配置好了,你需要一个 SIP 软件或硬件电话来注册到服务器。
-
选择客户端:
- 软件:Zoiper, Bria, Linphone, X-Lite 等。
- 手机 App:Zoiper, Bria 等。
- 硬件电话:Yealink, Grandstream 等品牌的 IP 电话。
-
配置客户端: 在你的 SIP 客户端上创建一个新的账户,填入以下信息:
- 显示名称:User 1000
- 用户名/账号:1000
- 密码:
1000pass(你在sip.conf中设置的密码) - SIP 服务器:
168.1.100(你的 Asterisk 服务器 IP) - 注册域:
168.1.100(可选,有些客户端需要) - 端口:
5060(默认)
-
测试通话:
- 注册成功后,客户端的状态应变为“已注册”或“在线”。
- 在两个不同的客户端上分别配置分机
1000和1001。 - 拿起分机
1000的电话,拨打1001,你应该能听到振铃,并与1001分机建立通话。 - 反之亦然。
第七步:可选 - 连接外部线路(SIP Trunk)
要让你的 PBX 能拨打外部的真实电话号码(如手机、座机),你需要连接一个 SIP Trunk 服务商(如 Twilio, Flowroute, 国内的一些云通信服务商)。
-
在
sip.conf中添加 Trunk:nano sip.conf
在文件末尾添加:
; --- 外部线路 Trunk --- [trunk-provider] type=friend username=your_trunk_username ; Trunk 服务商提供的用户名 secret=your_trunk_password ; Trunk 服务商提供的密码 host=sip.provider.com ; Trunk 服务商的 SIP 服务器地址 fromuser=your_trunk_username ; (可选) 注册时使用的用户名 fromdomain=sip.provider.com ; (可选) 注册时使用的域名 context=incoming-outgoing ; 用于处理呼入和呼出的上下文 insecure=invite,port ; (安全考虑,根据服务商建议调整) disallow=all allow=ulaw allow=alaw
-
在
extensions.conf中添加拨号规则:nano extensions.conf
修改
[internal]上下文,添加拨打外线的规则,通常以9或0作为外线前缀。[internal] ; ... (内部通话规则保持不变) ... ; 拨打外线,以 9 开头 ; 例如拨打 13800138000,实际拨打 913800138000 exten => _9X.,1,Set(CALLERID(num)=1000) ; 设置外呼主叫号码为你的分机号 same => n,Dial(SIP/trunk-provider/${EXTEN:1},60,T) ; 拨打 Trunk,去掉前缀 '9',超时60秒,T 允许被叫方取消 same => n,Hangup()解释:
exten => _9X.,1,...:这是一个拨号模式匹配。_9:必须以9开头。X.:X代表任意 0-9 的数字, 代表一个或多个数字。_9X.匹配所有以9开头的号码。
${EXTEN:1}:这是一个变量,表示去掉EXTEN(拨打的号码) 的第一个字符,拨打了..,${EXTEN:1}就变成了..。
-
重载配置:
asterisk -rvv *CLI> sip reload *CLI> dialplan reload *CLI> exit
你的分机 1000 拨打 913800138000,就会通过 SIP Trunk 将呼叫路由到外部号码 13800138000。
第八步:安全加固(非常重要!)
在生产环境中,绝对不能忽略这一步!
-
配置防火墙 (Firewalld) Asterisk 默认使用 UDP 5060 (SIP) 和 RTP 端口范围 (10000-20000)。
# 添加永久规则 firewall-cmd --permanent --add-port=5060/udp firewall-cmd --permanent --add-port=10000-20000/udp # 重新加载防火墙 firewall-cmd --reload
-
配置 SELinux SELinux 默认会阻止 Asterisk 访问某些文件,运行以下命令为 Asterisk 设置正确的安全上下文。
# 为 Asterisk 配置文件设置上下文 semanage fcontext -a -t asterisk_etc_t "/etc/asterisk(/.*)?" restorecon -Rv /etc/asterisk # 为 Asterisk 日志目录设置上下文 semanage fcontext -a -t var_log_t "/var/log/asterisk(/.*)?" restorecon -Rv /var/log/asterisk # 重启 Asterisk 使 SELinux 策略生效 systemctl restart asterisk
-
安全
sip.conf:- 修改默认密码:所有分机的密码都必须是强密码。
- 限制 IP 地址:在
sip.conf的[general]部分,使用allow和deny来限制哪些 IP 地址可以访问你的 SIP 服务器。[general] ... allow=192.168.1.0/24 ; 只允许 192.168.1.0 网段注册和呼叫 deny=0.0.0.0/0.0.0.0 ; 默认拒绝所有
-
使用安全编解码:在生产环境中,优先使用 SRTP (安全实时传输协议) 和安全的编解码,而不是不加密的 RTP。
恭喜!您已经成功在 CentOS 上搭建了一个基础的 SIP 服务器,这只是 Asterisk 功能的冰山一角,您还可以配置语音邮件、IVR(交互式语音应答)、会议、队列等高级功能,祝您探索愉快!
