<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Title" content="">
<meta name="Keywords" content="">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Arial;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Courier New";
        panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Apple Color Emoji";
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Menlo;
        panose-1:2 11 6 9 3 8 4 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:793790790;
        mso-list-type:hybrid;
        mso-list-template-ids:-1537809386 -266991360 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:3;
        mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New",serif;}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New",serif;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New",serif;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style>
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">John,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">You just need to tell OpenSIPS to use the public IP in messaging instead of the private IP. You can do this a few ways depending on your scenario and your requirements.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If you can use the public IP always, when sending both to Asterisk and the SIP provider, then you can use the global parameter set_advertised_address [1]. This will cover all messaging and is the easiest method.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If the Asterisk side must use the private IP, then one way is to have two separate interfaces, and set the advertised address of the public-facing one to the Public NAT IP using the “as” function of the “listen” parameter [2]. Then you
 can use routing rules on the host or the force_send_socket() [3] function to send messages out the appropriate interface for internal or external. OpenSIPS should use the appropriate address in messaging, including (I believe) the necessary double record-routing,
 although this may require the setting of the mhomed [4] parameter, I am not sure.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If you only have one interface available on the machine, then you can use the record_route_preset() [5] function but you can’t use it in a reply, as you say. Record-Route headers are added as the Request passes through, not on the reply.
 You will also have to double record-route so there will be a record for each interface the message traverses (public and private). So on an initial request from the public network, you will record route the private first, then the public, like so:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial",sans-serif">record_route_preset("PRIVATE_ADDRESS:LOCAL_PORT", "PUBLIC_ADDRESS:LOCAL_PORT");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial",sans-serif">add_rr_param(";r2=on");</span><span style="font-size:10.0pt;font-family:"Menlo",sans-serif"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Menlo",sans-serif"><o:p> </o:p></span></p>
<p class="MsoNormal">On a request from the private to public network, you would reverse the order of the addresses in the record-route. The “r2=on” parameter is necessary to let OpenSIPS know that double record-routing was used, so that both Route headers will
 be removed when loose_route() is called for sequential requests. This is the way I have implemented it as neither of the other two options would work for me.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There are probably also a few other ways to do it too. <span style="font-family:"Apple Color Emoji"">
