安装ser服务器

目标: 2m_'z  
1.SER通过mysql数据库对sip客户进行认证. QU:EY'2  
2.SER通过radius对sip客户进行计费. |*:tyP%m^  
-------------------------------------------------------------- E;6~RM:  
1.安装ser服务器 s=MT,  
==>到www.iptel.org/ser下载ser-0.9.4_src.tar.gz. <B!'3C( P  
==>到http://developer.berlios.de/projects/radiusclient-ng下载 m}98bw  
radiusclient-ng-0.5.2.tar.gz. a mqOxb  
==>编译/安装radiusclient-ng-0.5.2.tar.gz. =_[2n?9y  
==>tar zxvf ser-0.9.4_src.tar.gz解压文件. 9`B0fv� Q&  
==>进入解压后目录的modules/acc目录下, 修改Makefile使ser启用sql :X_CFW  
计费和radius计费支持. Bz+.Qa+�  
去掉#DEFS+=-DSQL_ACC行前面的"#"号 QBoFpxh=  
去掉#DEFS+=-DRAD_ACC f ba&`  
#include ../../Makefile.radius两行前面的"#"号 mQ}Gh_'ps  
==>进入ser主目录, 执行make编译ser, 执行make install安装ser. xYI;V7  
2.配置ser的mysql支持 f2yq8/J8.  
==>进入ser源程序的modules/mysql目录. 1a$IrQE  
==>执行make编译ser的mysql支持模块. abi[jxCG  
==>执行cp mysql.so /usr/local/lib/ser/modules把生成的动态链接 YLOwQj'  
库拷贝到ser的模块目录中. ;~+]! U  
==>执行/usr/local/sbin/ser_mysql.sh create生成mysql数据库结构 S`m,S4-eD  
需要输入mysql的root用户的密码, 执行成功后会在创建一个名叫ser BLn_u,3  
的mysql数据库. A&zS'toU  
3.配置ser的radius计费支持 xJc$NV-JzK  
==>到http://mirror.centos.org/centos/4.2/os/i386/CentOS/RPMS/ c2 A�ps�  
下载radius服务器的支持(5个文件), 如果安装centos4.2时选择的是 n2f6p<8A  
完全安装, 则不需要这一步. qMP1k7uG)  
freeradius-1.0.1-3.RHEL4.i386.rpm ]$A(9Pn"  
freeradius-mysql-1.0.1-3.RHEL4.i386.rpm epg#HNP7^Y  
libtool-libs-1.5.6-4.EL4.1.i386.rpm A"uULfnk  
net-snmp-5.1.2-11.EL4.6.i386.rpm i47j lyH  
net-snmp-utils-5.1.2-11.EL4.6.i386.rpm ]:ZdV9`  
==>执行rpm -ivh freeradius-1.0.1-3.RHEL4.i386.rpm, 根据提示信 ,7_4 z]jK  
息安装相应的freeradius支持库, 再安装这个包. hK|j6x f.o  
==>cd /usr/share/doc/freeradius-1.0.1目录 r;&>iX4B  
执行:mysql -uroot -ppassw0rd radius < db_mysql.sql安装free wkUlrL/~  
radius的mysql数据库, 执行成功后会在mysql中创建一个名为radius hk[ %a$Y  
的数据库 a^U~ 0i@[S  
==>进入/etc/raddb目录, 修改radiusd.conf配置文件. f+_h !j  
去掉#passwd = /etc/passwd行前面的"#"号 t. ='/`!N  
去掉#group = /etc/group行前面的"#"号 |yEa5rd?W  
去掉authorize {...}中#sql前的"#"号 0'YG6(h  
去掉accounting {...}中#sql前的"#"号 !8NC# s  
==>进入/etc/raddb目录, 修改sql.conf配置文件. #|&Sc_#4)  
修改password = "rootpass"这行为password = "passw0rd"(即root E:9"cxx  
用户的密码) jB{4/)  
==>进入/etc/raddb目录, 修改users配置文件. NS%WeAf  
注释掉: MjlP+; !  
DEFAULT Auth-Type = System ])xx<5Jt4  
Fall-Through = 1 =|3fs7  
这两行, 目的是禁止radius用本地账号对用户进行验证. CC#;c1t  
4.配置ser服务器的sql计费/radius计费支持 Hemq +]6^  
==>进入/usr/local/etc/ser目录, 根据"ser源程序安装目录/modules/ =c/wplv*  
acc目录中的README文件配置ser的sql计费和radius计费支持, 具体 e,t(q(L�  
配置参数参考/usr/local/etc/ser目录 I'V4D[H5  
5.启动各个服务器, 测试 x>Zn?YR,"  
==>radius -X以debug模式启动freeradius服务器 |&RU/�a  
==>ser start启动ser服务器 SHe49!RA'{  
==>使用serctl工具添加分机, 格式serctl add user secret email L*YynF  
==>执行serctl add 1111 1111 1111@localhost添加一个分机, 需要输 Wf|Q$MHos  
入mysql用户ser的密码heslo, 并且export SIP_DOMAIN=localhost这 U4d :] z  
个环境变量 C uB`CI  
==>执行serctl add 2222 2222 2222@localhost添加一个分机, 需要输 |y(Q  
入mysql用户ser的密码heslo, 并且export SIP_DOMAIN=localhost这 vSEuk}pk  
个环境变量 o]4*|ARPs  
.+$Q<L  
==>在另一个窗口中执行serctl moni命令, 观察ser的调试输出, 开始 ]s<[D$ <,  
用两个分机拨号, 接通后, 观察radius的调试窗口, 发现有信息输出 JMC. w!  
通话结束, 查看ser数据库中的acc表和radius数据库中的radacct表, Ayxkv)%:@)  
会发现它们各自都多了三行, 分别记录sip的INVITE/ACK/BYE方法的 8A##/j )  
时间, 这样, 就可以实现ser的计费功能了. v[1aWv:  
6.ser的web管理方式 rNXQf'*I  
以下信息从voip-info网站得到 m*&]!mM"0G  
==>serweb可以查看帐户等信息, 但不能修改. T(id^�w  
==>ser-sip-prov-0_1.tar.gz可以添加帐户. M?1Y,5  
-------------------------------------------------------------- C0T;![/4A  
附录: 5-:?&|JK;  
1.注意, 有时候SER不能正常启动, 需要使用命令: /V;F/Zy(  
ldconfig 使系统注册SER所依赖的某些库. b/+u4'"  
2.SER配置文件(/usr/local/etc/ser.cfg): 3#3n!(  
# |mZxfI  
# $Id: ser.cfg,v 1.25.2.1 2005/02/18 14:30:44 andrei Exp $ ~[t[y~Hup  
# ` 'DmDg  
# simple quick-start config script /"7*{L:  
# C7]f*TSC4  
(d(CT;  
# ----------- global configuration parameters ------------------------ yl'u'-Zb6  
jk;j2YNPw  
debug=10       # debug level (cmd line: -dddddddddd) t*p71U4+I  
fork=yes #$.;'#u'so  
#log_stderror=no     # (cmd line: -E) ?e%ZOI  
,V7nzhA2  
#fork=yes 9=s<Ld  
log_stderror=yes N"Z{5A  
Q3 ea{!r  
check_via=no     # (cmd. line: -v) /UA[  
dns=no       # (cmd. line: -r) .7J#_* NV  
rev_dns=no     # (cmd. line: -R) p#-Z4-�`  
#port=5060 b 1c y$I  
#children=4 juJklSD  
fifo="/tmp/ser_fifo" =F|{# F  
{�qk1_yP  
# ------------------ module loading ---------------------------------- q] )K,)  
L;z?aZ7n  
# Uncomment this if you want to use SQL database j^*dmX  
loadmodule "/usr/local/lib/ser/modules/mysql.so" M-VX;/&FR  
z(O�Nv#}p  
loadmodule "/usr/local/lib/ser/modules/sl.so" T=DbBy0-  
loadmodule "/usr/local/lib/ser/modules/tm.so" e+7"/icK  
loadmodule "/usr/local/lib/ser/modules/rr.so" K8|r&`X0  
loadmodule "/usr/local/lib/ser/modules/maxfwd.so" ,&A7iO  
loadmodule "/usr/local/lib/ser/modules/usrloc.so" C }j"Qi`  
loadmodule "/usr/local/lib/ser/modules/registrar.so" =ZznFVJ`={  
loadmodule "/usr/local/lib/ser/modules/textops.so" "]*&oQCI  
?=msH=N<l  
# Uncomment this if you want digest authentication oH?b}T=9jz  
# mysql.so must be loaded ! }"H,h)T  
loadmodule "/usr/local/lib/ser/modules/auth.so" a./:T,cP>  
loadmodule "/usr/local/lib/ser/modules/auth_db.so" p` dU2gV  
gs[uD5oo<  
loadmodule "/usr/local/lib/ser/modules/acc.so" ,-LwtePJ0  
O63<AY@  
modparam("acc", "log_level", 1) ua$GNm  
modparam("acc", "log_flag", 1) Sv#XIMw{,  
modparam("acc", "db_flag", 1) ek/ xx  
modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser") t9`�.bx8  
modparam("acc", "db_table_acc", "acc") ~ 'cmSiz-  
modparam("acc", "report_cancels", 1) %@aSe2B  
wu!59pL  
modparam("acc", "acc_sip_from_column", "sip_from") 6:5I26  
modparam("acc", "acc_sip_to_column", "sip_to") S(l O(gY  
modparam("acc", "acc_sip_status_column", "sip_status") ".V$~n(  
modparam("acc", "acc_sip_method_column", "sip_method") %#:{UR)E  
modparam("acc", "acc_i_uri_column", "i_uri") ;O6;.5q&  
modparam("acc", "acc_o_uri_column", "o_uri") `Bp.RXsd*  
modparam("acc", "acc_from_uri_column", "from_uri") jDfC=a])  
modparam("acc", "acc_to_uri_column", "to_uri") =E4LRKn  
modparam("acc", "acc_sip_callid_column", "sip_callid") Qf+/;@  
modparam("acc", "acc_user_column", "username") - q1?? u  
modparam("acc", "acc_domain_column", "domain") BC#C9|n  
modparam("acc", "acc_fromtag_column", "fromtag") :D6 ON"6  
modparam("acc", "acc_totag_column", "totag") m@2QnA[ 4  
modparam("acc", "acc_time_column", "time") 5|j<`()H :  
Ys!82M$g  
modparam("acc", "radius_config", "/usr/local/etc/ser/radius/radiusclient.conf") H?vdr:WlTN  
modparam("acc", "radius_flag", 1) DS(}<HK{  
modparam("acc", "radius_missed_flag", 2) .+3g*Dv{&  
:Uzm  
# ----------------- setting module-specific parameters --------------- ;~ )5s'  
A5I)^B<(  
# -- usrloc params -- wo;~7K  
|}s*E_/[  
#modparam("usrloc", "db_mode",   0) X"|['t  
,GbR!j@6  
# Uncomment this if you want to use SQL database Fx_z�6a  
# for persistent storage and comment the previous line :1.L}4"gg  
modparam("usrloc", "db_mode", 2) 1Ti f{i,B  
|/|5UiX7  
# -- auth params -- njB;&N)I  
# Uncomment if you are using auth module T?CdZc.  
# av8B-GQI*#  
modparam("auth_db", "calculate_ha1", yes) CAig ]=2'  
# "+R+6<"  
# If you set "calculate_ha1" parameter to yes (which true in this config), 6m/r+?'  
# uncomment also the following parameter) hE'-is@7  
# oz/!V*CtK  
modparam("auth_db", "password_column", "password") ,a{P4Bq  
> ym,{EHK  
# -- rr params -- b"<liGh"n-  
# add value to ;lr param to make some broken UAs happy <6%?OJhp  
modparam("rr", "enable_full_lr", 1) +[6G5cH  
1SQ3-WUs  
# ------------------------- request routing logic ------------------- o)M}!MT  
{ T/[cu<  
# main routing logic x /(^7#u,  
Q^P}/wb>  
route{ v4!VrI  
^x�]r`b  
    # initial sanity checks -- messages with xJpA0_xfG  
    # max_forwards==0, or excessively long requests d"1]4.c  
    if (!mf_process_maxfwd_header("10")) { f#>,1,S  
        sl_send_reply("483","Too Many Hops"); c1(R uP:S  
        break; |w~nVRb  
    }; @Rze| T.  
    if (msg:len >= 2048 ) { 94`7a<&ZNL  
        sl_send_reply("513", "Message too big"); wQl ,  
        break; S&5&];Ag  
    }; JAnZdfRt  
    ?/E~/;+7=  
#4NaL  
    # we record-route all messages -- to make sure that PcMD])Z{G  
    # subsequent messages will go through our proxy; that's @Ns Qd_e  
    # particularly good if upstream and downstream entities %)8}X>xq  
    # use different transport protocol nsC3  
    # if (!method=="REGISTER") record_route();     oG?Xk%7&/  
]IQ&>z}<  
    # subsequent messages withing a dialog should take the ',@3>T**  
    # path determined by record-routing :6 R/OeH+  
    if (loose_route()) { s?}e^/"v  
        # mark routing logic in request prF%.(G2)  
        setflag(1); &)ChQZA  
        if (method=="INVITE") record_route(); %/.b~|,-  
        append_hf("P-hint: rr-enforced/r/n"); dn+KH+v  
        if (!t_relay()) { Rtl"Ub@HV  
              sl_reply_error(); >*_$]E  
              break; E,U+o $  
        }; ,/F~ Y&1I  
        #route(1); [D4SW#  
        #break; ?mxMk6w  
    }; /]Md~=yNp  
k2tF}  
    setflag(1); bJ {'<J  
Hd ={CFip  
    if (method=="INVITE") record_route(); T_5H&;a  
    if (method=="BYE") record_route(); >jLY"  
    # if (!method=="REGISTER") record_route();     ]Q3ADh  
Jk n>S#SZ  
    if (!uri==myself) { uZK r  
        # mark routing logic in request flbd0NB  
        append_hf("P-hint: outbound/r/n"); u l�>3B4  
        route(1); x g�  
        break; PK iy5D*8p  
    }; 0 /U{p,r6`  
[waIi3Dv/  
    if ( (uri=~"^sip:[0-9]{11,20}@.*") ) { v PG},m~-  
        record_route(); u/;C;I-? '  
        rewritehostport("1.2.3.4:5060"); BUXpC xQ  
        forward(uri:host, uri:port); fJ!R6D  
        setflag(1); n9ej7oj  
        t_relay(); GH$�pKB  
        break; B*Dz{a^.:  
    }; l}A93 jSL  
PIS2 Ed]  
    # if the request is for other domain use UsrLoc p}U ~+:v  
    # (in case, it does not work, use the following command B>P{A7Q  
    # with proper names and addresses in it) >7DhTM-A  
    if (uri==myself) { R%[ c;i  
)irEM�  
        if (method=="REGISTER") { YNsJZnGr8#  
1tFNM[R  
# Uncomment this if you want to use digest authentication d5:c^`  
              if (!www_authorize("localhost", "subscriber")) { xdkZdx>N  
                  www_challenge("localhost", "0"); 'E""amIJ  
                  break; a<bwzX|.  
              }; Q>Yjy!. <^  
Q*~]h;6/{d  
              save("location"); ]N F[>uiW  
              break; O3kA;[f;  
        }; 8FY?!C  
6(ol1 (U  
        lookup("aliases"); / }G>8^  
        if (!uri==myself) { {3aua:q�  
              append_hf("P-hint: outbound alias/r/n"); f%}xO+.s  
              route(1); *0=j?~&  
              break; ~Z'?LV<t  
        }; [/8%3  
'TB2:W3  
        # native SIP destinations are handled using our USRLOC DB >fQMXfoY  
        if (!lookup("location")) { "3Y0`&:D  
              sl_send_reply("404", "Not Found"); |P?*5xPB  
              break; O0H.C0}  
        }; 5/VWC�I  
    }; DkDmE  
    append_hf("P-hint: usrloc applied/r/n"); +9sQZB# (  
    route(1); 'i|YlMFI�g  
} 5146kp|1  
+^F Zq$NP  
route[1] nQ3A~ ()  
{ -M#Wt`6A  
    # send it out now; use stateful forwarding as it works reliably sU^1wB Rj  
    # even for UDP2TCP @oGcuE  
    if (!t_relay()) { P16~Qj  
        sl_reply_error(); #~=Ry H  
    }; es0hm2HT3  
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值