淘宝店做网站建设不能开直通车,河西网站建设公司,睢县房产网站建设,做网站公司介绍pptKamailio#xff1a;调用set_contact_alias()之后#xff0c;在原有的contact的后面增加参数#xff0c;具体地说#xff0c;就是网络地址#xff0c;网络端口和transport#xff0c;好处是收到后续请求之时可以恢复原有contact的内容#xff08;当然也有坏处#xff0…Kamailio调用set_contact_alias()之后在原有的contact的后面增加参数具体地说就是网络地址网络端口和transport好处是收到后续请求之时可以恢复原有contact的内容当然也有坏处就是增加参数之后导致包大可能超过MTU
OpenSIPS调用fix_nated_contact()之后用网络地址和网络端口直接覆盖了在原有的contact那么当收到后续请求时不太可能恢复原有contact的内容。窃以为一定要慎重
比如下图所示OpenSIPS就不要修改uac的contact显然如此
UAC---第三方Proxy---OpenSIPS---FreeSWITCH
参考链接
https://kb.smartvox.co.uk/opensips/nat-contact-and-via-fixing-in-sip-part-3/
当然我们可以模仿set_contact_alias函数
route[set_contact_alias] {if (is_present_hf(contact)) {$var(sut) $si ~ $sp ~ $socket_in(proto); # 远端网络地址$var(ct) $(ct{re.subst,/^(.*)(.*)/\2/}); # 取contact 里面的内容# 更换成新的contact$var(new_ct) $var(ct) ;my_alias $var(sut) ;remove_hf(contact);insert_hf(Contact: $var(new_ct)\r\n, Call-ID);}
}route[restore_contact_by_alias] {if (!has_totag()) { # 对话内请求才能调用这个路由return;}# xlog(***ru $ru, du $du\n);if ($du ! NULL) { # 如果已经设置了$du那么不能再调用这个路由return;}$var(my_alias) $(ru{nameaddr.param,my_alias});# xlog(***my_alias $var(my_alias)\n);if ($var(my_alias) ! NULL) {$var(ip) $(var(my_alias){s.select,0,~});$var(port) $(var(my_alias){s.select,1,~});$var(transport) $(var(my_alias){s.select,2,~});$var(url) sip: $var(ip) : $var(port) ;transport $var(transport);# xlog(url $var(url)\n);setdsturi($var(url));$ru $(ru{re.subst,/^(sip:.*);my_alias.*/\1/}); # 删除ru里面的my_alias以及内容 }
}完整的路由脚本如下
####### Global Parameters #########/* uncomment the following lines to enable debugging */
#debug_modeyeslog_level3
xlog_level3
stderror_enabledno
syslog_enabledyes
syslog_facilityLOG_LOCAL0udp_workers4/* uncomment the next line to enable the auto temporary blacklisting ofnot available destinations (default disabled) */
#disable_dns_blacklistno/* uncomment the next line to enable IPv6 lookup after IPv4 dnslookup failures (default disabled) */
#dns_try_ipv6yessocketudp:172.20.10.6:5060 # CUSTOMIZE ME
sockettcp:172.20.10.6:5060 # CUSTOMIZE ME####### Modules Section #########set module path
mpath/usr/lib/x86_64-linux-gnu/opensips/modules/#### SIGNALING module
loadmodule signaling.so#### StateLess module
loadmodule sl.so#### Transaction Module
loadmodule tm.so
modparam(tm, fr_timeout, 5)
modparam(tm, fr_inv_timeout, 30)
modparam(tm, restart_fr_on_each_reply, 0)
modparam(tm, onreply_avp_mode, 1)#### Record Route Module
loadmodule rr.so
/* do not append from tag to the RR (no need for this script) */
modparam(rr, append_fromtag, 0)#### MAX ForWarD module
loadmodule maxfwd.so#### SIP MSG OPerationS module
loadmodule sipmsgops.so#### FIFO Management Interface
loadmodule mi_fifo.so
modparam(mi_fifo, fifo_name, /tmp/opensips_fifo)
modparam(mi_fifo, fifo_mode, 0666)#### MYSQL module
loadmodule db_mysql.so#### HTTPD module
loadmodule httpd.so
modparam(httpd, port, 8888)#### USeR LOCation module
loadmodule usrloc.so
modparam(usrloc, nat_bflag, NAT)
modparam(usrloc, working_mode_preset, single-instance-sql-write-back)
modparam(usrloc, db_url,mysql://opensips:opensipsrwlocalhost/opensips) # CUSTOMIZE ME#### REGISTRAR module
loadmodule registrar.so
modparam(registrar, tcp_persistent_flag, TCP_PERSISTENT)
modparam(registrar, received_avp, $avp(received_nh))/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam(registrar, max_contacts, 10)#### ACCounting module
loadmodule acc.so
/* what special events should be accounted ? */
modparam(acc, early_media, 0)
modparam(acc, report_cancels, 0)
/* by default we do not adjust the direct of the sequential requests.if you enable this parameter, be sure to enable append_fromtagin rr module */
modparam(acc, detect_direction, 0)#### NAT modules
loadmodule nathelper.so
modparam(nathelper, natping_interval, 10)
modparam(nathelper, ping_nated_only, 1)
modparam(nathelper, sipping_bflag, SIP_PING_FLAG)
modparam(nathelper, sipping_from, sip:pinger127.0.0.1) #CUSTOMIZE ME
modparam(nathelper, received_avp, $avp(received_nh))# loadmodule rtpproxy.so
# modparam(rtpproxy, rtpproxy_sock, udp:localhost:12221) # CUSTOMIZE ME#### MI_HTTP module
loadmodule mi_http.soloadmodule proto_udp.so
loadmodule proto_tcp.so
####### Routing Logic ######### main request routing logicroute{xlog($rm|$fU|$tU|$ci from $si:$sp\n);# initial NAT handling; detect if the request comes from behind a NAT# and apply contact fixingforce_rport();#if (nat_uac_test(23)) {if (true) {if (is_method(REGISTER)) {fix_nated_register();setbflag(NAT);} else {# fix_nated_contact();route(set_contact_alias);setflag(NAT);}}if (!mf_process_maxfwd_header(10)) {send_reply(483,Too Many Hops);exit;}if (has_totag()) {# handle hop-by-hop ACK (no routing required)if ( is_method(ACK) t_check_trans() ) {t_relay();exit;}# sequential request within a dialog should# take the path determined by record-routingif ( !loose_route() ) {# we do record-routing for all our traffic, so we should not# receive any sequential requests without Route hdr.send_reply(404,Not here);exit;}route(restore_contact_by_alias);if (is_method(BYE)) {# do accounting even if the transaction failsdo_accounting(log,failed);}if (check_route_param(natyes))setflag(NAT);# route it out to whatever destination was set by loose_route()# in $du (destination URI).route(relay);exit;}# CANCEL processingif (is_method(CANCEL)) {if (t_check_trans())t_relay();exit;}# absorb retransmissions, but do not create transactiont_check_trans();if ( !(is_method(REGISTER) ) ) {if (is_myself($fd)) {} else {# if caller is not local, then called number must be localif (!is_myself($rd)) {send_reply(403,Relay Forbidden);exit;}}}# preloaded route checkingif (loose_route()) {xlog(L_ERR,Attempt to route with preloaded Routes [$fu/$tu/$ru/$ci]);if (!is_method(ACK))send_reply(403,Preload Route denied);exit;}# record routingif (!is_method(REGISTER|MESSAGE))record_route();# account only INVITEsif (is_method(INVITE)) {do_accounting(log);}if (!is_myself($rd)) {append_hf(P-hint: outbound\r\n);route(relay);}# requests for my domainif (is_method(PUBLISH|SUBSCRIBE)) {send_reply(503, Service Unavailable);exit;}if (is_method(REGISTER)) {if ($socket_in(proto) tcp)setflag(TCP_PERSISTENT);if (isflagset(NAT)) {setbflag(SIP_PING_FLAG);}# store the registration and generate a SIP replyif (!save(location))xlog(failed to register AoR $tu\n);exit;}if ($rUNULL) {# request with no Username in RURIsend_reply(484,Address Incomplete);exit;}# do lookup with method filteringif (!lookup(location, method-filtering)) {t_reply(404, Not Found);exit;}if (isbflagset(NAT)) setflag(NAT);# when routing via usrloc, log the missed calls alsodo_accounting(log,missed);route(relay);
}route[relay] {# for INVITEs enable some additional helper routesif (is_method(INVITE)) {# if (isflagset(NAT) has_body(application/sdp)) {# rtpproxy_offer(ro);# }t_on_branch(per_branch_ops);t_on_reply(handle_nat);t_on_failure(missed_call);}if (isflagset(NAT)) {add_rr_param(;natyes);}if (!t_relay()) {send_reply(500,Internal Error);}exit;
}branch_route[per_branch_ops] {xlog(new branch at $ru\n);
}onreply_route[handle_nat] {#if (nat_uac_test(1))# fix_nated_contact();route(set_contact_alias);# if ( isflagset(NAT) has_body(application/sdp) )# rtpproxy_answer(ro);xlog(incoming reply\n);
}failure_route[missed_call] {if (t_was_cancelled()) {exit;}# uncomment the following lines if you want to block client# redirect based on 3xx replies.##if (t_check_status(3[0-9][0-9])) {##t_reply(404,Not found);## exit;##}
}route[set_contact_alias] {if (is_present_hf(contact)) {$var(sut) $si ~ $sp ~ $socket_in(proto); # 远端网络地址$var(ct) $(ct{re.subst,/^(.*)(.*)/\2/}); # 取contact 里面的内容# 更换成新的contact$var(new_ct) $var(ct) ;my_alias $var(sut) ;remove_hf(contact);insert_hf(Contact: $var(new_ct)\r\n, Call-ID);}
}route[restore_contact_by_alias] {if (!has_totag()) { # 对话内请求才能调用这个路由return;}# xlog(***ru $ru, du $du\n);if ($du ! NULL) { # 如果已经设置了$du那么不能再调用这个路由return;}$var(my_alias) $(ru{nameaddr.param,my_alias});# xlog(***my_alias $var(my_alias)\n);if ($var(my_alias) ! NULL) {$var(ip) $(var(my_alias){s.select,0,~});$var(port) $(var(my_alias){s.select,1,~});$var(transport) $(var(my_alias){s.select,2,~});$var(url) sip: $var(ip) : $var(port) ;transport $var(transport);# xlog(url $var(url)\n);setdsturi($var(url));$ru $(ru{re.subst,/^(sip:.*);my_alias.*/\1/}); # 删除ru里面的my_alias以及内容 }
}以上脚本在OpenSIPS3.4.3上调试通过但没测试其他版本
于2024年2月8日次日即除夕
全文完