☺</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[1]  - <a href="http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc25">
http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc25</a><o:p></o:p></p>
<p class="MsoNormal">[2] - <a href="http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc63">
http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc63</a><o:p></o:p></p>
<p class="MsoNormal">[3] - <a href="http://www.opensips.org/Documentation/Script-CoreFunctions-2-3#toc16">
http://www.opensips.org/Documentation/Script-CoreFunctions-2-3#toc16</a><o:p></o:p></p>
<p class="MsoNormal">[4] - <a href="http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc78">
http://www.opensips.org/Documentation/Script-CoreParameters-2-3#toc78</a><o:p></o:p></p>
<p class="MsoNormal">[5] - <a href="http://www.opensips.org/html/docs/modules/2.3.x/rr.html#idp5595248">
http://www.opensips.org/html/docs/modules/2.3.x/rr.html#idp5595248</a><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Ben Newlin<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Users <users-bounces@lists.opensips.org> on behalf of John Hablitzel <jjblitz071@gmail.com><br>
<b>Reply-To: </b>OpenSIPS users mailling list <Users@lists.opensips.org><br>
<b>Date: </b>Thursday, January 11, 2018 at 12:18 PM<br>
<b>To: </b>"Users@lists.opensips.org" <Users@lists.opensips.org><br>
<b>Subject: </b>[OpenSIPS-Users] Opensips behind a NAT - change record-route<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Relatively new to OpenSIPS but have been working with Asterisk and VoIP for several years.  We want to use the load balancer or dispatcher modules to distribute inbound calls from a SIP provider among several Asterisk servers.  This will
 be coming in from another private network that is out of our control, therefore security is definitely required.  We won't be using OpenSIPS to control far-end clients that are behind NAT (far-end).   
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I know that it is recommended in this situation that OpenSIPS be on a public IP (or IP on the "outside" network", but the requirement in this particular situation is that this must be behind a NAT firewall, as there are other IP communications
 from servers on the the internal network that must use this same outside IP for communications with other services.  The outside network provider only allows us to have a single IP on their network for everything.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I have the inbound calls mostly working now in my lab with the LB module, using RTPProxy to anchor the media and some of the nathelper stuff.  However am seeing issues with the ACK on the 200OK being sent to the internal OpenSIPS IP and
 not the external IP on the NAT.  I believe this is due to the Internal IP being in the record-route header on the 200OK.  Pouring through the forums and other documentation I can find, I haven't been able to find any way to change this.  <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">So I have 2 questions:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">1) Is OpenSIPS even capable of operating in this mode?  In everything I've read, there is a bunch of documentation about handling NAT at the far-end, where UAC's are behind a NAT, but very little (and nothing with any concrete solution)
 about using OpenSIPS server behind a NAT.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">2) if it is possible, can anyone provide a sample .cfg where they are have accomplished it?  I tried adding record_route_preset to the reply section, but OpenSIPS complains saying it can't be added in a reply section.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Here is my setup.  Any help will be greatly appreciated.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Asterisk PBXs<---------------------OpenSIPS<-------------------------------Firewall<---------------------------Trunk Provider (Asterisk box)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">10.95.95.235                            10.95.95.220                       10.95.95.1 - 192.168.85.252                        192.168.85.242<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">10.95.95.236<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">My .cfg.  I realize there is a bunch of extra "stuff" here, but am working from a template at this point since I'm still going through the huge learning curve of OpenSIPS.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">####### Global Parameters #########<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">log_level=4 #debug<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#log_level=3 #info<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">log_stderror=no<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">log_facility=LOG_LOCAL0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">children=4<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">/* uncomment the following lines to enable debugging */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#debug_mode=yes<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">/* uncomment the next line to enable the auto temporary blacklisting of <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   not available destinations (default disabled) */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#disable_dns_blacklist=no<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">/* uncomment the next line to enable IPv6 lookup after IPv4 dns <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   lookup failures (default disabled) */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#dns_try_ipv6=yes<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">/* comment the next line to enable the auto discovery of local aliases<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   based on revers DNS on IPs */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">auto_aliases=no<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">listen=udp:<a href="http://10.95.95.220:5060">10.95.95.220:5060</a>   # CUSTOMIZE ME<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#listen=tcp:<a href="http://10.95.95.220:5060">10.95.95.220:5060</a>   # CUSTOMIZE ME <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">####### Modules Section ########<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#set module path<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">mpath="/usr/local/lib64/opensips/modules/"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### SIGNALING module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "signaling.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### StateLess module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "sl.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### Transaction Module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "tm.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("tm", "fr_timeout", 5)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("tm", "fr_inv_timeout", 30)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("tm", "restart_fr_on_each_reply", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("tm", "onreply_avp_mode", 1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### Record Route Module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "rr.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">/* do not append from tag to the RR (no need for this script) */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("rr", "append_fromtag", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### MAX ForWarD module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "maxfwd.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### SIP MSG OPerationS module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "sipmsgops.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### FIFO Management Interface<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "mi_fifo.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("mi_fifo", "fifo_mode", 0666)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### URI module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "uri.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("uri", "use_uri_table", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### USeR LOCation module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "usrloc.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("usrloc", "nat_bflag", "NAT")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("usrloc", "db_mode",   0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### REGISTRAR module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "registrar.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("registrar", "received_avp", "$avp(received_nh)")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">/* uncomment the next line not to allow more than 10 contacts per AOR */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#modparam("registrar", "max_contacts", 10)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#### ACCounting module<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "acc.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">/* what special events should be accounted ? */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("acc", "early_media", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("acc", "report_cancels", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">/* by default we do not adjust the direct of the sequential requests.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   if you enable this parameter, be sure the enable "append_fromtag"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   in "rr" module */<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("acc", "detect_direction", 0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">####  NAT modules<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "nathelper.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("nathelper", "natping_interval", 10)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("nathelper", "ping_nated_only", 1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("nathelper", "sipping_bflag", "SIP_PING_FLAG")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@192.168.85.252">sip:pinger@192.168.85.252</a>") #CUSTOMIZE ME<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("nathelper", "received_avp", "$avp(received_nh)")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "rtpproxy.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("rtpproxy", "rtpproxy_sock", "udp:localhost:7722") # CUSTOMIZE ME<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "proto_udp.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">#loadmodule "proto_tcp.so" <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "db_mysql.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "dialog.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("dialog", "db_mode", 1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("dialog", "db_url", "mysql://opensips:opensips@localhost/opensips")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">loadmodule "load_balancer.so"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("load_balancer", "db_url", "mysql://opensips:opensips@localhost/opensips")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("load_balancer", "probing_method", "OPTIONS")<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">modparam("load_balancer", "probing_interval", 10)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">####### Routing Logic ########<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># main request routing logic<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">route{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("starting route\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">force_rport();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (nat_uac_test("23")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("we have a NAT\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("REGISTER")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">fix_nated_register();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">setbflag(NAT);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">fix_nated_contact();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">setflag(NAT);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (!mf_process_maxfwd_header("10")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("483","Too Many Hops");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (has_totag()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># sequential request withing a dialog should<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># take the path determined by record-routing<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("has_totag\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (loose_route()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("loose_route\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("BYE")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># do accounting even if the transaction fails<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">do_accounting("log","failed");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} else if (is_method("INVITE")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># even if in most of the cases is useless, do RR for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># re-INVITEs alos, as some buggy clients do change route set<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># during the dialog.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">record_route();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (check_route_param("nat=yes")) <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">setflag(NAT);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># route it out to whatever destination was set by loose_route()<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># in $du (destination URI).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">route(relay);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if ( is_method("ACK") ) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if ( t_check_trans() ) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># non loose-route, but stateful ACK; must be an ACK after <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># a 487 or e.g. 404 from upstream server<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_relay();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># ACK without matching transaction -><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># ignore and discard<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("404","Not here");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># OPTIONS processing - don't forward<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("OPTIONS")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("200", "OK");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("OPTIONS received\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># CANCEL processing<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("CANCEL"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("CANCEL received\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (t_check_trans())<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_relay();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">t_check_trans();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">/* if ( !(is_method("REGISTER")  ) ) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("check_trans - to=$tu/from=$fu/request=$ru\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (from_uri==myself){<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># if caller is not local, then called number must be local<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (!uri==myself) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">send_reply("403","Relay forbidden");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}*/<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># preloaded route checking<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (loose_route()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("L_ERR",<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (!is_method("ACK"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("403","Preload Route denied");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># record routing<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (!is_method("REGISTER|MESSAGE"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">record_route();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># account only INVITEs<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("INVITE")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">do_accounting("log");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (!uri==myself) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">append_hf("P-hint: outbound\r\n"); <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">route(relay);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># requests for my domain<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("PUBLISH|SUBSCRIBE"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("503", "Service Unavailable");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("REGISTER"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">{<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if ( proto==TCP ||  0 ) setflag(TCP_PERSISTENT);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (isflagset(NAT)) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">setbflag(SIP_PING_FLAG);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (!save("location"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_reply_error();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if ($rU==NULL) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># request with no Username in RURI<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("484","Address Incomplete");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># do lookup with method filtering<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (!lookup("location","m")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_newtran();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_reply("404", "Not Found");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">} <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (isbflagset(NAT)) setflag(NAT);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># when routing via usrloc, log the missed calls also<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">do_accounting("log","missed");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">route(relay);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">route[relay] {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (isflagset(NAT)) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("adding rr_param\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">add_rr_param(";nat=yes");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"># for INVITEs enable some additional helper routes<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (is_method("INVITE")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("incoming INVITE\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (isflagset(NAT)) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("incoming INVITE with NAT\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">rtpproxy_offer("ro");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">t_on_branch("per_branch_ops");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_on_reply("handle_nat");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_on_failure("missed_call");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("calling lb_start_or_next\n");<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p></o:p></p>
<div>
<p class="MsoNormal">lb_start_or_next("1","pstn","r"); <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if ($retcode<0) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">             xlog("calling lb_start_or_next\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_send_reply("500","Internal Error");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">             exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("Selected destination is: $du\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># send it out<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (!t_relay()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("relay failed\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">sl_reply_error();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("reply\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_on_failure("missed_call");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_relay();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("exiting route-relay\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">branch_route[per_branch_ops] {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("new branch at $ru\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">onreply_route[handle_nat] {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("onreply_route-handle nat\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">if (nat_uac_test("1")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("nat test yes\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">fix_nated_contact();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if ( isflagset(NAT) ) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("nat flag set-doing rtpproxy answer\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">rtpproxy_answer("ro");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">failure_route[missed_call] {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("failure route - trying next destination\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">lb_disable_dst();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">if (lb_start_or_next("1","pstn","r")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_on_failure("missed_call");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_relay();<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">else {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">xlog("no destinations available\n");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_reply("503", "Service Unavailable");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># uncomment the following lines if you want to block client <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"># redirect based on 3xx replies.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">##if (t_check_status("3[0-9][0-9]")) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">##t_reply("404","Not found");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">##  exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">##}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>