#!KAMAILIO // 声明这是一个Kamailio配置文件
import_file "kamailio-local.cfg" // 导入本地配置文件(如果存在)
#!ifdef WITH_DEBUG // 如果定义了WITH_DEBUG
#!define DBGLEVEL 3 // 设置调试级别为3
#!else // 否则
#!define DBGLEVEL 2 // 设置调试级别为2
#!endif
#!ifdef WITH_MYSQL // 如果定义了WITH_MYSQL
#!trydef DBURL "mysql://kamailio:kamailiorw@localhost/kamailio" // 尝试定义数据库连接URL
#!endif
#!ifdef WITH_MULTIDOMAIN // 如果定义了WITH_MULTIDOMAIN
#!define MULTIDOMAIN 1 // 启用多域支持
#!else // 否则
#!define MULTIDOMAIN 0 // 禁用多域支持
#!endif
#!ifdef WITH_ANTIFLOOD // 如果定义了WITH_ANTIFLOOD
#!trydef WITH_HTABLE // 尝试定义WITH_HTABLE
#!endif
#!define FLT_ACC 1 // 定义标志FLT_ACC为1(用于计费)
#!define FLT_ACCMISSED 2 // 定义标志FLT_ACCMISSED为2(用于未接来电计费)
#!define FLT_ACCFAILED 3 // 定义标志FLT_ACCFAILED为3(用于失败计费)
#!define FLT_NATS 5 // 定义标志FLT_NATS为5(用于NAT检测)
#!define FLB_NATB 6 // 定义分支标志FLB_NATB为6(用于NAT分支)
#!define FLB_NATSIPPING 7 // 定义分支标志FLB_NATSIPPING为7(用于NAT SIP PING)
debug=DBGLEVEL // 设置调试级别为DBGLEVEL
log_stderror=no // 不将日志输出到标准错误
memdbg=5 // 设置内存调试级别为5
memlog=5 // 设置内存日志级别为5
log_facility=LOG_LOCAL0 // 设置日志设施为LOG_LOCAL0
log_prefix="{$mt $hdr(CSeq) $ci} " // 设置日志前缀格式
children=8 // 设置每个UDP套接字的SIP路由进程数为8
# disable_tcp=yes // 禁用TCP(默认启用)
# tcp_children=8 // 设置所有TCP/TLS套接字的SIP路由进程数为8
# async_workers_group="name=udp;workers=8" // 设置异步工作线程组
# udp_receiver_mode = 1 // 设置UDP接收模式为1(多线程异步)
# auto_aliases=no // 禁用基于IP反向DNS的本地别名自动发现
# alias="sip.mydomain.com" // 添加本地域名别名
# listen=udp:10.0.0.10:5060 // 监听指定IP和端口的UDP套接字
tcp_connection_lifetime=3605 // 设置TCP连接生命周期为3605秒
tcp_max_connections=2048 // 设置TCP连接的最大数量为2048
#tcp_accept_iplimit=1024 // 设置每个IP地址的TCP连接上限为1024
#!ifdef WITH_JSONRPC // 如果定义了WITH_JSONRPC
tcp_accept_no_cl=yes // 允许没有Content-Length头的TCP连接
#!endif
#!ifdef WITH_TLS // 如果定义了WITH_TLS
enable_tls=yes // 启用TLS支持
tls_max_connections=2048 // 设置TLS连接的最大数量为2048
tls_threads_mode=2 // 设置TLS线程模式为2
#!endif
enable_sctp=no // 禁用SCTP支持
#!ifdef WITH_PSTN // 如果定义了WITH_PSTN
pstn.gw_ip = "" desc "PSTN GW Address" // 设置PSTN网关IP地址
pstn.gw_port = "" desc "PSTN GW Port" // 设置PSTN网关端口
#!endif
#!ifdef WITH_VOICEMAIL // 如果定义了WITH_VOICEMAIL
voicemail.srv_ip = "" desc "VoiceMail IP Address" // 设置语音邮件服务器IP地址
voicemail.srv_port = "5060" desc "VoiceMail Port" // 设置语音邮件服务器端口
#!endif
# mpath="/usr/local/kamailio/lib64/kamailio/modules/" // 设置模块路径
#!ifdef WITH_TLS // 如果定义了WITH_TLS
loadmodule "tls.so" // 加载TLS模块
#!endif
#!ifdef WITH_MYSQL // 如果定义了WITH_MYSQL
loadmodule "db_mysql.so" // 加载MySQL数据库模块
#!endif
#!ifdef WITH_JSONRPC // 如果定义了WITH_JSONRPC
loadmodule "xhttp.so" // 加载xhttp模块
#!endif
loadmodule "jsonrpcs.so" // 加载jsonrpcs模块
loadmodule "kex.so" // 加载kex模块
loadmodule "corex.so" // 加载corex模块
loadmodule "tm.so" // 加载tm模块
loadmodule "tmx.so" // 加载tmx模块
loadmodule "sl.so" // 加载sl模块
loadmodule "rr.so" // 加载rr模块
loadmodule "pv.so" // 加载pv模块
loadmodule "maxfwd.so" // 加载maxfwd模块
loadmodule "usrloc.so" // 加载usrloc模块
loadmodule "registrar.so" // 加载registrar模块
loadmodule "textops.so" // 加载textops模块
loadmodule "textopsx.so" // 加载textopsx模块
loadmodule "siputils.so" // 加载siputils模块
loadmodule "xlog.so" // 加载xlog模块
loadmodule "sanity.so" // 加载sanity模块
loadmodule "ctl.so" // 加载ctl模块
loadmodule "cfg_rpc.so" // 加载cfg_rpc模块
loadmodule "acc.so" // 加载acc模块
loadmodule "counters.so" // 加载counters模块
loadmodule "dlgs.so" // 加载dlgs模块
#!ifdef WITH_AUTH // 如果定义了WITH_AUTH
loadmodule "auth.so" // 加载auth模块
loadmodule "auth_db.so" // 加载auth_db模块
#!ifdef WITH_IPAUTH // 如果定义了WITH_IPAUTH
loadmodule "permissions.so" // 加载permissions模块
#!endif
#!endif
#!ifdef WITH_ALIASDB // 如果定义了WITH_ALIASDB
loadmodule "alias_db.so" // 加载alias_db模块
#!endif
#!ifdef WITH_SPEEDDIAL // 如果定义了WITH_SPEEDDIAL
loadmodule "speeddial.so" // 加载speeddial模块
#!endif
#!ifdef WITH_MULTIDOMAIN // 如果定义了WITH_MULTIDOMAIN
loadmodule "domain.so" // 加载domain模块
#!endif
#!ifdef WITH_PRESENCE // 如果定义了WITH_PRESENCE
loadmodule "presence.so" // 加载presence模块
loadmodule "presence_xml.so" // 加载presence_xml模块
#!endif
#!ifdef WITH_NAT // 如果定义了WITH_NAT
loadmodule "nathelper.so" // 加载nathelper模块
#!ifdef WITH_RTPENGINE // 如果定义了WITH_RTPENGINE
loadmodule "rtpengine.so" // 加载rtpengine模块
#!else // 否则
loadmodule "rtpproxy.so" // 加载rtpproxy模块
#!endif
#!endif
#!ifdef WITH_HTABLE // 如果定义了WITH_HTABLE
loadmodule "htable.so" // 加载htable模块
#!endif
#!ifdef WITH_ANTIFLOOD // 如果定义了WITH_ANTIFLOOD
loadmodule "pike.so" // 加载pike模块
#!endif
#!ifdef WITH_DEBUG // 如果定义了WITH_DEBUG
loadmodule "debugger.so" // 加载debugger模块
#!endif
modparam("jsonrpcs", "pretty_format", 1) // 设置jsonrpcs模块的pretty_format参数为1
# modparam("jsonrpcs", "fifo_name", "/run/kamailio/kamailio_rpc.fifo") // 设置RPC fifo控制文件路径
# modparam("jsonrpcs", "dgram_socket", "/run/kamailio/kamailio_rpc.sock") // 设置RPC unix socket控制文件路径
#!ifdef WITH_JSONRPC // 如果定义了WITH_JSONRPC
modparam("jsonrpcs", "transport", 7) // 设置jsonrpcs模块的transport参数为7
#!endif
# modparam("ctl", "binrpc", "unix:/run/kamailio/kamailio_ctl") // 设置RPC unix socket控制文件路径
modparam("sanity", "autodrop", 0) // 设置sanity模块的autodrop参数为0
modparam("tm", "failure_reply_mode", 3) // 设置tm模块的failure_reply_mode参数为3
modparam("tm", "fr_timer", 30000) // 设置tm模块的fr_timer参数为30000毫秒
modparam("tm", "fr_inv_timer", 120000) // 设置tm模块的fr_inv_timer参数为120000毫秒
modparam("rr", "enable_full_lr", 0) // 设置rr模块的enable_full_lr参数为0
modparam("rr", "append_fromtag", 0) // 设置rr模块的append_fromtag参数为0
modparam("dlgs", "timer_interval", 10) // 设置dlgs模块的timer_interval参数为10秒
modparam("dlgs", "init_lifetime", 180) // 设置dlgs模块的init_lifetime参数为180秒
modparam("dlgs", "active_lifetime", 7200) // 设置dlgs模块的active_lifetime参数为7200秒
modparam("dlgs", "finish_lifetime", 10) // 设置dlgs模块的finish_lifetime参数为10秒
modparam("registrar", "method_filtering", 1) // 设置registrar模块的method_filtering参数为1
# modparam("registrar", "append_branches", 0) // 设置registrar模块的append_branches参数为0
# modparam("registrar", "max_contacts", 10) // 设置registrar模块的max_contacts参数为10
modparam("registrar", "max_expires", 3600) // 设置registrar模块的max_expires参数为3600秒
modparam("registrar", "gruu_enabled", 0) // 设置registrar模块的gruu_enabled参数为0
modparam("registrar", "use_path", 1) // 设置registrar模块的use_path参数为1
modparam("registrar", "path_mode", 0) // 设置registrar模块的path_mode参数为0
modparam("acc", "early_media", 0) // 设置acc模块的early_media参数为0
modparam("acc", "report_ack", 0) // 设置acc模块的report_ack参数为0
modparam("acc", "report_cancels", 0) // 设置acc模块的report_cancels参数为0
modparam("acc", "detect_direction", 0) // 设置acc模块的detect_direction参数为0
modparam("acc", "log_flag", FLT_ACC) // 设置acc模块的log_flag参数为FLT_ACC
modparam("acc", "log_missed_flag", FLT_ACCMISSED) // 设置acc模块的log_missed_flag参数为FLT_ACCMISSED
modparam("acc", "log_extra",
"src_user=$fU;src_domain=$fd;src_ip=$si;"
"dst_ouser=$tU;dst_user=$rU;dst_domain=$rd") // 设置acc模块的log_extra参数
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED) // 设置acc模块的failed_transaction_flag参数为FLT_ACCFAILED
#!ifdef WITH_ACCDB // 如果定义了WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC) // 设置acc模块的db_flag参数为FLT_ACC
modparam("acc", "db_missed_flag", FLT_ACCMISSED) // 设置acc模块的db_missed_flag参数为FLT_ACCMISSED
modparam("acc", "db_url", DBURL) // 设置acc模块的db_url参数为DBURL
modparam("acc", "db_extra",
"src_user=$fU;src_domain=$fd;src_ip=$si;"
"dst_ouser=$tU;dst_user=$rU;dst_domain=$rd") // 设置acc模块的db_extra参数
#!endif
modparam("usrloc", "timer_interval", 60) // 设置usrloc模块的timer_interval参数为60秒
modparam("usrloc", "timer_procs", 1) // 设置usrloc模块的timer_procs参数为1
modparam("usrloc", "use_domain", MULTIDOMAIN) // 设置usrloc模块的use_domain参数为MULTIDOMAIN
#!ifdef WITH_USRLOCDB // 如果定义了WITH_USRLOCDB
modparam("usrloc", "db_url", DBURL) // 设置usrloc模块的db_url参数为DBURL
modparam("usrloc", "db_mode", 2) // 设置usrloc模块的db_mode参数为2
#!endif
#!ifdef WITH_AUTH // 如果定义了WITH_AUTH
modparam("auth_db", "db_url", DBURL) // 设置auth_db模块的db_url参数为DBURL
modparam("auth_db", "calculate_ha1", yes) // 设置auth_db模块的calculate_ha1参数为yes
modparam("auth_db", "password_column", "password") // 设置auth_db模块的password_column参数为password
modparam("auth_db", "load_credentials", "") // 设置auth_db模块的load_credentials参数为空
modparam("auth_db", "use_domain", MULTIDOMAIN) // 设置auth_db模块的use_domain参数为MULTIDOMAIN
#!ifdef WITH_IPAUTH // 如果定义了WITH_IPAUTH
modparam("permissions", "db_url", DBURL) // 设置permissions模块的db_url参数为DBURL
modparam("permissions", "load_backends", 1) // 设置permissions模块的load_backends参数为1
#!endif
#!endif
#!ifdef WITH_ALIASDB // 如果定义了WITH_ALIASDB
modparam("alias_db", "db_url", DBURL) // 设置alias_db模块的db_url参数为DBURL
modparam("alias_db", "use_domain", MULTIDOMAIN) // 设置alias_db模块的use_domain参数为MULTIDOMAIN
#!endif
#!ifdef WITH_SPEEDDIAL // 如果定义了WITH_SPEEDDIAL
modparam("speeddial", "db_url", DBURL) // 设置speeddial模块的db_url参数为DBURL
modparam("speeddial", "use_domain", MULTIDOMAIN) // 设置speeddial模块的use_domain参数为MULTIDOMAIN
#!endif
#!ifdef WITH_MULTIDOMAIN // 如果定义了WITH_MULTIDOMAIN
modparam("domain", "db_url", DBURL) // 设置domain模块的db_url参数为DBURL
modparam("domain", "register_myself", 1) // 设置domain模块的register_myself参数为1
#!endif
#!ifdef WITH_PRESENCE // 如果定义了WITH_PRESENCE
modparam("presence", "db_url", DBURL) // 设置presence模块的db_url参数为DBURL
modparam("presence_xml", "db_url", DBURL) // 设置presence_xml模块的db_url参数为DBURL
modparam("presence_xml", "force_active", 1) // 设置presence_xml模块的force_active参数为1
#!endif
#!ifdef WITH_NAT // 如果定义了WITH_NAT
#!ifdef WITH_RTPENGINE // 如果定义了WITH_RTPENGINE
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223") // 设置rtpengine模块的rtpengine_sock参数
#!else // 否则
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722") // 设置rtpproxy模块的rtpproxy_sock参数
#!endif
modparam("nathelper", "natping_interval", 30) // 设置nathelper模块的natping_interval参数为30秒
modparam("nathelper", "ping_nated_only", 1) // 设置nathelper模块的ping_nated_only参数为1
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING) // 设置nathelper模块的sipping_bflag参数为FLB_NATSIPPING
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org") // 设置nathelper模块的sipping_from参数
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)") // 设置nathelper和registrar模块的received_avp参数
modparam("usrloc", "nat_bflag", FLB_NATB) // 设置usrloc模块的nat_bflag参数为FLB_NATB
#!endif
#!ifdef WITH_TLS // 如果定义了WITH_TLS
modparam("tls", "config", "/usr/local/kamailio/etc/kamailio/tls.cfg") // 设置tls模块的config参数为TLS配置文件路径
#!endif
#!ifdef WITH_ANTIFLOOD // 如果定义了WITH_ANTIFLOOD
modparam("pike", "sampling_time_unit", 2) // 设置pike模块的sampling_time_unit参数为2秒
modparam("pike", "reqs_density_per_unit", 16) // 设置pike模块的reqs_density_per_unit参数为16
modparam("pike", "remove_latency", 4) // 设置pike模块的remove_latency参数为4秒
#!endif
#!ifdef WITH_HTABLE // 如果定义了WITH_HTABLE
#!ifdef WITH_ANTIFLOOD // 如果定义了WITH_ANTIFLOOD
modparam("htable", "htable", "ipban=>size=8;autoexpire=300;") // 设置htable模块的ipban表参数
#!endif
#!endif
#!ifdef WITH_DEBUG // 如果定义了WITH_DEBUG
modparam("debugger", "cfgtrace", 1) // 设置debugger模块的cfgtrace参数为1
modparam("debugger", "log_level_name", "exec") // 设置debugger模块的log_level_name参数为exec
#!endif
request_route { // 主SIP请求路由逻辑
route(REQINIT); // 执行请求初始化检查
route(NATDETECT); // 执行NAT检测
if (is_method("CANCEL")) { // 如果是CANCEL请求
dlgs_update(); // 更新对话状态
if (t_check_trans()) { // 检查事务是否存在
route(RELAY); // 转发请求
}
exit; // 退出
}
if (!is_method("ACK")) { // 如果不是ACK请求
if(t_precheck_trans()) { // 预检查事务
t_check_trans(); // 检查事务
exit; // 退出
}
t_check_trans(); // 检查事务
}
route(WITHINDLG); // 处理SIP对话内的请求
remove_hf("Route"); // 移除预加载的Route头
if (is_method("INVITE|SUBSCRIBE|REFER")) { // 如果是INVITE、SUBSCRIBE或REFER请求
record_route(); // 记录路由
}
if (is_method("INVITE")) { // 如果是INVITE请求
setflag(FLT_ACC); // 设置计费标志
}
route(SIPOUT); // 转发请求到外部域
route(PRESENCE); // 处理Presence相关请求
route(REGISTRAR); // 处理注册请求
if ($rU==$null) { // 如果RURI中没有用户名
sl_send_reply("484", "Address Incomplete"); // 发送484响应
exit; // 退出
}
if(is_method("INVITE")) { // 如果是INVITE请求
dlgs_init("$fu", "$tu", "srcip=$si"); // 初始化对话
}
route(PSTN); // 转发请求到PSTN
route(LOCATION); // 处理用户位置服务
return; // 返回
}
route[RELAY] { // 转发请求的封装
if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) { // 如果是INVITE、BYE、SUBSCRIBE或UPDATE请求
if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH"); // 设置分支路由
}
if (is_method("INVITE|SUBSCRIBE|UPDATE")) { // 如果是INVITE、SUBSCRIBE或UPDATE请求
if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY"); // 设置回复路由
}
if (is_method("INVITE")) { // 如果是INVITE请求
if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE"); // 设置失败路由
}
if (!t_relay()) { // 如果转发失败
sl_reply_error(); // 发送错误响应
}
exit; // 退出
}
route[REQINIT] { // 请求初始化检查
set_reply_no_connect(); // 设置不连接回复
force_rport(); // 强制使用请求的源端口
#!ifdef WITH_ANTIFLOOD // 如果定义了WITH_ANTIFLOOD
if(src_ip!=myself) { // 如果请求源IP不是本机
if($sht(ipban=>$si)!=$null) { // 如果IP已被封禁
xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n"); // 记录调试信息
exit; // 退出
}
if (!pike_check_req()) { // 如果检测到洪水攻击
xalert("ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n"); // 记录警报信息
$sht(ipban=>$si) = 1; // 封禁IP
exit; // 退出
}
}
#!endif
if($ua =~ "friendly|scanner|sipcli|sipvicious|VaxSIPUserAgent|pplsip") { // 如果User-Agent匹配已知扫描器
exit; // 退出
}
if (!mf_process_maxfwd_header("10")) { // 如果Max-Forwards头超过10跳
sl_send_reply("483", "Too Many Hops"); // 发送483响应
exit; // 退出
}
if(is_method("OPTIONS") && uri==myself && $rU==$null) { // 如果是OPTIONS请求且URI为本机且无用户名
sl_send_reply("200", "Keepalive"); // 发送200响应
exit; // 退出
}
if(!sanity_check("17895", "7")) { // 如果请求格式不合法
xlog("Malformed SIP request from $si:$sp\n"); // 记录错误日志
exit; // 退出
}
}
route[WITHINDLG] { // 处理SIP对话内的请求
if (!has_totag()) return; // 如果没有To标签,返回
if (loose_route()) { // 如果松散路由
route(DLGURI); // 更新对话URI
dlgs_update(); // 更新对话状态
if (is_method("BYE")) { // 如果是BYE请求
setflag(FLT_ACC); // 设置计费标志
setflag(FLT_ACCFAILED); // 设置失败计费标志
} else if ( is_method("ACK") ) { // 如果是ACK请求
route(NATMANAGE); // 处理NAT
} else if ( is_method("NOTIFY|REFER") ) { // 如果是NOTIFY或REFER请求
record_route(); // 记录路由
}
route(RELAY); // 转发请求
exit; // 退出
}
if (is_method("SUBSCRIBE") && uri == myself) { // 如果是SUBSCRIBE请求且URI为本机
route(PRESENCE); // 处理Presence请求
exit; // 退出
}
if ( is_method("ACK") ) { // 如果是ACK请求
if ( t_check_trans() ) { // 如果事务存在
route(RELAY); // 转发请求
exit; // 退出
} else { // 否则
exit; // 退出
}
}
sl_send_reply("404", "Not here"); // 发送404响应
exit; // 退出
}
route[REGISTRAR] { // 处理注册请求
if (!is_method("REGISTER")) return; // 如果不是REGISTER请求,返回
if(isflagset(FLT_NATS)) { // 如果NAT标志已设置
setbflag(FLB_NATB); // 设置NAT分支标志
#!ifdef WITH_NATSIPPING // 如果定义了WITH_NATSIPPING
setbflag(FLB_NATSIPPING); // 设置NAT SIP PING标志
#!endif
}
if (!save("location")) { // 如果保存位置失败
sl_reply_error(); // 发送错误响应
}
exit; // 退出
}
route[LOCATION] { // 处理用户位置服务
#!ifdef WITH_SPEEDDIAL // 如果定义了WITH_SPEEDDIAL
if($rU=~"^[0-9][0-9]$") { // 如果RURI是2位数字
if(sd_lookup("speed_dial")) { // 查找速拨号码
route(SIPOUT); // 转发请求
}
}
#!endif
#!ifdef WITH_ALIASDB // 如果定义了WITH_ALIASDB
if(alias_db_lookup("dbaliases")) { // 查找数据库别名
route(SIPOUT); // 转发请求
}
#!endif
$avp(oexten) = $rU; // 设置AVP变量
if (!lookup("location")) { // 如果查找位置失败
$var(rc) = $rc; // 保存返回码
route(TOVOICEMAIL); // 转发到语音邮件
t_newtran(); // 创建新事务
switch ($var(rc)) { // 根据返回码处理
case -1:
case -3:
send_reply("404", "Not Found"); // 发送404响应
exit; // 退出
case -2:
send_reply("405", "Method Not Allowed"); // 发送405响应
exit; // 退出
}
}
if (is_method("INVITE")) { // 如果是INVITE请求
setflag(FLT_ACCMISSED); // 设置未接来电计费标志
}
route(RELAY); // 转发请求
exit; // 退出
}
route[PRESENCE] { // 处理Presence相关请求
if(!is_method("PUBLISH|SUBSCRIBE")) return; // 如果不是PUBLISH或SUBSCRIBE请求,返回
if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") { // 如果是SUBSCRIBE请求且Event头为message-summary
route(TOVOICEMAIL); // 转发到语音邮件
sl_send_reply("404", "No voicemail service"); // 发送404响应
exit; // 退出
}
#!ifdef WITH_PRESENCE // 如果定义了WITH_PRESENCE
#!ifdef WITH_MSGREBUILD // 如果定义了WITH_MSGREBUILD
msg_apply_changes(); // 应用消息更改
#!endif
if (!t_newtran()) { // 如果创建新事务失败
sl_reply_error(); // 发送错误响应
exit; // 退出
}
if(is_method("PUBLISH")) { // 如果是PUBLISH请求
handle_publish(); // 处理PUBLISH请求
t_release(); // 释放事务
} else if(is_method("SUBSCRIBE")) { // 如果是SUBSCRIBE请求
handle_subscribe(); // 处理SUBSCRIBE请求
t_release(); // 释放事务
}
exit; // 退出
#!endif
if (is_method("PUBLISH") || $rU==$null) { // 如果是PUBLISH请求或RURI为空
sl_send_reply("404", "Not here"); // 发送404响应
exit; // 退出
}
return; // 返回
}
route[AUTH] { // 处理认证
#!ifdef WITH_AUTH // 如果定义了WITH_AUTH
#!ifdef WITH_IPAUTH // 如果定义了WITH_IPAUTH
if((!is_method("REGISTER")) && allow_source_address()) { // 如果不是REGISTER请求且源IP允许
return; // 返回
}
#!endif
if (is_method("REGISTER") || from_uri==myself) { // 如果是REGISTER请求或来自本机
if (!auth_check("$fd", "subscriber", "1")) { // 如果认证失败
auth_challenge("$fd", "0"); // 发送认证挑战
exit; // 退出
}
if(!is_method("REGISTER|PUBLISH"))
consume_credentials(); // 消耗认证凭证
}
if (from_uri!=myself && uri!=myself) { // 如果请求不是来自本机且URI不是本机
sl_send_reply("403", "Not relaying"); // 发送403响应
exit; // 退出
}
#!else // 否则
if(uri!=myself) { // 如果URI不是本机
sl_send_reply("403", "Not relaying"); // 发送403响应
exit; // 退出
}
#!endif
return; // 返回
}
route[NATDETECT] { // 检测NAT
#!ifdef WITH_NAT // 如果定义了WITH_NAT
11-20
1229
