美文网首页SIP协议
Opensips服务器在Ubuntu下的搭建

Opensips服务器在Ubuntu下的搭建

作者: Muse_Ykh | 来源:发表于2020-03-17 16:59 被阅读0次

Opensips服务器在Ubuntu下的搭建

远程服务器方面使用的是谷歌云,具体VM实例创建不再赘述,要注意的一点就是谷歌云上自带的防火墙出入站规则记得要允许Sip协议的包的通过,可以采取谷歌云出入站不做防护,全通过,然后使用系统内部防火墙来进行防护。

准备工作

安装依赖

apt-get install bison 
                flex  
                mysql-server 
                mysql-client 
                libncurses5-dev 
                make 
                libssl-dev 
                libmysqlclient-dev 
                iptables-dev 
                libip4tc-dev
                git

其中libip4tc等包可能会遇到找不到包的情况,所以需要添加一下软件源,软件源列表的路径为/etc/apt/sources.list,在末尾加上一句

deb http://ftp.de.debian.org/debian sid main non-free

其中http://ftp.de.debian.org/debian部分需要按照VM实际所在地区来替换,具体选择可以参考,我这边由于VM所在地区是日本,所以采用的是ftp.jp.debian.org/debian

数据库MySQL的初始化配置(安装MySQL时已经配置好账号密码可忽略)

Ubuntu下面实测在安装MySQL时是会有命令行选项来帮助你傻瓜式的初始化的,若没有进行相关的配置或者是在其他Linux系统下安装,需要手动配置。具体为进入mysql后,输入:

// 设置密码
set password for 'root'@'localhost' =password('123456');
// 设置远程访问及全表权限
grant all privileges on *.* to root@'%'identified by '123456';
// 更新权限
flush privileges;

设置防火墙

Ubuntu下默认使用的是iptables,这边需要为Opensips打开5060端口

$ iptables -I INPUT -p tcp –dport 5060 -j ACCEPT
$ iptables -I INPUT -p udp –dport 5060 -j ACCEPT
$ iptables-save

Opensips的安装

下载源码并编译配置

cd /usr/local/src
git clone https://github.com/OpenSIPS/opensips.git -b 2.4 opensips-2.4
cd opensips-2.4
make all
make menuconfig

注意make all的过程中若遇到编译错误,记得要先安装对应的相关依赖,再make all一次,成功编译后再进行make menuconfig

Image
大概能看到类似上图的配置界面,此时可以使用 选择/进入/退出
,配置路径为:

Configure Compile Options---> Configure Excluded Modules---> 下拉后用空格选中[*] db_mysql---> 返回后选择Compile And Install OpenSIPS

目录结构

安装完成后可以再下列目录中看到对应的配置文件和运行程序文件

# 配置文件目录
[root@localhost /]# ls /usr/local/etc/opensips/
opensips.cfg  opensipsctlrc  osipsconsolerc  scenario_callcenter.xml
# 运行程序目录
[root@localhost /]# ls /usr/local/sbin
opensips  opensipsctl  opensipsdbctl  opensipsunix  osipsconfig  osipsconsole

配置文件opensips.cfg内容结构

opensips.cfg是我们主要要修改的配置文件,opensips.cfg的内容结构主要分三部分,分别是:

  • 全局变量

    例如:

    log_level=4
    log_stderror=no
    log_facility=LOG_LOCAL0
    
    listen=udp:127.0.0.1:5060
    
    disable_tcp=yes
    disable_tls=yes
    
  • 模块配置

    主要用来描述模块的加载以及参数的配置修改,例如:

    loadmodule “db_mysql.so”
    loadmodule “auth.so”
    loadmodule “auth_db.so”
    modparam(“auth”, “calculate_ha1”, yes)
    modparam(“auth_db”, “password_column”, “password”)
    
  • 路由策略

    主要用来描述Opensips整体的路由逻辑,例如:

    route{
          # initial NAT handling; detect if the request comes from behind a NAT
          # and apply contact fixing
          force_rport();
          if (nat_uac_test("23")) {
                  if (is_method("REGISTER")) {
                          fix_nated_register();
                          setbflag(NAT);
                  } else {
                          fix_nated_contact();
                          setflag(NAT);
                  }
          }
    }
    

其中模块配置和路由策略一般情况下不建议自己编写,建议由osipsconfig的脚本来生成,然后再根据自己的需求修改原有配置内容

osipsconfig生成脚本并修改配置

进入运行程序目录/usr/local/sbin,运行osipsconfig进入图形界面,Generate OpenSIPS Script ---> Residential Script ---> Configure Residential Script,选中下列几项

