kamailio 安裝教程

安裝 kamailio

首先在本地局域網做實驗:

wget -O- https://deb.kamailio.org/kamailiodebkey.gpg | sudo apt-key add -
sudo vi /etc/apt/sources.list
# deb     http://deb.kamailio.org/kamailio53 jessie  main
# deb     http://deb.kamailio.org/kamailio53 stretch  main
sudo apt install mysql-server
sudo apt install kamailio kamailio-mysql-modules kamailio-tls-modules kamailio-presence-modules kamailio-json-modules
sudo vi /etc/kamailio/kamctlrc
# change SIP_DOMAIN to your SIP service domain or IP
# change DBENGINE to MYSQL
# optional change default password by modifying DBRWPW and DBROPW, if you changed the value
# of DBRWPW in kamctlrc, you must update the value of DBURL define inside kamailio.cfg.
#!define DBURL "mysql://kamailio:_NEW_DBRWPW_@localhost/kamailio"
sudo vi /etc/kamailio/kamailio.cfg
# add these after the first line (the # is neccessary)
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_USRLOCDB
#!define WITH_PRESENCE
sudo kamdbctl create
sudo systemctl start kamailio
# add user 1001 and set password 1234
sudo kamctl add 1001 1234
# add domain 192.168.1.252 or your server domain
sudo kamctl domain add 192.168.1.252

然後安裝 Linphone 桌面版,用 WireShark 抓包可以瞭解 SIP 服務的工作情況。

Bug

Description

I am installing kamailio according to kamailio-install-guide-deb. And I use the command to create database:

sudo kamdbctl create

It works fine, then I use this command:

sudo kamdbctl reinit

The output is:

33mINFO: creating database kamailio ...
-e \E[37;33mINFO: granting privileges to database kamailio ...
ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'kamailio'@'localhost'
-e \E[37;31mERROR: granting privileges to database kamailio failed!

I found that the user kamailio and kamailioro are not deleted, so I delete them in MySQL server:

$ sudo mysql -u root -p
mysql > drop user kamailio@localhost;
mysql > drop user kamailioro@localhost;

And then try again:

sudo kamdbctl reinit

Still output:

33mINFO: creating database kamailio ...
-e \E[37;33mINFO: granting privileges to database kamailio ...
ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'kamailio'@'localhost'
-e \E[37;31mERROR: granting privileges to database kamailio failed!

Possible Solutions

Locate kamailio_db_grant() in /usr/lib/x86_64-linux-gnu/kamailio/kamctl/kamdbctl.mysql. Add FLUSH PRIVILEGES; before CREATE USER ... and the issue is fixed.

It’s my first time to use kamailio, so I don’t know whether it is a problem. Looking forward to your suggestions, thanks!

Additional Information

version: kamailio 5.3.3 (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_BLACKLIST, HAVE_RESOLV_RES, TLS_PTHREAD_MUTEX_SHARED
ADAPTIVE_WAIT_LOOPS 1024, MAX_RECV_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.
id: unknown 
compiled with gcc 6.3.0

Debian 9.0 Stretch

在雲服務器上配置

此時在公網IP服務器上配置後,我們的 SIP 客戶端會收到 403 Not relaying 錯誤。根據 (Stackoverflow)Authentication issue in SIP server,需要配置 /etc/kamailio/kamailio.cfg,搜索 alias,取消註釋並設置爲你的服務器域名。

執行 sudo service kamailio restart,這時我們就可以成功登錄了。

需要注意,SIP 的 RTP 流是雙方直接傳達的,服務器不會進行流轉發。故若兩個人沒有公網 IP,他們無法通信。要令服務器轉發流,需要服務器有較大的帶寬,並且需要安裝 RTPproxy

git clone -b master https://github.com/sippy/rtpproxy.git
git -C rtpproxy submodule update --init --recursive
cd rtpproxy
./configure
make clean all
make install

當服務器收到 INVITE 請求時,它從中提取 call-ID 並將其通過 Unix 域套接字傳遞給代理。代理將查找具有此 ID 的現有會話:

  • 如果該會話存在,它將返回該會話的 UDP 端口
  • 如果不存在,則它將創建一個新會話,並綁定到(編譯時)指定範圍內的第一個空 UDP 端口,並返回數字該端口到 kamailio。kamailio 收到後將替換 SDP 中的 media ip:port 指向代理,並照常轉發請求。

當服務器收到帶有 SDP 的非否定 SIP 答覆時,它將再次從中提取呼叫 ID,並將其傳送給代理。在這種情況下,代理不分配新的會話(如果該會話不存在),而是僅在現有會話中執行查找,如果找到該會話,則返回端口號,或者返回錯誤代碼,指示不存在具有該 ID 的會話。 kamailio 收到代理的肯定答覆後,將替換 SIP 答覆中的 media ip:port 以指向代理,並照常轉發答覆。

創建會話後,代理將監聽爲其分配的用於該會話的端口,並等待從參與呼叫的兩個參與方中的每個接收至少一個 UDP 數據包。一旦接收到此類數據包,代理就會使用該數據包的源 ip:port 填充與每個呼叫關聯的兩個 ip:port 結構之一。當兩個結構都填滿時,代理服務器開始在各方之間中繼 UDP 數據包

代理會跟蹤每個現有會話的空閒時間(即沒有中繼數據包的時間),並自動清除空閒時間超過(編譯時)指定值(默認爲 60 秒)的會話。

/etc/kamailio/kamailio.cfg 加上

#!define WITH_NAT

執行如下命令啓動代理,並指定最大句柄數量(4096,這個是指整個系統的最大句柄數量,而不是 RTPProxy 可以使用的最大句柄數量)和端口範圍(10000-40000):

rtpproxy -l _your_public_ip_ -L 4096 -m 10000 -M 40000 -s udp:localhost:7722 

注意上面的 -s udp:localhost:7722 是爲 kamailio 控制 RTPProxy 而留的控制套接字,無需修改。


或者也可以用 systemctl 來啓動服務,這需要先安裝 libsystemd-dev,並在編譯前指定 ./configure --enable-systemd

創建文件 /etc/systemd/system/sockets.target.wants/rtpproxy.socket 內容如下:

[Socket]
ListenStream=/var/run/rtpproxy/rtpproxy.sock
SocketUser=rtpproxy
SocketGroup=rtpproxy
SocketMode=755
ExecStartPost=-/bin/chown rtpproxy:rtpproxy /var/run/rtpproxy

[Install]
WantedBy=sockets.target

編輯 rtpproxy.service,修改如下設置

ExecStart=/usr/local/bin/rtpproxy -p /var/run/rtpproxy/rtpproxy.pid -s systemd: -u rtpproxy:rtpproxy -n unix:/var/run/rtpproxy/rtpproxy_timeout.sock -f -l 0.0.0.0 -m 10000 -M 20000 -d INFO:LOG_DAEMON

然後執行:

sudo systemctl daemon-reload
sudo systemctl enable rtpproxy.socket
sudo systemctl start rtpproxy.socket
sudo systemctl enable rtpproxy.service
sudo systemctl start rtpproxy.service

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章