Ubuntu 22.04 安装 Kamailio 6.1 指南

Ubuntu 22.04 从零安装 Kamailio 6.1.5 SIP 服务器:官方 apt 仓库与发行版仓库双方案实测、服务托管配置、SIP 注册验证、403 Not relaying 排障实录与完整卸载流程。

KamailioKamailio即时通信2026/10/22

Ubuntu 22.04 安装 Kamailio 6.1 指南

目标:在 Ubuntu 22.04 服务器上从零安装 Kamailio 6.1.5 SIP 服务器,覆盖官方 apt 仓库与 Ubuntu 发行版仓库两种安装方案、服务托管配置、SIP 注册验证、403 Not relaying 排障实录与完整卸载流程。已在 Ubuntu 22.04.5 LTS(x86_64)实测通过,Kamailio 版本 6.1.5(官方仓库 kamailio61,2026-10-22 查询时最新稳定版)。

一、环境信息

本文所有命令与回显均在以下真实环境实测采集:

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64),PRETTY_NAME="Ubuntu 22.04.5 LTS"
  • Kamailio:6.1.5(官方 apt 仓库 deb.kamailio.org/kamailio61,软件包版本 6.1.5+ubuntu22.04)
  • SIP 监听端口:默认 5060(UDP/TCP),第七章演示自定义监听 5070
  • 服务器 IP:10.0.0.8(测试环境内网地址,下文所有配置以此为例)
  • 关键目录:
    • /etc/kamailio/:主配置目录(kamailio.cfg、kamctlrc)
    • /etc/default/kamailio:开机启动开关与内存参数
    • /lib/systemd/system/kamailio.service:systemd 服务单元
    • /usr/sbin/kamailio:主程序;/usr/sbin/kamctl、/usr/sbin/kamcmd:管理 CLI

二、前置条件

安装前确认以下四项,避免安装后无法启动或无法联机:

  1. 一台 Ubuntu 22.04 服务器:具备 root 或 sudo 权限,磁盘剩余空间 ≥ 200 MB(主包安装后占用约 52 MB,含依赖)。
  2. 软件源可达:能访问 archive.ubuntu.com(系统源)与 deb.kamailio.org(Kamailio 官方源);内网机器需提前打通代理或自建软件源。
  3. 防火墙放行 SIP 端口:Kamailio 默认监听 UDP/TCP 5060,公网或跨网段部署需放行:
    ufw allow 5060/udp
    ufw allow 5060/tcp
    
  4. 时间同步:SIP Digest 认证、TLS 证书校验都依赖系统时间,安装前确认 timedatectl 状态正常:
    timedatectl status | head -5
    
    实测回显(节选):
                 Local time: 三 2026-10-22 10:30:00 CST
            Universal time: 三 2026-10-22 02:30:00 UTC
                  Time zone: Asia/Shanghai (CST, +0800)
              NTP service: active
    

三、版本选型说明

Kamailio 官方通过 GitHub Releases(releases.atom)发布版本,2026-10-22 实查当前有三条维护线并行:

维护线最新版本说明
6.1.x(最新稳定线)6.1.5当前主推版本,新特性与优化集中在此线
6.0.x(上一稳定线)6.0.86.1 前的稳定分支,仅维护性更新
5.8.x(长期维护线)5.8.8老版本维护分支,存量环境使用

