说明,当前2.0.x已经发布,但以下内容还是基于SER 0.9.x。
SER由一个core和大量module组成,core接收sip消息并进行基本处理,module输出函数供core调用,modules实现了SER的绝大部分功能;配置文件ser.cfg定义了core对modules的调用,也包括了modules的参数配置。ser.cfg是SER业务功能定义的核心。
各module的详细文档参考modules目录中各module对应目录下的README文件,该文档说明了该module的可配置参数、输出函数、对其他module的依赖等信息。
Ser提供了二进制方式的安装包,我只用过从源码编译安装,环境Red Hat Linux AS4。按以下步骤安装后可以进行无认证的SIP注册,可以作为基本的proxy server使用。
make
make install
这将安装到/usr/local下,配置文件是/usr/local/etc/ser/ser.cfg,使用man ser查看目录信息;
如果需要安装到指定目录,命令为
make prefix=/your_path all
make prefix=/ your_path install
安装完后使用serctl start命令启动服务器就可以了。
建库:
脚本/usr/sbin/ser_mysql.sh是SER mysql操作工具,提供了数个命令参数用于数据库处理,其中参数create用于新建数据库和tables,并会增加一个uri为root@localhost的用户,其realm是脚本执行时要求用户输入的参数。
建立的数据库,SER会使用用户ser登录,相应登录密码为heslo;
相关配置参考下文ser.cfg的说明;
上文可参考SER的INSTALL文档;
编译:
以下步骤与INSTALL文档的说明不同;
进入modules/acc,提供提示信息更改Makefile,即增加“DEFS+=-DSQL_ACC”即可;然后进入主目录,只需make/make install等;
需要手动编译mysql.so库:进入modules/mysql目录,执行make,将生成的mysql.so copy到ser安装目录的modules目录,默认为/usr/local/lib/ser/modules。
附录,Mysql的简单使用:
1, 将root设置为mysql的用户,并设置密码:# mysqladmin -u root password yourpwd
2, 登录mysql:
>> mysql –p
输入password,之后就可以使用show databases/use database_name/show tables等命令了,也可以直接执行sql语句。
本部分在增加了数据库支持基础上,实现基本的对REGISTER的认证功能。只需要根据注释更改ser.cfg文件,去掉某些注释符号即可。
使用serctl添加用户数据,此时必须首先设置环境变量SIP_DOMAIN来设置realm,该值会填入数据库realm列。不清楚该realm作何用途,因为SIP消息中的realm参数是在ser.cfg中确定的。添加需输入数据库登录密码——默认值为heslo。
主要分成7大块:
1, Global Definitions Section:用于配置SER daemon本身
2, Modules Section:配置要加载的modules,使用loadmodule命令
3, Module Configuration Section:使用modparam命令,modparam(module_name, module_parameter, parameter_value)
4, Main Route Block:像一个c的main函数,是SIP消息处理的入口点,控制每个SIP消息的处理过程;
5, Additional Route Blocks:由main route block或其他Additional Route Blocks调用;
6, Reply Route Block.:处理sip消息(主要是200OK)返回;on_reply_route[x]
7, Failure Route Block.:处理busy、timeout这样一些错误状态;failure_route[x]
详细配置
Fork:yes作为后台程序运行;
listen=192.0.2.13 # INSERT YOUR IP ADDRESS HERE,配置IP,默认将在机器所有IP上监听,SER启动时会打印它监听的IP;
children=4 #生成子进程的数量
dns=no #防止SER从DNS中查询自己的IP???
rev_dns=no
fifo="/tmp/ser_fifo" #配置一个SER FIFO,用于测试SER的状态、外部程序直接插入消息到SER中,serctl工具就利用了该FIFO实现功能;
loadmodule "/usr/local/lib/ser/modules/sl.so" #
modparam("usrloc", "db_mode", 0) #是否将注册数据持久化
#开始xxx
route {
}
部分语法:
route(1); #调用route(1)
break; #相当于exit,退出整个处理block;
使用ser –C检查配置文件是否正确;
编译时需要加上mysql支持,并使用一个sh脚本建好数据库表;简单使用将simple.ser.cfg中的几个配置项的#去掉即可。
详细配置:
需要加载mysql.so/auth.so/auth_db.so几个module;注意加载的顺序;uri_db.so提供check_to(),用于将用户的注册数据保存到数据库中?
modparam("auth_db|uri_db|usrloc", "db_url", "mysql://ser:heslo@localhost/ser") #user:pwd@host/database
# subscriber表是否使用加密密码,0加密,subscriber是注册信息表。uri是什么表?
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
#2 to store contact information and authentication data
modparam("usrloc", "db_mode", 2)
其他:
#检查用户名与密码,对非REGISTER消息总是返回失败?参数:使用哪个数据库表检查哪个域,
www_authorize("realm","subscriber")
#发送401要求对方发送注册信息,可设置返回的401消息的realm?
www_challenge("realm","0")
check_to()
sl_send_reply("401", "Unauthorized")
consume_credentials()
save("location")
proxy_authorize("","subscriber")
proxy_challenge("","0")
check_from()
sl_send_reply("403", "Use From=ID")
route(1)
使用工具serctl增加用户,需要使用Mysql登录密码:
serctl add 1000 password1 [email protected] [mailto:[email protected]]
Nat:
SER提供两种方式处理NAT和RTP Proxy,rtpproxy和mediaproxy;
NAT后的UA与公网中的SER:
1, SER对REGISTER的处理:
2, 对INVITE的处理:
ser命令附带了一些参数,某些可以作为工具使用;
直接执行ser命令会启动ser服务器,但ser没有提高相应的停止方法,故应使用serctl start命令启动服务。
命令man 8 ser可以查看ser的简单帮助信息,如可以看到安装路径、modules的安装路径等。
serctl安装路径为/usr/sbin/或/usr/local/sbin/;
命令使用说明参考serctl的帮助输出——输入serctl命令即可。
serctl start启动服务,这种方式启动后可以使用serctl stop停止,否则没有好的办法停止ser;serctl moni监控SER执行状态;
增加用户:serctl add <name> <password> <email>
输出环境变量:export SIP_DOMAIN="myserver.foobar.com"
请参考联机帮助。
SER提供了rtpproxy、mediaproxy两种方式,下面的叙述中SER位于公网上,SipPhone在NAT之后;
SIP消息中附带的SipPhone的IP:Port是它的私网参数,而通过Socket函数能够获得其NAT地址和在NAT上的端口,SER将记录这些数据;
SER提供函数fix_nated_contact,可以重写Contact头域;函数fix_nated_register则不改写Contack头域而记录正确的地址参数;
函数setflag()用于记录sipphone位于NAT后;
内网IP:Port在NAT设备上某个Port的对应关系只会保存有限的时间,过期后NAT会将port关系、对应关系删除。该问题的解决办法是Sipphone频繁向SER发消息,或反过来SER向它发消息。
这主要关系到媒体流的处理,SDP中IP:Port。SER的处理方式包括:
1、 在SDP中增加一个属性行:direction:active,这用于让被叫UA等待直到它收到了媒体流,然后将它的媒体流发回给这个地址(即对称RTP,symmetric RTP);该方式需要至少有一个UA拥有公网地址的情况,如PSTN网关;
2、 更改“c=”行的IP地址为公网地址,这可以与方式1同时使用;
3、 让RTP流通过一个Proxy,使用一个拥有公网地址、双方UA都能将媒体流发给它的Proxy;
SER附带文档
Ser的联机帮助
http://www.iptel.org/
《SER-GettingStarted.pdf》