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
Image注意
make all
的过程中若遇到编译错误,记得要先安装对应的相关依赖,再make all
一次,成功编译后再进行make menuconfig
大概能看到类似上图的配置界面,此时可以使用
↑
↓
←
→
来选择/进入/退出
,配置路径为:
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
此处的stretch
为Linux
发行版本,我这边谷歌云使用的系统镜像为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
了。
另外,media
的dispatcher
和relay
之间需要通过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
协议的客户端测试验证即可
网友评论