💡 说明:实查方式为 Kamailio 官方 GitHub 仓库的 releases.atom 订阅源(https://github.com/kamailio/kamailio/releases.atom),条目按发布时间倒序,2026-10-22 查询时最新条目为 6.1.5,其次 6.0.8、5.8.8。查询日期须随实际部署时间更新,选型取所属维护线的最新小版本。

Ubuntu 22.04 上两个可安装渠道的版本对照如下(实测 apt-cache policy 输出):

渠道实测可装版本源地址
Kamailio 官方仓库(kamailio61)6.1.5+ubuntu22.04http://deb.kamailio.org/kamailio61 jammy/main
Ubuntu 发行版仓库(universe)5.5.4-1http://archive.ubuntu.com/ubuntu jammy/universe

关键差异:官方源跟随上游发版节奏,能拿到最新稳定版 6.1.5;发行版仓库随 Ubuntu 22.04 发布冻结,停留在 5.5.4,与最新线相差一个大版本代际。生产环境推荐官方仓库方案(第四章),需要严格使用发行版认证包的场景(如离线合规要求)再选第五章方案。

四、官方 apt 仓库在线安装方案(A:推荐)

本章完成 Kamailio 官方 apt 仓库的从零安装:配置签名密钥与软件源 → 安装主包 → 启用启动开关 → 启动验证。安装完成后得到一个监听 5060 端口、可用 systemd 托管的 Kamailio 服务。

4.1 配置官方软件源

官方仓库使用 GPG 签名,先安装签名密钥再登记源地址。安装基础工具:

apt-get update
apt-get install -y curl gnupg

获取 Kamailio 打包团队的签名公钥并转为 keyring 格式:

curl -s http://pkg.kamailio.org/debian/kamailiodebkey.gpg | gpg --dearmor > /usr/share/keyrings/kamailio.gpg

登记 kamailio61 仓库(Ubuntu 22.04 代号 jammy):

echo "deb [signed-by=/usr/share/keyrings/kamailio.gpg] http://deb.kamailio.org/kamailio61 jammy main" > /etc/apt/sources.list.d/kamailio.list

刷新索引并确认仓库生效,实测回显:

apt-get update
Hit:5 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:6 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Fetched 13.5 kB in 1s (11.5 kB/s)
Reading package lists...

无 GPG error / NO_PUBKEY 报错即签名校验通过。

⚠️ 排障实录:若 curl 拉取密钥时 HTTPS 不通(实测 pkg.kamailio.org 的 HTTPS 在部分网络环境握手失败,curl 返回 HTTP:000 SIZE:0),且 apt-get update 报 NO_PUBKEY FB40D3E6508EA4C8,可改从 Ubuntu 公共密钥服务器直接取公钥(完整指纹 E79ACECB87D8DCD23A20AD2FFB40D3E6508EA4C8):

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FB40D3E6508EA4C8
apt-key export FB40D3E6508EA4C8 > /usr/share/keyrings/kamailio.gpg

实测回显:gpg: Total number processed: 1 / gpg: imported: 1。同时把源地址写成 http://(而非 https://)可避开握手问题;两种取钥方式得到的都是同一把 Kamailio Package Team 签名钥(uid:pkg@kamailio.org)。

4.2 安装 kamailio 主包

主包 kamailio 是核心程序 + 默认模块的元包,MySQL/Lua/TLS 等扩展模块以独立子包形式按需安装。执行安装:

DEBIAN_FRONTEND=noninteractive apt-get install -y kamailio

实测输出(节选,完整 85 行):

Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libexpat1 libmpdec3 libpython3-stdlib libpython3.10-minimal
  libpython3.10-stdlib media-types python3 python3-minimal python3.10
  python3.10-minimal
Suggested packages:
  kamailio-cpl-modules kamailio-ldap-modules kamailio-lua-modules
  kamailio-mysql-modules kamailio-perl-modules kamailio-postgres-modules
  kamailio-presence-modules kamailio-python-modules kamailio-radius-modules
  kamailio-snmpstats-modules kamailio-tls-modules kamailio-unixodbc-modules
  kamailio-xml-modules kamailio-xmpp-modules stun-server | turn-server
  python3-doc python3-tk python3-venv python3.10-doc binutils
  binfmt-support
The following NEW packages will be installed:
  kamailio libexpat1 libmpdec3 libpython3-stdlib libpython3.10-minimal
  libpython3.10-stdlib media-types python3 python3-minimal python3.10
  python3.10-minimal
0 upgraded, 11 newly installed, 0 to remove and 4 not upgraded.
Need to get 16.5 MB of archives.
After this operation, 51.7 MB of additional disk space will be used.
Get:1 http://deb.kamailio.org/kamailio61 jammy/main amd64 kamailio amd64 6.1.5+ubuntu22.04 [10.8 MB]
...
Preparing to unpack .../kamailio_6.1.5+ubuntu22.04_amd64.deb ...
Unpacking kamailio (6.1.5+ubuntu22.04) ...
Setting up kamailio (6.1.5+ubuntu22.04) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

验证安装结果——查软件包版本:

dpkg -l | grep -E "^ii +kamailio" | awk '{print $2, $3}'
kamailio 6.1.5+ubuntu22.04

查主程序版本(编译特性一目了然):

kamailio -V
version: kamailio 6.1.5 (x86_64/Linux)
flags: USE_TCP, USE_TLS, USE_SCTP, TLS_HOOKS, USE_RAW_SOCKS, DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MMAP, PKG_MALLOC, MEM_JOIN_FREE, Q_MALLOC, F_MALLOC, TLSF_MALLOC, DBG_SR_MEMORY, DBG_QM_MALLOC, DBG_F_MALLOC, DBG_TLSF_MALLOC, USE_FUTEX, USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR, USE_DST_BLOCKLIST, HAVE_RESOLV_RES, TLS_PTHREAD_MUTEX_SHARED
MAX_RECV_BUFFER_SIZE 262144, MAX_SEND_BUFFER_SIZE 262144, MAX_URI_SIZE 1024, BUF_SIZE 65535, DEFAULT PKG_SIZE 8MB
poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
compiled with gcc 11.4.0

💡 技术拓展:apt install kamailio 只装了核心元包,扩展能力需按需追加子包。常用子包对比——

子包提供能力何时安装
kamailio-mysql-modulesdb_mysql 驱动 + kamdbctl 建库脚本用户数据/注册位置要落 MySQL
kamailio-postgres-modulesPostgreSQL 驱动数据库选 PG 时
kamailio-tls-modulestls 模块(SIP over TLS)需要 wss/TLS 加密信令
kamailio-presence-modulespresence/rls 状态呈现要做在线状态订阅
kamailio-lua-modules / python-modulesKEMI 脚本路由逻辑用 Lua/Python 写路由

子包版本与主包严格一致(同为 6.1.5+ubuntu22.04),Suggested packages: 列表中的即为可选项;本文先以默认安装跑通注册主线。

4.3 启用启动开关(/etc/default/kamailio)

这是官方 deb 包特有的安全设计:全新安装后服务不会随 systemd/启动脚本拉起,必须先显式确认"已配置完毕"。查看 /etc/default/kamailio(实测默认内容):

#
# Kamailio startup options
#

# Set to yes to enable kamailio, once configured properly.
#RUN_KAMAILIO=yes

# User to run as
#USER=kamailio

# Group to run as
#GROUP=kamailio

# Amount of shared and private memory to allocate
# for the running Kamailio server (in Mb)
#SHM_MEMORY=64
#PKG_MEMORY=8

# Config file
#CFGFILE=/etc/kamailio/kamailio.cfg

把 RUN_KAMAILIO 打开(其余保持默认:共享内存 64MB、私有内存 8MB、配置文件 /etc/kamailio/kamailio.cfg):

sed -i 's/^# *RUN_KAMAILIO=.*/RUN_KAMAILIO=yes/' /etc/default/kamailio
grep -n "RUN_KAMAILIO" /etc/default/kamailio

实测回显:

6:RUN_KAMAILIO=yes

若此时直接启动,服务能正常拉起;不开启则报 Kamailio not yet configured(详见 8.2)。

4.4 启动服务与验证

systemd 机器用 systemctl 启动并设置开机自启:

systemctl start kamailio
systemctl enable kamailio

服务单元(/lib/systemd/system/kamailio.service)关键内容实测如下,可看到启动参数与内存配置的来处:

[Service]
Type=forking
User=kamailio
Group=kamailio
Environment='CFGFILE=/etc/kamailio/kamailio.cfg'
Environment='SHM_MEMORY=64'
Environment='PKG_MEMORY=8'
EnvironmentFile=-/etc/default/kamailio
PIDFile=/run/kamailio/kamailio.pid
ExecStart=/usr/sbin/kamailio -P /run/kamailio/kamailio.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY --atexit=no
Restart=on-failure
RuntimeDirectory=kamailio

无 systemd 的最小环境可用 init 脚本等价启动(本文实测路径):

service kamailio start

实测回显(启动即打印监听套接字清单):

 * Starting Kamailio SIP Server: kamailio
Listening on
             udp: 127.0.0.1:5060
             udp: 10.0.0.8:5060
             tcp: 127.0.0.1:5060
             tcp: 10.0.0.8:5060
Aliases:
             tcp: localhost:5060
             udp: localhost:5060

   ...done.

确认服务状态与端口监听:

service kamailio status
ss -lun | grep 5060

实测回显:

 * Status of Kamailio SIP Server:
 * kamailio is running
udp   UNCONN 0      0            127.0.0.1:5060       0.0.0.0:*
udp   UNCONN 0      0            10.0.0.8:5060        0.0.0.0:*

至此默认配置的 Kamailio 已监听 5060(UDP/TCP)并处于运行状态,验证手段为 service kamailio status 返回 running 与端口监听清单。

五、Ubuntu 发行版仓库安装方案(B)

不添加第三方源、直接使用 Ubuntu 自带 universe 仓库也可安装 Kamailio,代价是版本冻结在 5.5.4。先确认候选版本:

apt-cache policy kamailio

实测回显:

kamailio:
  Installed: (none)
  Candidate: 6.1.5+ubuntu22.04
  Version table:
     6.1.5+ubuntu22.04 500
        500 http://deb.kamailio.org/kamailio61 jammy/main amd64 Packages
     5.5.4-1 500
        500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages

若已配置第四章官方源,需显式指定版本号安装 universe 版:

DEBIAN_FRONTEND=noninteractive apt-get install -y kamailio=5.5.4-1

实测输出(节选):

Setting up kamailio (5.5.4-1) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

版本验证:

kamailio -V | head -2

实测回显:

version: kamailio 5.5.4 (x86_64/linux)
flags: USE_TCP, USE_TLS, USE_SCTP, TLS_HOOKS, USE_RAW_SOCKS, DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, TLSF_MALLOC, DBG_SR_MEMORY, USE_FUTEX, FAST_LOCK-ADAPTIVE_WAIT, USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR, USE_DST_BLOCKLIST, HAVE_RESOLV_RES, TLS_PTHREAD_MUTEX_SHARED

对比 6.1.5 的 flags 可见 5.5.4 缺少 MEM_JOIN_FREE、DBG_QM_MALLOC、DBG_F_MALLOC、DBG_TLSF_MALLOC 等内存管理特性——这些是 6.x 线的内存分配器演进。未配置官方源时 apt-cache policy 的 Candidate 直接就是 5.5.4-1,无需指定版本号。

六、方案对比与选择建议

两种安装方案的关键维度对照(均为实测数据):

维度方案 A:官方 apt 仓库方案 B:发行版仓库
实测版本6.1.5+ubuntu22.045.5.4-1
是否需联网是(deb.kamailio.org)是(archive.ubuntu.com)
源登记方式官方 GPG 密钥 + kamailio.list系统默认 universe
版本节奏跟随上游发版(2026-10 实查 6.1.5)随 Ubuntu 发行版冻结
服务开关需启用 RUN_KAMAILIO=yes同样需要(同源 deb 机制)
systemd 服务名kamailiokamailio
适用场景生产部署、新特性、长期维护合规限制只能用发行版认证包

选择建议:可联网环境一律选方案 A——SIP 服务器的安全补丁随上游小版本发布,6.1.5 对 5.5.4 有近三年安全与内存管理改进;方案 B 仅作为受限环境兜底。两方案装完的配置文件结构、服务管理方式完全一致,后续章节对两者通用。

七、配置说明

本章介绍安装后必须了解的配置文件体系,并实测完成两件事:把监听端口从默认 5060 改为 5070、用一次真实的 SIP REGISTER 完成注册验证。

7.1 配置文件体系

官方 deb 包的配置分工如下:

文件作用典型改动
/etc/kamailio/kamailio.cfg主路由配置(核心脚本)启用 #!define WITH_AUTH 等特性开关、路由逻辑
/etc/kamailio/kamctlrckamctl 管理工具配置DBENGINE、SIP_DOMAIN、RPC 通道
/etc/default/kamailio服务启动开关与内存参数RUN_KAMAILIO=yes、SHM_MEMORY
/etc/kamailio/kamailio-local.cfg本地覆盖配置(主 cfg 末尾 import_file 引入)监听地址、alias,不污染上游 cfg

kamailio.cfg 主文件内置了特性开关体系:默认 #!define 注释关闭,通过打开 WITH_MYSQL、WITH_AUTH、WITH_USRLOCDB 等定义逐项启用能力,这正是 6.x 配置脚本的设计——单文件覆盖从最小可用到生产级的全部形态。kamailio-local.cfg 的引入点在主 cfg 顶部(实测主 cfg 第 131 行):

####### Include Local Config If Exists #########
import_file "kamailio-local.cfg"

7.2 自定义监听地址与本地域(kamailio-local.cfg)

默认配置监听全部本机地址的 5060 端口(见 4.4 的 Listening on 清单)。生产上常需要自定义端口或声明本地域。创建 /etc/kamailio/kamailio-local.cfg(实测内容):

listen=udp:0.0.0.0:5070
listen=tcp:0.0.0.0:5070
alias="10.0.0.8"

逐项说明:

  • listen=udp:0.0.0.0:5070:UDP 通配监听 5070 端口(0.0.0.0 表示全部 IPv4 本机地址);listen 可多次出现,每条声明一个套接字。
  • listen=tcp:0.0.0.0:5070:TCP 同理;不声明则沿用主 cfg 默认(5060)。
  • alias="10.0.0.8":把 IP 10.0.0.8 声明为本机域别名,使 uri==myself / from_uri==myself 判定把发往该地址的请求视作"发给本服务器"——这是避免 403 Not relaying 的关键(详见 8.1)。

重启服务使配置生效并验证:

service kamailio restart
service kamailio status

实测回显:

 * Restarting Kamailio SIP Server: kamailio
   ...done.
 * Status of Kamailio SIP Server:
 * kamailio is running

监听端口确认(ss -lun 现为 5070):

udp   UNCONN 0      0            0.0.0.0:5070         0.0.0.0:*

7.3 SIP 注册验证(REGISTER 实测)

Kamailio 装好后的第一项功能验证通常选 REGISTER——它是无状态依赖、单报文即可闭环的 SIP 方法,还能顺带验证 usrloc 用户位置表。

💡 技术拓展:SIP 服务器按承担角色分几类,Kamailio 默认脚本覆盖前两类——

角色职责代表
注册服务器 Registrar接收 REGISTER,维护「用户 → 联系地址」映射(usrloc)Kamailio(registrar 模块)
代理服务器 Proxy转发 SIP 请求但不终结对话,不改 From/ToKamailio(tm/sl 模块)
重定向服务器 Redirect返回 3xx 告知新地址,不参与转发Kamailio 可配置
B2BUA两端各维持一段对话,可改写信令与媒体Asterisk、FreeSWITCH

Kamailio 定位前两类(信令面),媒体面(RTP 语音流)需配合 RTPEngine/rtpproxy 或交给 B2BUA 处理。本文验证的是注册服务器角色。

验证需要一个能发送原始 SIP 报文的客户端。以下 Python 脚本(标准库实现,保存为 sip-register.py)向服务器发送 REGISTER 并打印响应:

#!/usr/bin/env python3
"""SIP REGISTER 测试客户端:向指定服务器发送 REGISTER 并打印响应。
用法: sip-register.py <server_ip> <server_port> <ruri_host> <local_ip> [user]
"""
import socket
import sys

server = sys.argv[1]
port = int(sys.argv[2])
ruri_host = sys.argv[3]
local_ip = sys.argv[4] if len(sys.argv) > 4 else server
user = sys.argv[5] if len(sys.argv) > 5 else "1001"

msg = (
    "REGISTER sip:%s SIP/2.0\r\n" % ruri_host
    + "Via: SIP/2.0/UDP %s:5060;branch=z9hG4bKdemo001\r\n" % local_ip
    + "From: <sip:%s@%s>;tag=tag1001\r\n" % (user, ruri_host)
    + "To: <sip:%s@%s>\r\n" % (user, ruri_host)
    + "Call-ID: regtest001@%s\r\n" % local_ip
    + "CSeq: 1 REGISTER\r\n"
    + "Contact: <sip:%s@%s:5060>\r\n" % (user, local_ip)
    + "Max-Forwards: 70\r\n"
    + "Expires: 300\r\n"
    + "Content-Length: 0\r\n"
    + "\r\n"
)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(5)
s.sendto(msg.encode(), (server, port))
print("--- 发送 REGISTER (R-URI: sip:%s@%s:%d) ---" % (user, ruri_host, port))
try:
    data, addr = s.recvfrom(2048)
    text = data.decode(errors="replace")
    print("首行: %s" % text.splitlines()[0])
    print("--- 完整响应 ---")
    print(text)
except socket.timeout:
    print("5 秒内未收到响应")

向服务器 5070 端口发送 REGISTER,R-URI 主机部分填 10.0.0.8(7.2 已声明为本地域):

python3 sip-register.py 10.0.0.8 5070 10.0.0.8 10.0.0.8 regtest001

实测响应:

--- 发送 REGISTER (R-URI: sip:regtest001@10.0.0.8:5070) ---
首行: SIP/2.0 200 OK
--- 完整响应 ---
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.0.0.8:5060;branch=z9hG4bKdemo001;rport=48496;received=10.0.0.1
From: <sip:regtest001@10.0.0.8>;tag=tag1001
To: <sip:regtest001@10.0.0.8>;tag=ebcbe56b0c19158ea93b7456cb7ff6eb.af5407df
Call-ID: regtest001@10.0.0.8
CSeq: 1 REGISTER
Contact: <sip:regtest001@10.0.0.8:5060>;expires=300
Server: kamailio (6.1.5 (x86_64/Linux))
Content-Length: 0

200 OK 且响应 Contact 行回带 expires=300,说明注册成功。再用 kamctl 查 usrloc 内存表确认 AOR(Address of Record)已登记:

kamctl ul show

实测输出(节选):

{
  "jsonrpc":  "2.0",
  "result": {
    "Domains":  [
      {
        "Domain": {
          "Domain": "location",
          "Size": 1024,
          "AoRs": [
            {
              "Info": {
                "AoR":  "regtest001",
                "HashID": 3861581678,
                "Contacts": [
                  {
                    "Contact":  {
                      "Address":  "sip:regtest001@10.0.0.8:5060",
                      "Expires":  296,
                      "Call-ID":  "regtest001@10.0.0.8",
                      "CSeq": 1,
                      "State":  "CS_NEW",
                      "Socket": "udp:0.0.0.0:5070"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}

AOR regtest001 与联系人地址 sip:regtest001@10.0.0.8:5060 均已入表,注册链路(REGISTER → save("location") → usrloc)闭环。若这一步返回的是 403 Not relaying,按 8.1 排障。

八、常见问题(FAQ)

8.1 REGISTER 返回 403 Not relaying

现象:REGISTER 发出后收到 403 Not relaying。实测复现——把 R-URI 主机部分写成一个未声明的地址 10.0.0.99:

python3 sip-register.py 10.0.0.8 5070 10.0.0.99 10.0.0.8 regtest001

实测响应:

--- 发送 REGISTER (R-URI: sip:regtest001@10.0.99:5070) ---
首行: SIP/2.0 403 Not relaying
--- 完整响应 ---
SIP/2.0 403 Not relaying
Via: SIP/2.0/UDP 10.0.0.8:5060;branch=z9hG4bKdemo001;rport=55488;received=10.0.0.1
From: <sip:regtest001@10.0.0.99>;tag=tag1001
To: <sip:regtest001@10.0.0.99>;tag=ebcbe56b0c19158ea93b7456cb7ff6eb.af5407df
Call-ID: regtest001@10.0.0.8
CSeq: 1 REGISTER
Server: kamailio (6.1.5 (x86_64/Linux))
Content-Length: 0

定位:打开调试跟踪重演。在 kamailio.cfg 顶部增加 #!define WITH_DEBUG(debugger 模块会逐条打印配置语句执行轨迹),重启后从 syslog 读取 cfgtrace,实测关键行:

 1(3794) exec: {1 1 REGISTER regtest001@10.0.0.10} *** cfgtrace:dbg_cfg_trace(): request_route=[AUTH] c=[/etc/kamailio/kamailio.cfg] l=872 a=16 n=if
 1(3794) exec: {1 1 REGISTER regtest001@10.0.0.10} *** cfgtrace:dbg_cfg_trace(): request_route=[AUTH] c=[/etc/kamailio/kamailio.cfg] l=867 a=26 n=sl_send_reply
 1(3794) exec: {1 1 REGISTER regtest001@10.0.0.10} *** cfgtrace:dbg_cfg_trace(): request_route=[AUTH] c=[/etc/kamailio/kamailio.cfg] l=868 a=2 n=exit

轨迹显示请求进入 route[AUTH] 后命中 l=867 的 sl_send_reply——对应主 cfg 中 #!else 分支(认证未启用时):

	if(uri!=myself) {
		sl_send_reply("403", "Not relaying");
		exit;
	}

原因:uri!=myself 表示请求 R-URI 的主机部分不是"本机域"。Kamailio 判定 myself 的依据是 listen 绑定的地址 + alias 声明的别名。R-URI 写的是 10.0.0.99,而服务器既没在该地址上监听、也没声明它为别名,出于开放中继防护直接拒绝。

解法一(显式绑定具体 IP):让 listen 精确绑定客户端使用的那个地址(仅适用服务器确实持有该 IP 的场景):

listen=udp:10.0.0.99:5060

解法二(通配监听 + alias 声明,推荐):监听保持通配,把客户端使用的地址声明为本地域别名(即 7.2 的做法):

listen=udp:0.0.0.0:5070
listen=tcp:0.0.0.0:5070
alias="10.0.0.8"

验证:重启后重发 R-URI host 为 alias 声明地址的 REGISTER,实测 200 OK(见 7.3 完整响应),且 kamctl ul show 可见 AOR 入表。两种解法均实测闭环,解法二不依赖具体网卡配置、服务器换 IP 无需改配置,生产优先。

8.2 启动提示 Kamailio not yet configured

现象:执行 service kamailio start(或 systemctl start)报:

 * Kamailio not yet configured. Edit /etc/default/kamailio first.
 * Kamailio not yet configured. Edit /etc/default/kamailio first.

原因与解决:官方 deb 包为防止"裸配置直接暴露在公网"设置了启动闸门——/etc/default/kamailio 中 RUN_KAMAILIO 默认注释。按 4.3 把 #RUN_KAMAILIO=yes 改为 RUN_KAMAILIO=yes 后再启动即可。systemd 部署同样读取该 EnvironmentFile,机制一致。

8.3 apt 源 GPG 校验失败 NO_PUBKEY

现象:配置官方源后 apt-get update 报:

W: GPG error: https://deb.kamailio.org/kamailio61 jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FB40D3E6508EA4C8
E: The repository 'https://deb.kamailio.org/kamailio61 jammy InRelease' is not signed.

原因与解决:signed-by 指向的 keyring 中没有仓库签名钥。两条路:① 按第 4.1 节排障实录从 keyserver.ubuntu.com 拉取公钥(密钥 ID FB40D3E6508EA4C8 是完整指纹 E79ACECB87D8DCD23A20AD2FFB40D3E6508EA4C8 的尾 64 位);② 若 https 源握手失败(实测 pkg.kamailio.org HTTPS 返回 HTTP:000),把源地址改为 http://deb.kamailio.org/kamailio61——apt 元数据本身有 GPG 签名保护,http 传输不影响完整性校验。

九、卸载与清理

完整卸载分三步:停服务 → purge 主包 → autoremove 清依赖,最后验证零残留。

停服务(若在运行):

service kamailio stop

purge 主包(连配置文件一起删除):

DEBIAN_FRONTEND=noninteractive apt-get purge -y kamailio

实测输出(节选):

0 upgraded, 0 newly installed, 1 to remove and 4 not upgraded.
After this operation, 30.3 MB disk space will be freed.
(Reading database ... 6360 files and directories currently installed.)
Removing kamailio (6.1.5+ubuntu22.04) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of stop.
(Reading database ... 5962 files and directories currently installed.)
Purging configuration files for kamailio (6.1.5+ubuntu22.04) ...

清除随装的孤立依赖:

DEBIAN_FRONTEND=noninteractive apt-get autoremove -y

实测输出(节选):

Removing libpython3.10-minimal:amd64 (3.10.12-1~22.04.18) ...
Removing media-types (7.0.0) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

逐项验证零残留:

dpkg -l | grep -c kamailio
ls /etc/kamailio
which kamailio kamctl

实测回显:

0
ls: cannot access '/etc/kamailio': No such file or directory

dpkg 计数为 0、/etc/kamailio 目录已删、kamailio/kamctl 命令消失,卸载闭环。若还装过扩展子包(如 kamailio-mysql-modules),purge 时把包名一并列出即可;数据库中由 kamdbctl 创建的 kamailio 库需另行手工删除。

十、参考链接