1. 为什么选择Asterisk搭建VoIP服务器
十年前我第一次接触Asterisk时,就被它的灵活性震惊了。作为一款开源的PBX(专用交换机)系统,它能让任何具备Linux基础的工程师搭建起媲美商业方案的语音通信系统。在Ubuntu上部署Asterisk尤其方便——这个组合就像咖啡配奶精一样自然。
我最近为一家30人的设计公司部署了这套系统,替代了他们每年支付数万元的商业云服务。不仅实现了内部免费通话,还通过SIP中继节省了70%的外线通话成本。下面就把这套经过实战检验的部署方案拆解给你看。
2. 环境准备与依赖安装
2.1 系统环境要求
推荐使用Ubuntu Server LTS版本(20.04或22.04),实测在2核4G配置的云服务器上能稳定支持50路并发通话。如果只是测试学习,本地虚拟机分配1核2G也够用。
重要提示:务必使用纯净系统开始安装,避免残留的Apache/MySQL服务造成端口冲突。我曾因为系统预装了MySQL导致Asterisk数据库初始化失败,浪费了两小时排查。
2.2 必须的依赖包
先更新软件源并安装编译工具链:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git
接着安装核心依赖库,这些是Asterisk编译时需要的底层支持:
bash复制sudo apt install -y libssl-dev libncurses-dev libnewt-dev libxml2-dev \
libsqlite3-dev libjansson-dev libcurl4-openssl-dev libedit-dev \
libsrtp2-dev libgsm1-dev libspeex-dev libspeexdsp-dev
特别提醒:如果漏装libsrtp2-dev,后期配置SRTP加密通话时会报"No such file or directory"错误。这个坑我踩过三次,现在每次安装都会double check。
3. Asterisk源码编译安装
3.1 获取最新稳定版源码
不建议直接apt安装二进制包,会缺少很多模块。我们从官方下载源码编译:
bash复制wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
tar xvf asterisk-20-current.tar.gz
cd asterisk-20.*
3.2 配置与编译
执行配置检查时会交互式询问是否启用某些模块。除非你明确知道用途,否则建议按以下方式应答:
bash复制./configure
遇到提示时:
- 核心功能全部选Y
- ODBC数据库支持选N(除非要用外部数据库)
- XMPP选N(一般用不到)
- G729编码选N(有专利限制)
然后开始编译安装:
bash复制make -j$(nproc)
sudo make install
sudo make samples # 安装默认配置文件
sudo make config # 设置开机启动
编译过程约15-30分钟,取决于服务器性能。我在4核机器上实测用了18分钟。
3.3 常用模块安装
后续可能需要这些额外模块,建议现在一并安装:
bash复制sudo apt install -y asterisk-moh-opsound asterisk-mp3 asterisk-flite
4. 基础配置实战
4.1 初始化配置
关键配置文件位于/etc/asterisk/,我们先备份原始配置:
bash复制sudo cp /etc/asterisk/sip.conf /etc/asterisk/sip.conf.bak
sudo cp /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.bak
4.1.1 SIP基础配置
编辑/etc/asterisk/sip.conf,在文件末尾添加:
ini复制[general]
context=default
allowguest=no ; 禁止匿名呼叫
srvlookup=yes ; 启用DNS SRV记录查询
[1001] ; 第一个分机号
type=friend
secret=123456 ; 分机密码
host=dynamic
context=local
dtmfmode=rfc2833
4.1.2 拨号规则配置
编辑/etc/asterisk/extensions.conf,添加基础拨号方案:
ini复制[local]
exten => 1001,1,Dial(SIP/1001,20)
exten => 1001,n,Hangup()
exten => _1XXX,1,Dial(SIP/${EXTEN},20)
exten => _1XXX,n,Hangup()
这个配置实现了:
- 1001分机接听来电
- 1XXX格式的分机互拨
4.2 服务管理命令
常用操作命令:
bash复制sudo systemctl start asterisk # 启动服务
sudo systemctl enable asterisk # 开机自启
asterisk -rvvv # 进入CLI调试模式
在CLI中可执行实时操作,比如:
asterisk复制sip reload # 重新加载SIP配置
dialplan reload # 重载拨号方案
core show channels # 查看当前通话
5. 高级功能配置
5.1 外线电话接入
以Twilio为例配置SIP中继,在sip.conf添加:
ini复制[twilio]
type=peer
host=xxx.sip.twilio.com
defaultuser=your_account_sid
secret=your_auth_token
fromdomain=xxx.sip.twilio.com
context=inbound
qualify=yes
然后在extensions.conf添加路由规则:
ini复制[inbound]
exten => _+1XXXXXXXXXX,1,Dial(SIP/1001,30)
5.2 语音信箱设置
编辑voicemail.conf:
ini复制[general]
format=wav
serveremail=asterisk@yourdomain.com
[default]
1001 => 1234,John Doe,john@example.com
在extensions.conf中添加:
ini复制exten => *97,1,VoicemailMain(${CALLERID(num)}@default)
6. 安全加固措施
6.1 防火墙配置
只开放必要端口:
bash复制sudo ufw allow 5060/tcp # SIP
sudo ufw allow 5060/udp
sudo ufw allow 10000:20000/udp # RTP媒体端口
6.2 SIP安全配置
在sip.conf的[general]段添加:
ini复制encryption=yes
tlsbindport=5061
transport=udp,tls
启用TLS加密需要先生成证书:
bash复制sudo asterisk -x "ast_tls_cert -C yourdomain.com -O "My Company" -d /etc/asterisk/keys"
7. 常见问题排查
7.1 注册失败问题
现象:分机无法注册
检查步骤:
- 确认sip.conf中的分机配置正确
- 在CLI执行"sip show peers"查看注册状态
- 检查防火墙是否阻止了5060端口
7.2 单通/无声音问题
现象:能接通但听不到声音
解决方案:
- 检查RTP端口是否开放(10000-20000)
- 在sip.conf设置nat=force_rport,comedia
- 确认客户端不在对称NAT后
7.3 高并发优化
当并发超过50路时,建议调整:
ini复制[options]
maxload = 0.8 ; 最大系统负载阈值
rtpstart = 10000
rtpend = 20000
rtpchecksums = no ; 提升性能
8. 监控与维护
8.1 日志分析
关键日志文件:
- /var/log/asterisk/messages
- /var/log/asterisk/full
建议每天检查以下内容:
bash复制grep "WARNING" /var/log/asterisk/messages
grep "SECURITY" /var/log/asterisk/full
8.2 CDR记录
配置cdr.conf启用通话记录:
ini复制[general]
enable=yes
记录会保存在/var/log/asterisk/cdr-csv/,可用以下命令分析:
bash复制awk -F',' '{print $2,$8}' /var/log/asterisk/cdr-csv/Master.csv | sort | uniq -c
这套系统稳定运行的关键是定期检查日志和CDR记录。我通常设置每周自动生成使用报告,包含呼入呼出统计、最长通话、最活跃分机等数据。通过简单的shell脚本配合cron就能实现,有需要的话可以留言,我下次专门分享这个监控方案。