[Serusers] nathelper / calling UAs behind symmetric NATs

Thilo Salmon salmon at netzquadrat.de
Mon Dec 29 16:52:44 CET 2003


Hi,

I am trying to force incoming calls destined for a UA behind a symmetric
NAT through rtpproxy. In order to distinguish between those agents
behind a NAT and those out in the open, I saved their location in two
different tables upon registration. It now appears that even though I
set db_mode to '1' to force usrloc to immediately  write-back all data
to the db, ser remembers a successful registration in the regular
location tables.

A REGISTER request is immediately written into my NAT tables while the
regular tables follows only a little later. When I call the UA in
question ser will find the agent in my regular location table.  When I
manually delete the UA entry from the location table (and restart ser!)
my configuration will force the rtp stream just as expected.

Can anybody enlighten my whether this is a bug or a feature? Also I
would be very interested in learning how to handle UAs behind symmetric
NATs or how to keep state learned at registration time.

I attached  parts of my configuration hoping to clarify what I am trying
to do. 

Thilo

P.S.: this is ser 0.8.12

                if (method=="REGISTER") {
                         if ("header indicates symmetric NAT") { 
                                 save("natlocation");
                         } else {
                                 save("location");
                         };
                };

[...]

                if ((method==INVITE)) {
                         if(lookup("location")) {
                                          xlog("L_ERR", "UA found in
'location'\n");
                                 }
                                 else {
                                     if(lookup("natlocation")) {
                                          xlog("L_ERR", "UA found in
'natlocation'\n");
                                          force_rtp_proxy();
                                          t_on_reply("2");
                                 } else {
                                          sl_send_reply("404", "Not
Found");
                                          break;
                                 };
                     };
             };

[...]

onreply_route[2] {
        if (status=~"2[0-9][0-9]"){
                     xlog("L_ERR", "forcing rtp stream back from NATed
UA through localhost\n");
                     force_rport();
                     force_rtp_proxy();
        };
}





More information about the sr-users mailing list