Browse Source

rework nat with set_contact_alias/handle_ruri_alias

4.3
lazedo 7 years ago
committed by Luis Azedo
parent
commit
419bed5d83
6 changed files with 99 additions and 87 deletions
  1. +9
    -19
      kamailio/default.cfg
  2. +61
    -41
      kamailio/nat-traversal-role.cfg
  3. +6
    -0
      kamailio/presence-notify.cfg
  4. +2
    -5
      kamailio/presence-role.cfg
  5. +13
    -17
      kamailio/registrar-role.cfg
  6. +8
    -5
      kamailio/websockets-role.cfg

+ 9
- 19
kamailio/default.cfg View File

@ -344,6 +344,10 @@ route
route(HANDLE_WEBSOCKETS); route(HANDLE_WEBSOCKETS);
#!endif #!endif
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_INITIAL_TEST);
#!endif
route(HANDLE_OPTIONS); route(HANDLE_OPTIONS);
route(HANDLE_NOTIFY); route(HANDLE_NOTIFY);
@ -452,10 +456,6 @@ route[HANDLE_OPTIONS]
} }
#!endif #!endif
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_TEST_AND_CORRECT);
#!endif
sl_send_reply("200", "Rawr!!"); sl_send_reply("200", "Rawr!!");
} }
exit; exit;
@ -487,14 +487,6 @@ route[HANDLE_NOTIFY]
} }
#!endif #!endif
#!ifdef WEBSOCKETS_ROLE
route(NAT_WEBSOCKETS_CORRECT);
#!endif
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_TEST_AND_CORRECT);
#!endif
if($hdr(Event) == "keep-alive") { if($hdr(Event) == "keep-alive") {
xlog("L_INFO", "$ci|stop|replying to keep alive\n"); xlog("L_INFO", "$ci|stop|replying to keep alive\n");
sl_send_reply("405", "Stay Alive / Method Not Allowed"); sl_send_reply("405", "Stay Alive / Method Not Allowed");
@ -704,12 +696,6 @@ route[EXTERNAL_TO_INTERNAL_RELAY]
} }
#!endif #!endif
#!ifdef NAT_TRAVERSAL_ROLE
if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
route(NAT_TEST_AND_CORRECT);
}
#!endif
remove_hf_re("^X-.*"); remove_hf_re("^X-.*");
append_hf("X-AUTH-IP: $si\r\n"); append_hf("X-AUTH-IP: $si\r\n");
@ -736,7 +722,7 @@ onreply_route[EXTERNAL_REPLY]
#!endif #!endif
#!ifdef NAT_TRAVERSAL_ROLE #!ifdef NAT_TRAVERSAL_ROLE
route(NAT_TEST_AND_CORRECT);
route(NAT_REPLY_TEST);
#!endif #!endif
#!ifdef ACL_ROLE #!ifdef ACL_ROLE
@ -766,6 +752,10 @@ onreply_route[INTERNAL_REPLY]
route(NAT_WEBSOCKETS_CORRECT); route(NAT_WEBSOCKETS_CORRECT);
#!endif #!endif
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_REPLY_TEST);
#!endif
#!ifdef ACL_ROLE #!ifdef ACL_ROLE
setflag(FLAG_IS_REPLY); setflag(FLAG_IS_REPLY);
route(ACL_CHECK); route(ACL_CHECK);


+ 61
- 41
kamailio/nat-traversal-role.cfg View File

@ -6,50 +6,70 @@ loadmodule "nathelper.so"
modparam("nathelper", "received_avp", "$avp(AVP_RECV_PARAM)") modparam("nathelper", "received_avp", "$avp(AVP_RECV_PARAM)")
modparam("nathelper", "sipping_from", "sip:sipcheck@MY_HOSTNAME") modparam("nathelper", "sipping_from", "sip:sipcheck@MY_HOSTNAME")
#!trydef KZ_NAT_CONTACT_DETECT "1"
#!trydef KZ_NAT_PORT_DETECT "2"
#!trydef KZ_NAT_DETECT "19"
####### NAT Traversal Logic ######## ####### NAT Traversal Logic ########
route[NAT_TEST_AND_CORRECT]
route[NAT_INITIAL_TEST]
{ {
if (is_present_hf("Record-Route")) {
$var(i) = 0;
$var(rr_count) = $rr_count;
while($var(i) < $var(rr_count)) {
$var(rr_base) = $(hdr(Record-Route)[$var(i)]);
$var(rr_idx) = 0;
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,});
while($var(rr) != $null && $var(rr) != "") {
$var(i) = $var(i) + 1;
if (!is_myself("$(var(rr){nameaddr.uri})")) {
setflag(FLAG_SKIP_NAT_CORRECTION);
xlog("L_DEBUG", "$ci|log|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n");
}
$var(rr_idx) = $var(rr_idx) + 1;
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,});
}
}
} else if ($Rp == "5080") {
setflag(FLAG_SKIP_NAT_CORRECTION);
}
if (isflagset(FLAG_SKIP_NAT_CORRECTION)) {
return();
}
if (nat_uac_test(KZ_NAT_PORT_DETECT)) {
xlog("L_DEBUG", "$ci|nat|forcing rport\n");
force_rport();
}
if (nat_uac_test(KZ_NAT_CONTACT_DETECT)) {
xlog("L_DEBUG", "$ci|nat|contact correction\n");
fix_nated_contact();
}
if (has_body("application/sdp") && nat_uac_test("8")) {
fix_nated_sdp("10");
}
if(nat_uac_test(64)) return();
if(!is_method("INVITE|REGISTER|SUBSCRIBE")) return();
if ($Rp == "5080") {
setflag(FLAG_SKIP_NAT_CORRECTION);
} else {
if (is_present_hf("Record-Route")) {
$var(i) = 0;
$var(rr_count) = $rr_count;
while($var(i) < $var(rr_count)) {
$var(rr_base) = $(hdr(Record-Route)[$var(i)]);
$var(rr_idx) = 0;
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,});
while($var(rr) != $null && $var(rr) != "") {
$var(i) = $var(i) + 1;
if (!is_myself("$(var(rr){nameaddr.uri})")) {
setflag(FLAG_SKIP_NAT_CORRECTION);
xlog("L_DEBUG", "$ci|log|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n");
}
$var(rr_idx) = $var(rr_idx) + 1;
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,});
}
}
}
}
if (isflagset(FLAG_SKIP_NAT_CORRECTION)) {
return();
}
if(nat_uac_test(KZ_NAT_DETECT)) {
force_rport();
setflag(FLAG_NAT);
if (!is_method("REGISTER")) {
if(is_first_hop()) set_contact_alias();
}
}
if (has_body("application/sdp") && nat_uac_test("8")) {
fix_nated_sdp("10");
}
}
route[NAT_REPLY_TEST]
{
if(nat_uac_test(64)) return();
if(nat_uac_test(KZ_NAT_DETECT)) {
setflag(FLAG_NAT);
force_rport();
set_contact_alias();
}
if (has_body("application/sdp") && nat_uac_test("8")) {
fix_nated_sdp("10");
}
} }
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 6
- 0
kamailio/presence-notify.cfg View File