[*] ENABLE_TCP
[*] USE_ALIASES
[*] USE_AUTH
[*] USE_DBACC
[*] USE_DBUSRLOC
[*] USE_DIALOG
[*] USE_NAT

返回到上一级后选择Generate Residential Script,然后在配置文件目录下将生成一个新的opensips_residential_*.cfg文件,此时我们可以使用命令将原有的配置文件替换掉

cd /usr/local/etc/opensips/
rm opensips.cfg
mv opensips_residential_*.cfg opensips.cfg

接着我们来修改新的opensips.cfg,需要修改配置的地方我会单独隔开

####### Global Parameters #########

/* log_level这边可以根据实际调试的需要来修改 */
log_level=4
log_stderror=no
log_facility=LOG_LOCAL0

children=4

auto_aliases=no
/* 这里前面的这个IP为你的本地IP,具体可以使用ifconfig查看或者在谷歌云上查看
   后面的这个IP为你的外网IP,以谷歌云上外网IP为准(记得外网IP要改成静态,不然会出现临时IP改变,服务被访问的情况)*/
listen=udp:10.146.0.3:5060 as 35.221.xx.xx:5060   # CUSTOMIZE ME
listen=tcp:10.146.0.3:5060 as 35.221.xx.xx:5060   # CUSTOMIZE ME
####### Modules Section ########

#set module path
mpath="/usr/local//lib64/opensips/modules/"

#### SIGNALING module
loadmodule "signaling.so"

#### StateLess module
loadmodule "sl.so"

