目前对于VOIP这块网上很少有详细配置资料,即便是有对于初学者来说都是似懂非懂的,本文结合网上部分资料并整理,若有问题请评论说明。

ICE(互动式建立连接)试着寻找最佳路线去建立连接方式,它会并行的寻找所有的可能性,然后选择最有效的可行方式,它首先尝试用设备系统或网卡获取到的主机地址去连接,如果这个失败了(设备在NAT后就会),ICE会从STUN服务器获取外部地址进行连接,如果这个也失败了,就用TURN中转服务器做通讯。


首先说下实现NAT穿越的几种方式:

  1. 针对客户端的解决方案:STUN、TURN、ICE

  2. 路由边界解决方案:应用层网关ALG、通用即插即用uPNP、中间盒通信MIDCOM

  3. 服务器端解决方案:B2BUA、服务端RTP中继、会话边界控制SBC、FULL-PROXY、隧道技术

  4. 还有RSIP


如何区分对称和非对称NAT:

网关设备在实现NAT时,对于内网某主机的若干UDP请求,网关设备对应地在外网上所建立的UDP端口数量

对称NAT是一个请求对应一个端口

非对称NAT是多个请求对应一个端口


ICE的协商过程:

  1. 候选地址的收集:ICE客户端收集本地所有可能用于通讯的地址,所收集的地址分为3类:

    (1)主机候选地址(Host Candidate):本地物理网卡的地址

    (2)服务器反射地址(Server Reflexive Candidate就是NAT上关于本地IP映射的地址),这个地址通过STUN服务器来获取

    (3)中转/中继候选地址(Relay Candidate)这个地址就是使用中继(Relay)的传输方式时,在中继服务器(或者称为TURN服务器)上为本机所分配的地址

2.候选地址的优先策略:一般情况下使用中继方式产生的中继候选地址的优先权最低,因为它的代价最昂贵。

3.本地候选地址编码:把编码来的地址传至对端,双方通过报告/应答的方式进行协商

4.候选地址配对:将本端的地址与对端的地址一一进行配对,此时应该通过某种方式的得到了对端的候选地址

5.每对地址做连接测试

6.得到结果:由于已经对所有的候选地址一一进行配置并一一进行连接测试,所以存在一个可以通信的路径,ICE肯定会得到它。



第一部分:opensips的安装

环境说明:

操作系统:CentOS 6.6 64位版,采用最小安装,安装的时候将“Devlopment Tools”选上并关闭SELinux及防火墙

软件:opensip-1.11.4


安装过程:

  1. 安装依赖库

1
2
3
4
yum -y  install  gcc  make  zlib-devel wget gdb
yum -y  install  flex bison ncurses-devel 
yum -y  install  mysql mysql-server mysql-devel mysql-libs 
yum -y  install  lynx svn libxslt

2.下载并安装配置opensips-1.11.4-latest-src.tar.gz

1
2
3
4
5
6
wget http: //opensips .org /pub/opensips/1 .11.4 /src/opensips-1 .11.4-latest_src. tar .gz
tar  zxf opensips-1.11.4-latest_src. tar .gz
cd  opensips-1.11.4-tls/
make  prefix= /data/opensips1 .11.4 all include_modules= "db_mysql" 
make  prefix= /data/opensips1 .11.4  install  include_modules= "db_mysql"
cd  ..

说明:将opensips安装到/data/opensips1.11.4,并增加mysql支持


3.启动并配置数据库

1
2
3
4
/etc/init .d /mysqld  start 
mysqladmin -uroot password 123456 
mysql -uroot -p123456 -e  "delete from mysql.user where password=''" 
mysql -uroot -p123456 -e  "drop database test"

 说明:以上将数据库的root密码设置为123456,并删除数据库中空密码的账户。


4.配置opensips与mysql数据库的对接

1
2
3
4
5
6
sed  -i  's/\# DBENGINE=MYSQL/DBENGINE=MYSQL/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc 
sed  -i  's/\# DBHOST=localhost/DBHOST=localhost/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc
sed  -i  's/\# DBNAME=opensips/DBNAME=opensips/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc 
sed  -i  's/\# DBRWUSER=opensips/DBRWUSER=opensips/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc 
sed  -i  's/\# DBRWPW="opensipsrw"/DBRWPW="opensipsrw"/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc 
sed  -i  's/\# DBROOTUSER="root"/DBROOTUSER="root"/g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc

以上主要就是修改/data/opensips1.11.4/etc/opensips/opensipsctlrc中mysql的配置


5.建立软链接

1
2
3
ln  -s  /data/opensips1 .11.4 /etc/opensips/  /etc/
echo  "export PATH=$PATH:/data/opensips1.11.4/sbin/"  >> /etc/profile
source  /etc/profile

说明:以上说明以后opensips的配置文件就可以直接打开/etc/opensips/目录下.另外也将opensips的执行文件加到环境变量


6.创建opensips数据库

