zoukankan      html  css  js  c++  java
  • 安装配置opensips过程记录

    本文操作系统为CentOS,所用Opensips版本为1.8.2。

    Update2013/6/27: 版本1.9.1也已验证通过,下载地址为http://opensips.org/pub/opensips/latest/src/opensips-1.9.1_src.tar.gz

    安装CentOS

    (若已有环境可跳过此步骤)

    1、安装虚拟机,VMWare Server 2.0遇到问题无法显示console(Chrome里),换为Virtualbox 4.2后可正常使用;

    2、在虚拟机里安装CentOS 6.3,选择standard server类型安装。

    对这种纯命令行界面的虚拟机,可以用telnet直接访问,操作剪贴板什么的比较方便;

    若虚拟机映射的网卡没有自动启动,用ifup eth0命令启动。

    若(Virtualbox的)虚拟机是复制过来的,可能需要先删除 /etc/udev/rules.d/70-persistent-net.rules,再修改/etc/sysconfig/network-scripts/ifcfg-eth0里的HWAddr地址。

    若需要配置网卡ip地址,先ifconfig -a查看网卡设备号和MAC地址,然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,示例如下:

    DEVICE="eth0"
    BOOTPROTO="none"
    HWADDR="08:00:27:81:30:F4"
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    TYPE="Ethernet"
    UUID="dcd43c45-adf4-480b-b461-179ee8d2e8d6"
    IPADDR=192.168.1.120
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1

    在/etc/resolv.conf里指定dns以便安装软件包(CentOS6以后可以在ifg-eth0里指定dns了)

    nameserver 202.181.202.140
    nameserver 208.67.220.220

    安装Opensips(根据官方的Tutorial视频整理的主要步骤)

    opensips提供了一个视频教程(这个页面有下载链接,90M),推荐使用menuconfig方式,更方便且不容易出错。以下为步骤摘要:

    yum install gcc make
    yum install flex bison ncurses libncurses-dev ncurses-devel
    yum install mysql mysql-server mysql-libs mysql-devel

    wget http://opensips.org/pub/opensips/1.8.2/src/opensips-1.8.2_src.tar.gz
    tar zxvf opensips-1.8.2_src.tar.gz
    cd opensips-1.8.2-tls

    make menuconfig (勾选db_mysql,其他不用动)
    菜单里选"Compile And Install Opensips"
    退出menuconfig

    vi /usr/etc/opensips/opensipsctlrc,把与mysql有关的注释去掉(DB_PATH和USERCOL保留注释)
    service mysqld start
    opensipsdbctl create(提示的两个问题都选no)
    osipsconfig (选择ENABLE_TCP,USE_AUTH,USE_DBACC,USE_DBUSERLOC,USE_DIALOG,然后generate residential script)
    用生成的opensips_residential_xxx.cfg替换原先的opensips.cfg

    vi /usr/etc/opensips/opensips.cfg (改listen地址和mpath,后者一般是/usr/lib/opensips/modules)
    opensipsctl start (netstat -anp查端口)
    service iptables stop (关闭防火墙)

    如果启动opensips时提示错误,检查/var/log/messages(若opensips.cfg里设置了log_stderror=no则日志都进入此文件,链接),一般是模块参数未设置引起的。例如在log里发现“ERROR:uri:db_checks_fixup1: configuration error - no database URL is configured!”,则在opensips.cfg里的“loadmodule "uri.so"”后添加modparam("uri", "db_url","mysql://opensips:opensipsrw@localhost/opensips")即可。

    创建测试用户:

    opensipsctl add 101 101

    如果创建用户时提示“ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN”,可修改opensipsctlrc文件将SIP_DOMAIN设为本机域名或IP地址。

    进一步配置Opensips

    设置日志输出方式

    在opensips.cfg里有几个参数控制日志的输出:

    debug=3 #此值控制日志输出的详细程度,3为普通,4为详细(会产生很多日志)。
    log_stderror=no #设置为no表示将日志输出到文件,否则输出到控制台(应该是以前台方式启动opensips服务时才有用)。
    log_facility=LOG_LOCAL0 #应该是用于在syslog服务的配置文件里区分opensips产生的日志(见下面“使用独立的log文件”)。
    fork=yes #设置为yes表示在后台启动opensips服务,设置为no表示在前台启动。

    使用独立的log文件

    opensips使用syslog服务,所以缺省情况下日志会进入/var/log/message这个文件,如果希望使用独立的log文件,可以这样设置:

    touch /var/log/opensips.log
    vi /etc/rsyslog.conf  --> 增加一行:local0.*             /var/log/opensips.log
    /etc/init.d/rsyslog restart

    配置STUN模块

    opensips自带一个stun模块,可以实现stun服务器的功能(需要双网卡)。配置方法也很简单(官方文档),在opensips.cfg里添加如下内容:

    #### STUN module
    loadmodule "stun.so"
    modparam("stun", "primary_ip", "11.22.33.44") #opensips服务器的ip地址
    modparam("stun", "primary_port", "5060") #必须与opensips的udp端口相同(一般是5060)
    modparam("stun", "alternate_ip", "55.66.77.88") #另一网卡的ip地址
    modparam("stun", "alternate_port", "3479") #另一端口号

    配置好stun以后,可以使用stun-client来测试,以windows下为例,测试命令为:

    stun-client-0-96.exe 11.22.33.44:5060 -v

    安装配置RTPProxy模块

    rtpproxy模块通常与nathelper模块一起使用。首先要确保服务器上已经安装了rtpproxy,启动rtpproxy:

    rtpproxy -F

    然后在opensips.cfg文件里做如下配置:

    loadmodule "rtpproxy.so"
    modparam("rtpproxy", "rtpproxy_sock", "unix:/var/run/rtpproxy.sock") # CUSTOMIZE ME

    安装配置MediaProxy模块

    MediaProxy官方文档链接

    一个在CentOS6上安装MediaProxy2.5.2的参考链接

    下载mediaproxy源码(和所需要的各种依赖包),并安装(过程略)。安装完成后:

    把config.ini.sample复制到/etc/mediaproxy/config.ini,把tls目录也复制过来。

    echo 1 > /proc/sys/net/ipv4/ip_forward

    media-dispatcher restart

    media-relay restart

    在opensips.cfg里配置mediaproxy模块,如下:

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

    若mediaproxy提示“No suitable relay found”,可能是certification方面的问题。 参考链接

    (未完)

    抓取SIP包

    在Opensips所在服务器上使用tcpdump可以抓取SIP包以便分析问题(注意要抓取的网卡是eth0或eth1):

    tcpdump -nqt -s 0 -A -i eth0 port 5060 -w /home/capture_file_name.pcap

    参考:http://jonathanmanning.com/2009/10/26/how-to-voip-sip-capture-with-tcpdump-on-linux/

    要抓手机上的包稍微复杂一些,要先root手机,然后把tcpdump复制到手机上使用:

    adb shell
    su
    tcpdump -nqt -s 0 -w /sdcard/packets_xx.pcap
    adb pull /sdcard/packets_xx.pcap

    具体请参考这篇文章

    安装opensips-cp

    从sourceforge下载opensips-cp源码压缩包后,里面附有名为INSTALL的文档,建议根据这个文档进行安装,网上能查到的一些资料往往是过期的或不准确的。

    yum install httpd php php-mysql php-xmlrpc php-pear

    pear install MDB2
    pear install MDB2#mysql
    pear install MDB2#mysqli
    pear install log

    在/etc/php.ini里:
    把short_open_tag置为On
    把/usr/share/pear加到inculde_path变量里(一些教程写的是加/usr/share/php,实际检验要加/usr/share/pear)

    wget http://sourceforge.net/projects/opensips-cp/files/opensips-cp/5.0/opensips-cp_5.0.tgz/download

    tar -zxvf opensips-cp_5.0.tgz

    将解压缩后的文件夹(名字一般是“5.0”)复制到/var/www目录下,并改名为opensips-cp

    vi /etc/httpd/conf/httpd.conf,添加下面一行:

    Alias /cp "/var/www/opensips-cp/web"

    chown apache:apache /var/www/opensips-cp/config/access.log (如果是其他版本linux,用户名可能是www-data或其他)

    (随源码附带的安装文档INSTALL有点看不懂,postgresql应该是与mysql二选一。)

    安装必须的admin:

    cd /var/www/opensips-cp/config/tools/admin/add_admin/

    mysql -Dopensips -p<ocp_admin_privileges.mysql

    mysql -uroot opensips进入mysql命令行,执行下面的命令添加管理员用户:

    INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');

    安装cdrviewer:

    cd /var/www/opensips-cp/config/tools/system/cdrviewer/

    mysql -Dopensips -p < cdrs.mysql

    mysql -Dopensips -p<opensips_cdrs.mysql

    cd /var/www/opensips-cp/cron_job

    vi generate-cdrs_mysql.sh (填写数据库连接信息)

    注意,generate-cdrs_mysql.sh这个文件里的“call opensips_cdrs_1_6()”可能要改为“call opensips_cdrs()”,必须要与opensips_cdrs.mysql里定义的名称一致。

    vi /etc/crontab (添加定时任务,例如每三分钟生成一次:*/3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh)

    安装smonitor:

    cd /var/www/opensips-cp/config/tools/system/smonitor/ (此处INSTALL文档有笔误,这里已更正)

    mysql -Dopensips -p < tables.mysql

    vi /etc/crontab (添加定时任务,例如每分钟一次:* * * * * root php /var/www/opensips-cp/cron_job/get_opensips_stats.php > /dev/null)

    安装add_user:

    (最前面已经装过了ocp_admin_privileges.mysql,这里应该不需要再做一次,INSTALL文档的小问题不少)

    启动opensips-cp:

    service mysqld start

    service httpd start

    打开浏览器访问http://xxx.xxx.xxx.xxx/cp/ 应该能看到登录界面,用之前创建的admin用户登录。

    未完待续..

    其他有用链接

    Opensips官方论坛

    关于sip和sip的客户端

    Best practices for SIP NAT traversal

    一些问题和解决

    服务器端保持连接:使用 nat_traversal或nathelper模块(根据讨论组里的一些帖子,这两个模块的功能几乎相同),让opensips每个一段时间向客户端发一个包,使得路由器上的端口映射将保持(即洞口一直打开)。在客户端抓包时应该可以看到这些来自服务器的sip包,一般名称为OPTIONS。

    客户端接收到INVITE命令后没有RING:很奇怪的问题,但在我这里时不时的发生,客户端程序为Boghe v2.0.153.836,暂时还没有找到原因和解决方法。

    路由器修改SIP包:使用Volans VE602W作为路由器,从客户端发出的REGISTER包里的Via字段会被修改为公网地址,导致opensips服务器判断是否来自内网(nat_traversal模块中的nat_client_test方法)失败,其他三个路由器(TPLink、Mercury和Buffalo没有这种情况)。暂时没有找到解决方法。这里有一个类似问题。

    客户端接收到重复的OPTIONS消息:由于重复(通过不同路由器)登录到opensips,Opensips有时会发送多个OPTIONS包给客户端,直到服务器认为客户端已经掉线。若客户端在REGISTER消息的Contact字段里添加了expires=xxx时,服务器会在location表里记录客户端失效的时间,若这个时间很长则服务器会一直尝试连接客户端。

    有时接通以后没有视频画面:遇到过这样的问题:拨打十次,每次都能接通,但有时没有画面。后来发现是服务器防火墙禁止了一些端口(用iptables --list INPUT查询发现服务器仅允许udp 35000~50000进入)。解决方法是启动rtpproxy时指定端口范围,例如rtpproxy -m 40000 -M 50000 -F。

    Contact URI字段没有被改为公网IP:通过增加调试信息发现虽然fix_nated_contact()方法已经被调用,但服务器端发回的sip包里Contact URI里的内网地址并没有被替换为公网地址。在公司没有这个问题,在家有这个问题(更换路由器无效),暂时没找到原因。(更正:这个问题本身有误,应该观察从服务器返回的200OK消息,而不是服务器接收到的原始消息)

    单向有声音/视频或仅音频能拨通:可能是SIP包的长度超出了网络设备的MTU值,在UDP协议下,如果客户端不能处理过长的SIP包(一般是带有SDP的那些SIP消息,而且视频请求比音频请求产生的SIP消息要大),多出的部分可能会被丢弃,导致服务器发送/接收的SIP包失效。解决办法有:1)切换到TCP协议;2)精简SIP包尺寸,有些客户端生成的SIP包里带有不必要的字段可以删除掉(如果能够定制开发的话),另外这里有一个参考链接;3)使用支持超长UDP包或SIP包比较小的客户端(我用的基于doubango的boghe这部分做的不太好,换用x-lite后发现同样的请求SIP包长度小很多:18xx vs 10xx)。

    清除在线用户:用opensipsctl ul rm id可以删除一个在线用户,一个用户段时间内多次登录时会造成重复记录,这时可能需要清除掉这个用户的在线状态。

    如果觉得本文内容有帮助:试试我开发的Android应用 应用计时折扣君推荐+1(需登录)

  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/bjzhanghao/p/2910903.html
Copyright © 2011-2022 走看看