#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 5)
modparam("tm", "fr_inv_timeout", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
modparam("tm", "onreply_avp_mode", 1)

/* 中间模块部分省略,不用修改 */

####  NAT modules
loadmodule "nathelper.so"
modparam("nathelper", "natping_interval", 10)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", "SIP_PING_FLAG")
modparam("nathelper", "sipping_from", "sip:pinger@127.0.0.1") #CUSTOMIZE ME
modparam("nathelper", "received_avp", "$avp(received_nh)")

loadmodule "rtpproxy.so"
/* 此处的rtpproxy的端口地址可以随意修改,但要与后面配置的端口号保持一致 */
modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:12221")

在此处加入MediaProxy模块

#### MediaProxy module
loadmodule "mediaproxy.so"
modparam("mediaproxy", "disable", 0)
modparam("mediaproxy", "mediaproxy_socket", "/var/run/mediaproxy/dispatcher.sock")
modparam("mediaproxy", "mediaproxy_timeout", 1000)
modparam("mediaproxy", "signaling_ip_avp", "$avp(nat_ip)")
modparam("mediaproxy", "media_relay_avp", "$avp(media_relay)")
modparam("mediaproxy", "ice_candidate", "low-priority")

loadmodule "proto_udp.so"
loadmodule "proto_tcp.so"


####### Routing Logic ########
/* 中间路由逻辑部分省略,不用修改 */

    if (has_totag()) {
        /* 省略代码,不用修改 */
    } else {
        /* 需要添加部分 */
                #added for mediaproxy
                if (is_method("INVITE") && !has_totag()) {
                        engage_media_proxy();
                }
    }

/* 后面路由逻辑部分省略,不用修改 */ 

全部修改完后记得wq保存退出

opensipsctlrc配置修改

opensipsctlrc文件主要修改域名以及数据库相关的配置

/* 实际要修改的主要是这边的是个IP或域名,剩下的只需要将原本的注释解开即可 */
SIP_DOMAIN=35.221.xx.xx

DBENGINE=MYSQL

## database port (PostgreSQL=5432 default; MYSQL=3306 default)
DBPORT=3306

## database host
DBHOST=localhost

## database name (for ORACLE this is TNS name)
DBNAME=opensips

## database read/write user
DBRWUSER=opensips

## password for database read/write user
DBRWPW="opensipsrw"

## engine type for the MySQL/MariaDB tabels (default InnoDB)
# MYSQL_ENGINE="MyISAM"

## database super user (for ORACLE this is 'scheme-creator' user)
DBROOTUSER="root"

配置完成之后我们可以使用到运行程序目录来创建数据库及用户数据

cd /usr/local/sbin/
opensipsdbctl create
opensipsctl domain add xxx.org # 如果没有域名可不用添加
opensipsctl add 10000 123456 # 前后分别为账号密码
opensipsctl add 10001 123456

至此Opensips部分的配置已经完成,基于现有的配置已经可以正常进行局域网下的通话了,但是既然我们都已经要部署在互联网下了,那么自然不想受到局域网的束缚,所以接着我们要安装和配置RTPProxy以及MediaProxy来实现互联网下的媒体中继

安装配置RTPProxy

$ sudo apt-get install rtpproxy
$ sudo vi /etc/default/rtpproxy

修改内容如下

# The control socket.
# CONTROL_SOCK="unix:/var/run/rtpproxy/rtpproxy.sock"
# To listen on an UDP socket, uncomment this line:

/* 此处的端口号要与opensips.cfg下的rtpproxy端口号相同 */
CONTROL_SOCK=udp:127.0.0.1:12221

# Additional options that are passed to the daemon.
EXTRA_OPTS=""
/* 此处为外网IP */
LISTEN_ADDR=35.221.xx.xx
EXTRA_OPTS="-l ${LISTEN_ADDR}"

然后启动RTPProxy即可(记得每次RTPProxy都需要在Opensips服务之前启动)

$ sudo killall rtpproxy
$ sudo /etc/init.d/rtpproxy start

安装配置MediaProxy

导入源密钥,增加mediaproxy的源到/etc/apt/sources.list

$ wget http://download.ag-projects.com/agp-debian-gpg.key
$ sudo apt-key add agp-debian-gpg.key
$ sudo vi /etc/apt/sources.list

同样在末尾添加

deb http://ag-projects.com/ubuntu stretch main
deb-src http://ag-projects.com/ubuntu stretch main

此处的stretchLinux发行版本,我这边谷歌云使用的系统镜像为ubuntu-1604-xenial-v20200129,故使用的对应的stretch,若版本不一致,需根据实际发行版本进行相应的修改

添加完软件源之后即可开始安装MediaProxy

$ sudo apt-get update
$ sudo apt-get install mediaproxy-dispatcher mediaproxy-relay mediaproxy-web-sessions

media-relay需要内核支持ipv4 forwarding,所以需要执行(以root用户执行):

$ sudo su
$ echo 1 > /proc/sys/net/ipv4/ip_forward

注意:可以vi /proc/sys/net/ipv4/ip_forward查看里面是否为1,有时候还是为0,如果此时为0,继续执行一遍echo 1 > /proc/sys/net/ipv4/ip_forward,直到里面的内容为1。在文件/etc/sysctl.config中打开net.ipv4.ip_forward=1,这样即便重启设备也可以运行MediaProxy了。

另外,mediadispatcherrelay之间需要通过tls通信,故需要在/etc/mediaproxy/tls/中有认证文件,在/usr/share/doc/mediaproxy-common/tls/*中有一份官方提供的证书文件,但不太建议使用,因为会有证书安全的问题,故推荐按照官方说明文件中的方法生成一套证书文件,具体参考官方tls说明文件

接着我们修改MediaProxy的配置文件

cd /etc/mediaproxy/
vi config.ini
[Relay]
dispatchers = 10.146.0.3
passport = None
delay_ip = 35.221.xx.xx
advertised_ip = 35.221.xx.xx
port_range = 50000:60000
log_level = DEBUG
stream_timeout = 3600
on_hold_timeout = 7200
reconnect_delay = 10
traffic_sampling_period = 15
[Dispatcher]
socket_path = dispatcher.sock
listen = 10.146.0.3
listen_management = 10.146.0.3
management_use_tls = yes
passport = None
management_passport = None
log_level = DEBUG
relay_timeout = 5
[TLS]
certs_path = tls
verify_interval = 300
[Database]
[Radius]
[OpenSIPS]
socket_path = /var/run/mediaproxy
max_connections = 10

其中10.146.0.3依旧是你的内网IP,delay_ip以及advertised_ip是你的外网IP

修改完配置之后就可以启动MediaProxy服务了

service mediaproxy-dispatcher restart
service mediaproxy-relay restart

启动完了之后需要使用以下命令来查看服务启动的状态

service mediaproxy-dispatcher status
service mediaproxy-relay status

如果没有正常启动,则可以直接在status或者通过/var/log/syslog命令查看原因。

启动服务并验证

Opensips的日志保存在/var/log/opensips.log,修改日志文件配置。

$ sudo touch /var/log/opensips.log
$ sudo chmod 777 /var/log/opensips.log
$ sudo vi /etc/rsyslog.d/opensips.conf

增加如下内容

local0.* /var/log/opensips.log

重启syslog服务,启动opensips

$ sudo service rsyslog restart
$ sudo opensipsctl start

如果启动失败,查看/var/log/opensips.log文件查找错误。

后续若修改了Opensips的配置,则也只需要运行下列命令即可

opensipsctl restart

另附Opensips官方文档地址

至此Opensips+RTPProxy+MediaProxy的搭建已经完成,使用遵循标准SIP协议的客户端测试验证即可

相关文章

网友评论

    本文标题:Opensips服务器在Ubuntu下的搭建

    本文链接:https://www.haomeiwen.com/subject/xjatyhtx.html