1
2
3
4
5
6
7
8
9
10
11
[root@CentOS6 opensips-1.11.4-tls] # /data/opensips1.11.4/sbin/opensipsdbctl create
MySQL password  for  root:      #输入mysql root密码,这里是123456
INFO:  test  server charset
INFO: creating database opensips ...
INFO: Core OpenSIPS tables succesfully created.
Install presence related tables? (y /n ): y     #确认安装presence表,也可以否
INFO: creating presence tables into opensips ...
INFO: Presence tables succesfully created.
Install tables  for  imc cpl siptrace domainpolicy carrierroute userblacklist b2b cachedb_sql registrant call_center? (y /n ): y   #确认安装表,也可以否
INFO: creating extra tables into opensips ...
INFO: Extra tables succesfully created.

7.创建opensips配置文件,使用图形界面运行

1
/data/opensips1 .11.4 /sbin/osipsconfig

按照 Generate OpenSIPS Script ---> Residential Script ---> Configure Residential Script 

路径,并选择以下几个:

                                 Configure Residential Script

                            ____________________________________________

                           |                                            |

                           |     [ ] ENABLE_TCP                         |

                           |     [ ] ENABLE_TLS                         |

                           |     [*] USE_ALIASES                        |

                           |     [*] USE_AUTH                           |

                           |     [*] USE_DBACC                          |

                           |     [*] USE_DBUSRLOC                       |

                           |     [*] USE_DIALOG                         |

                           |     [ ] USE_MULTIDOMAIN                    |

                           |     [*] USE_NAT                            |

                           |     [ ] USE_PRESENCE                       |

                           |     [ ] USE_DIALPLAN                       |

                           |     [ ] VM_DIVERSION                       |

                           |     [ ] HAVE_INBOUND_PSTN                  |

                           |     [ ] HAVE_OUTBOUND_PSTN                 |

                           |     [ ] USE_DR_PSTN                        |

                           |     [ ] USE_HTTP_MANAGEMENT_INTERFACE      |

                           |____________________________________________|

 

然后按"<-"键盘,选择"Generate Residential Script"回车即可,然后一直按"<-"键退出.

如果这里选择了USE_MULTIDOMAIN,则需要往OpenSIPS的opensips数据库的domain表插入domain值。



8.使用生成的配置文件替换默认的配置文件

1
2
rm  -f  /data/opensips1 .11.4 /etc/opensips/opensips .cfg
mv  /data/opensips1 .11.4 /etc/opensips/opensips_residential_ *.cfg  /data/opensips1 .11.4 /etc/opensips/opensips .cfg


9.更改opensips的配置文件

1
2
3
4
sed  -i  's/disable_tcp=no/disable_tcp=yes/g'  /data/opensips1 .11.4 /etc/opensips/opensips .cfg 
sed  -i  's/listen=udp:127.0.0.1:5060/listen=udp:eth0:5060/g'  /data/opensips1 .11.4 /etc/opensips/opensips .cfg 
sed  -i  's#mpath="/usr/local/lib/opensips/modules/"#mpath="/data/opensips1.11.4/lib64/opensips/modules/"#g'  /data/opensips1 .11.4 /etc/opensips/opensips .cfg 
sed  -i -e  '/modparam("uri", "use_uri_table", 0)/a\modparam("uri", "db_url","mysql://opensips:opensipsrw@localhost/opensips")'  /data/opensips1 .11.4 /etc/opensips/opensips .cfg

10.更改opensips日志路径,查看opensips日志,只要查看/var/log/opensips.log,方便我们对出现问题的处理

1
2
echo  "local0.* /var/log/opensips.log"  >>  /etc/rsyslog .conf 
service rsyslog restart

11.配置opensips的启动文件,以后就可以使用service opensips [start/stop/restart]管理opensips服务.

1
2
3
4
5
6
cp  /root/opensips-1 .11.4-tls /packaging/fedora/opensips .init  /etc/init .d /opensips 
sed  -i  's#opensips=/usr/sbin/$prog#opensips=/data/opensips1.11.4/sbin/$prog#g'  /etc/init .d /opensips 
chmod  +x  /etc/init .d /opensips 
groupadd opensips 
useradd  -g opensips -s  /sbin/nologin  -d  /dev/null  opensips 
service opensips start

13.配置域的名字

1
sed  -i  's#\# SIP_DOMAIN=opensips.org#SIP_DOMAIN=192.168.88.10#g'  /data/opensips1 .11.4 /etc/opensips/opensipsctlrc
1
#以上的192.168.88.10可以更改成自己的域名或IP

12.RTPProxy的安装与配置(这部分可省略,因为后面会使用Mediaproxy)

1
2
3
4
5
6
7
8
9
yum -y  install  git 
git clone git: //sippy .git.sourceforge.net /gitroot/sippy/rtpproxy
cd  rtpproxy 
. /configure 
make 
make  install 
rtpproxy -u opensips -F
sed  -i  's#udp:localhost:12221#unix:/var/run/rtpproxy.sock#g'  /data/opensips1 .11.4 /etc/opensips/opensips .cfg
service opensips restart

13.添加测试账户

1
2
3
4
5
6
7
8
[root@CentOS6 ~] # opensipsctl add 1 123456
new user  '1'  added
[root@CentOS6 ~] # opensipsctl add 2 123456
new user  '2'  added
[root@CentOS6 ~] # opensipsctl add 3 123456
new user  '3'  added
[root@CentOS6 ~] # opensipsctl add 4 123456
new user  '4'  added