@ -32,6 +32,12 @@ route[PRESENCE_LOCAL_NOTIFY]
record_route(); record_route();
} }
#!ifdef NAT_TRAVERSAL_ROLE
if(!isdsturiset()) {
handle_ruri_alias();
}
#!endif
#!ifdef SIP_TRACE_ROLE #!ifdef SIP_TRACE_ROLE
route(SEND_SIP_TRACE); route(SEND_SIP_TRACE);
#!endif #!endif


+ 2
- 5
kamailio/presence-role.cfg View File

@ -80,12 +80,9 @@ kazoo.presence_max_call_per_presentity = KZ_PRESENCE_MAX_CALL_PER_PRESENTITY des
#!ifdef NAT_TRAVERSAL_ROLE #!ifdef NAT_TRAVERSAL_ROLE
route[PRESENCE_NAT] route[PRESENCE_NAT]
{ {
force_rport();
if (client_nat_test("3")) {
if(is_first_hop())
set_contact_alias();
if (isflagset(FLAG_NAT)) {
nat_keepalive();
} }
nat_keepalive();
} }
#!endif #!endif


+ 13
- 17
kamailio/registrar-role.cfg View File

@ -95,24 +95,20 @@ route[HANDLE_REGISTER]
resetbflag(FLB_NATB); resetbflag(FLB_NATB);
resetbflag(FLB_NATSIPPING); resetbflag(FLB_NATSIPPING);
#!ifdef NAT_TRAVERSAL_ROLE
if (nat_uac_test("3")) {
xlog("L_INFO", "$ci|log|correcting NATed contact in registration\n");
force_rport();
}
fix_nated_register();
## KAZOO-1846: Cisco SPA8000 freaks out on options pings
if (!($ua =~ "Linksys/SPA8000"
|| $ua =~ "SIPp"
|| (af==INET6)
)) {
setbflag(FLB_NATB);
setbflag(FLB_NATSIPPING);
if (isflagset(FLAG_NAT)) {
fix_nated_register();
## KAZOO-1846: Cisco SPA8000 freaks out on options pings
if (!($ua =~ "Linksys/SPA8000"
|| $ua =~ "SIPp"
|| (af==INET6)
)) {
setbflag(FLB_NATB);
setbflag(FLB_NATSIPPING);
}
} else {
$avp(AVP_RECV_PARAM) = $su;
} }
#!else
$avp(AVP_RECV_PARAM) = $su;
#!endif
route(ATTEMPT_AUTHORIZATION); route(ATTEMPT_AUTHORIZATION);


+ 8
- 5
kamailio/websockets-role.cfg View File

@ -33,13 +33,15 @@ route[HANDLE_WEBSOCKETS]
# connection - even if it is not behind a NAT! # connection - even if it is not behind a NAT!
# This won't be needed in the future if Kamailio and the # This won't be needed in the future if Kamailio and the
# WebSocket client support Outbound and Path. # WebSocket client support Outbound and Path.
if(!is_method("INVITE|REGISTER|PUBLISH|SUBSCRIBE")) return();
if (nat_uac_test(64)) { if (nat_uac_test(64)) {
setflag(FLAG_NAT);
xlog("L_INFO", "$ci|log|this is a websocket request\n"); xlog("L_INFO", "$ci|log|this is a websocket request\n");
force_rport(); force_rport();
if (is_method("REGISTER")) {
fix_nated_register();
} else {
if (!add_contact_alias()) {
if (!is_method("REGISTER")) {
if (is_first_hop() && !set_contact_alias()) {
xlog("L_INFO", "$ci|stop|error aliasing contact <$ct>\n"); xlog("L_INFO", "$ci|stop|error aliasing contact <$ct>\n");
sl_send_reply("400", "Bad Request"); sl_send_reply("400", "Bad Request");
exit; exit;
@ -56,7 +58,8 @@ route[NAT_WEBSOCKETS_CORRECT]
# WebSocket client support Outbound and Path. # WebSocket client support Outbound and Path.
if (nat_uac_test(64)) { if (nat_uac_test(64)) {
xlog("L_INFO", "$ci|log|this is a websocket request\n"); xlog("L_INFO", "$ci|log|this is a websocket request\n");
add_contact_alias();
setflag(FLAG_NAT);
set_contact_alias();
} }
} }


Loading…
Cancel
Save