凌峰创科服务平台

centos sip服务器搭建

重要提示

  • 防火墙和 SELinux:在生产环境中,必须正确配置防火墙和 SELinux,本教程为了简化,会尽量关闭它们,但在最后会提供安全加固的建议。
  • CentOS 版本:本教程以 CentOS 7 为例,其步骤同样适用于 CentOS 8/9,只需将 yum 替换为 dnf 即可。
  • 学习目的:此指南旨在学习和测试,用于生产环境前,请务必深入了解 Asterisk 的安全配置。

第一步:准备工作

  1. 系统安装:确保您已安装一个最小化的 CentOS 7 系统,并拥有 root 权限。
  2. 网络配置:为服务器设置一个静态 IP 地址,168.1.100
  3. 主机名:设置一个清晰的主机名,pbx.example.com

第二步:更新系统并安装依赖

更新系统软件包并安装 Asterisk 所需的编译工具和依赖库。

centos sip服务器搭建-图1
(图片来源网络,侵删)
# 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

我们直接从官方源码编译安装,以获得最新版本。

  1. 下载 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
  2. 运行 configure 脚本 这个脚本会检查系统环境,并生成 Makefile。

    # 运行配置脚本
    ./configure
  3. 选择安装组件 运行 menuselect 来选择需要编译的模块,对于初学者,保持默认选择即可。

    centos sip服务器搭建-图2
    (图片来源网络,侵删)
    # 进入菜单选择界面
    make menuselect

    您可以勾选或取消勾选各种功能模块。chan_dahdiapp_dahdi 通常用于模拟电话线,如果您只使用 SIP,可以不选,确保 format_mp3(如果需要录音为 MP3)等您需要的模块被选中,按 F12 保存并退出。

  4. 编译和安装 这个过程需要一些时间。

    # 编译
    make
    # 安装
    make install
  5. 安装示例配置文件 这些文件非常有用,可以作为配置的起点。

    # 安装基本配置文件
    make basic-pbx
  6. 安装初始化脚本 这会让 Asterisk 作为系统服务运行。

    # 安装 systemd 服务文件
    make config

第四步:配置 Asterisk

Asterisk 已经安装完成,我们需要进行核心配置。

  1. 进入配置目录 Asterisk 的主配置文件位于 /etc/asterisk/

    cd /etc/asterisk
  2. 配置 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)。

  3. 配置拨号规则(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

  1. 启动 Asterisk 服务

    # 启动服务
    systemctl start asterisk
    # 设置开机自启
    systemctl enable asterisk
  2. 进入 Asterisk CLI(命令行接口)

    asterisk -rvv

    你会看到类似 *CLI> 的提示符。

  3. 在 CLI 中进行测试

    • 重载配置:修改配置文件后,不需要重启整个服务,只需重载即可。

      *CLI> sip reload
      *CLI> dialplan reload
    • 检查 SIP 分机状态

      *CLI> sip show peers

      在输出中,你应该能看到 1000 分机,其状态为 OK (Unmonitored),如果状态是 UNKNOWN,说明分机还没有注册成功。

    • 检查拨号计划

      *CLI> dialplan show internal
    • 退出 CLI

      *CLI> exit

第六步:配置客户端并注册

现在服务器端已经配置好了,你需要一个 SIP 软件或硬件电话来注册到服务器。

  1. 选择客户端

    • 软件:Zoiper, Bria, Linphone, X-Lite 等。
    • 手机 App:Zoiper, Bria 等。
    • 硬件电话:Yealink, Grandstream 等品牌的 IP 电话。
  2. 配置客户端: 在你的 SIP 客户端上创建一个新的账户,填入以下信息:

    • 显示名称:User 1000
    • 用户名/账号:1000
    • 密码1000pass (你在 sip.conf 中设置的密码)
    • SIP 服务器168.1.100 (你的 Asterisk 服务器 IP)
    • 注册域168.1.100 (可选,有些客户端需要)
    • 端口5060 (默认)
  3. 测试通话

    • 注册成功后,客户端的状态应变为“已注册”或“在线”。
    • 在两个不同的客户端上分别配置分机 10001001
    • 拿起分机 1000 的电话,拨打 1001,你应该能听到振铃,并与 1001 分机建立通话。
    • 反之亦然。

第七步:可选 - 连接外部线路(SIP Trunk)

要让你的 PBX 能拨打外部的真实电话号码(如手机、座机),你需要连接一个 SIP Trunk 服务商(如 Twilio, Flowroute, 国内的一些云通信服务商)。

  1. 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
  2. extensions.conf 中添加拨号规则

    nano extensions.conf

    修改 [internal] 上下文,添加拨打外线的规则,通常以 90 作为外线前缀。

    [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} 就变成了 ..
  3. 重载配置

    asterisk -rvv
    *CLI> sip reload
    *CLI> dialplan reload
    *CLI> exit

你的分机 1000 拨打 913800138000,就会通过 SIP Trunk 将呼叫路由到外部号码 13800138000


第八步:安全加固(非常重要!)

在生产环境中,绝对不能忽略这一步!

  1. 配置防火墙 (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
  2. 配置 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
  3. 安全 sip.conf

    • 修改默认密码:所有分机的密码都必须是强密码。
    • 限制 IP 地址:在 sip.conf[general] 部分,使用 allowdeny 来限制哪些 IP 地址可以访问你的 SIP 服务器。
      [general]
      ...
      allow=192.168.1.0/24   ; 只允许 192.168.1.0 网段注册和呼叫
      deny=0.0.0.0/0.0.0.0   ; 默认拒绝所有
  4. 使用安全编解码:在生产环境中,优先使用 SRTP (安全实时传输协议) 和安全的编解码,而不是不加密的 RTP。


恭喜!您已经成功在 CentOS 上搭建了一个基础的 SIP 服务器,这只是 Asterisk 功能的冰山一角,您还可以配置语音邮件、IVR(交互式语音应答)、会议、队列等高级功能,祝您探索愉快!

分享:
扫描分享到社交APP
上一篇
下一篇