Kamailio (原 OpenSER) 是高效能、模組化的 SIP 伺服器,支援註冊、代理、重導向、負載平衡、NAT 穿透等功能。CentOS 6 雖已停止維護,但部分舊系統仍在運行。本文記錄從源碼編譯安裝、資料庫配置、核心參數調整至服務管理的完整流程。
yum groupinstall "Development Tools"yum install mysql-devel libxml2-devel bison flex openssl-devel unixODBC-devel postgresql-devel radiusclient-ng-develcd /usr/local/src
wget https://www.kamailio.org/pub/kamailio/5.6.4/src/kamailio-5.6.4_src.tar.gz
tar zxvf kamailio-5.6.4_src.tar.gz
cd kamailio-5.6.4
# 產生配置
make FLAVOUR=kamailio cfg
# 編輯模組選擇:啟用 db_mysql、移除不需模組
vi modules.lst
# 找到 exclude_modules,刪除 db_mysql
# 編譯安裝
make all
make install
預設安裝路徑:
/usr/local/sbin/kamailio, kamctl, kamdbctl, sercmd/usr/local/etc/kamailio//usr/local/lib64/kamailio/modules/vi /usr/local/etc/kamailio/kamctlrc
# 關鍵參數:
SIP_DOMAIN=yourdomain.com
DBENGINE=MYSQL
DBHOST=localhost
DBNAME=kamailio
DBRWUSER=kamailio
DBRWPW="StrongPassword123"
DBROUSER=kamailioro
DBROPW="ReadOnlyPassword"
DBROOTUSER="root"
# DBROOTPW 留空會提示輸入
/usr/local/sbin/kamdbctl create
# 提示輸入 MySQL root 密碼,自動建立資料表
vi /usr/local/etc/kamailio/kamailio.cfg
# 1. 監聽埠與介面
listen=udp:192.168.1.100:5060
listen=tcp:192.168.1.100:5060
# listen=tls:192.168.1.100:5061 # 若啟用 TLS
# 2. 載入必要模組
loadmodule "db_mysql.so"
loadmodule "registrar.so"
loadmodule "usrloc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "nathelper.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
# 3. 資料庫連線參數 (對應 kamctlrc)
modparam("db_mysql", "db_url", "mysql://kamailio:StrongPassword123@localhost/kamailio")
# 4. 使用者定位資料庫模式
modparam("usrloc", "db_mode", 2) # 2 = 數據庫模式
# 5. NAT 穿透支援
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
# 6. 日誌等級
debug=3
log_stderror=yes
# /etc/init.d/kamailio (SysVinit 風格)
#!/bin/bash
# chkconfig: 345 85 15
# description: Kamailio SIP Server
KAM=/usr/local/sbin/kamailio
CFG=/usr/local/etc/kamailio/kamailio.cfg
PID=/var/run/kamailio/kamailio.pid
USER=kamailio
GROUP=kamailio
start() {
echo -n "Starting Kamailio: "
daemon --user=$USER $KAM -f $CFG -P $PID -u $USER -g $GROUP
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n "Stopping Kamailio: "
killproc -p $PID $KAM
RETVAL=$?
echo
return $RETVAL
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
status) status -p $PID $KAM ;;
*) echo "Usage: $0 {start|stop|restart|status}"; exit 1 ;;
esac
chmod +x /etc/init.d/kamailio
chkconfig --add kamailio
chkconfig kamailio on
service kamailio start
groupadd -r kamailio
useradd -r -g kamailio -s /sbin/nologin -d /var/run/kamailio kamailio
mkdir -p /var/run/kamailio
chown kamailio:kamailio /var/run/kamailio
iptables -A INPUT -p udp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
# TLS
iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
# RTP 媒體埠範圍 (根據實際配置)
iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
service iptables save
ps aux | grep kamailio
netstat -tulpn | grep :5060
sercmd core.uptime # 使用 CLI 工具查詢
# sipp 註冊測試
sipp -sf register.xml -inf users.csv -r 1 -m 1 192.168.1.100:5060
kamctl add 1001@yourdomain.com password123 # 新增用戶
kamctl ls # 列出註冊用戶
kamctl ul show # 顯示用戶位置表
kamctl fifo get_stats all # 統計資訊
| 參數 | 建議值 | 說明 |
|---|---|---|
| children | CPU 核心數 × 2 | 子進程數,處理並發 |
| shm_mem | 256-512 MB | 共享記憶體,視用戶數調整 |
| pkg_mem | 64-128 MB | 每進程私有記憶體 |
| tcp_children | 同 children | TCP 子進程數 |
| tcp_connection_lifetime | 3600 | TCP 連線生命週期(秒) |
在 kamailio.cfg 開頭設定:
children=8
shm_mem=256
pkg_mem=64
| 現象 | 解決 |
|---|---|
| 啟動失敗 "db_mysql.so: cannot open shared object" | ldconfig 刷新庫快取,確認 /usr/local/lib64/kamailio/modules/db_mysql.so 存在 |
| 資料庫連線失敗 | 檢查 MySQL 服務、防火牆、kamctlrc 密碼、GRANT ALL ON kamailio.* TO 'kamailio'@'localhost' |
| NAT 穿透失敗 | 確認 nathelper 模組載入、natping_interval 設定、防火牆 UDP 通訊 |
| 高併發下回應延遲 | 增加 children、shm_mem、啟用 async 模組 |
CentOS 6 編譯安裝 Kamailio 核心流程:安裝開發工具與依賴 → 下載源碼 → make cfg → 編輯 modules.lst 啟用 db_mysql → make all install → 配置 kamctlrc 建立資料庫 → 調整 kamailio.cfg 核心參數 → 建立服務腳本 → 開放防火牆 → 驗證測試。雖 CentOS 6 已 EOL,但此流程適用於所有 RHEL 系發行版,掌握編譯安裝可靈活控制模組與版本。