安裝配置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可以刪除一個在線用戶,一個用戶段時間內多次登錄時會造成重復記錄,這時可能需要清除掉這個用戶的在線狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM