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

参考

猜你喜欢

转载自blog.csdn.net/kencaber/article/details/105221760
今日推荐