[OpenSIPS-Users] basic load balancer setup

Bogdan-Andrei Iancu bogdan at opensips.org
Fri Mar 16 15:24:28 CET 2012


Joshua,

if you want use regex for src IP matching, better do:
     if ($si !~ "^10\..*"){}

And for printing, use the xlog function - it can print variables too.
     4. log("source_ip: $si\n");

Regards,
Bogdan

On 03/16/2012 04:02 PM, Joshua Nankin wrote:
> Sorry about that - I have a Gmail keyboard shortcut reflex :)
>
> So, I'd like to do a regex based check where the PBXes all have 
> addresses starting with 10.*.  I did the following:
>
>                 if (src_ip !~ "^10\..*"){
>                         if (!load_balance("1","fax","1")) {
>                                 sl_send_reply("503","Service 
> Unavailable");
>                                 exit;
>                         }
>                 }
>                 else {
>                           # this is an outgoing call, just let the 
> packets go through (somehow)
>                 }
>
> But it looks like my regex is not working and incoming calls get a 
> busy signal.  To make matters worse, I tried debugging with:
>
> 1. log(src_ip)
> 2. log("source ip: " + src_ip)
> 3. log($si)
> 4. log("source_ip: $si")
>
> None of those works (all produce config file syntax errors except for 
> 4 which just prints out the actual $si characters.  Why can't I do the 
> above?
>
> Finally, what do I need to do in the "else" block to let the outgoing 
> call packets go through?  I tried placing an outgoing call with out 
> the load_balancing block, but my packets were not relayed from 
> opensips to the carrier.
>
> Thanks,
> Josh
>
> On Thu, Mar 15, 2012 at 1:34 PM, Bogdan-Andrei Iancu 
> <bogdan at opensips.org <mailto:bogdan at opensips.org>> wrote:
>
>     Hi Joshua,
>
>     Please keep the list at CC - whatever we talk here, should also be
>     to the benefit of the entire opensips community ;)
>
>     So, to detect where the call comes from, you simply check the
>     source at IP level:
>         if (src_ip==11.22.33.44) {
>                # call from PBXes
>         } else {
>                # call from carriers
>         }
>
>     Regards,
>     Bogdan
>
>
>     On 03/15/2012 07:33 PM, Joshua Nankin wrote:
>>     Perfect!  Thanks Bogdan, you're the man!  I was having some
>>     trouble with record_route_preset because I was including the port
>>     in the IP string as well (I had seen others do this in alias, so
>>     I just copied that in the record_route_preset function and things
>>     still didn't work).
>>
>>     One more question: I'm trying to use the same opensips box as an
>>     outbound proxy.  Now, since I automatically load balance any
>>     INVITEs, when I place an outgoing call, the call is routed right
>>     back to one of my Asterisk machines.  How would I tell if the
>>     request is incoming (and then load balance it) or outgoing (and
>>     then relay the messages outside of the network).
>>
>>     I'm sure this involves creating another route, but I'm a complete
>>     n00b when it comes to opensips - I just started messing around
>>     with it this week.
>>
>>     Thanks again for your help!
>>
>>     On Thu, Mar 15, 2012 at 4:40 AM, Bogdan-Andrei Iancu
>>     <bogdan at opensips.org <mailto:bogdan at opensips.org>> wrote:
>>
>>         Hi Joshua,
>>
>>         Ok, I see - your opensips is actually in a private network.
>>         What you can do is to use instead of record_route() the
>>         record_route_preset("pub_IP") function (see
>>         http://www.opensips.org/html/docs/modules/1.7.x/rr.html#id250439)
>>         - this will make opensips to advertise in RR the public IP.
>>         Additionally set "alias = pub_IP" in your cfg (see
>>         http://www.opensips.org/Resources/DocsCoreFcn17#toc26), so
>>         that opensips will recognize its own pub IP in the Route hdr
>>         (in ACK)
>>
>>         Regards,
>>         Bogdan
>>
>>
>>         On 03/14/2012 10:54 PM, Joshua Nankin wrote:
>>>         Do I need to specify the public IPs of my asterisk boxes in
>>>         the load balancing table?
>>>
>>>         Here's is what my carrier told me:
>>>
>>>         After looking into this issue further, it appears you are
>>>         not including the Record-route header for your public IP
>>>         address. The reason the call is failing currently is because
>>>         you have listed your internal IP address for us to send the
>>>         call too, however since we do not have access to your
>>>         internal IP address, we are unable to send this to you. You
>>>         can see this in the 200 OK that you send to us, where you
>>>         start with your internal IP, and go straight to our IP.
>>>
>>>         You can find a packet captures for the call here:
>>>
>>>         Capture from OpenSIPS: xxxxxxxxxxxxxx
>>>         Capture from Asterisk: xxxxxxxxxxxxxx
>>>
>>>         Thanks,
>>>         Josh
>>>
>>>         On Wed, Mar 14, 2012 at 1:02 PM, Joshua Nankin
>>>         <jnankin at gmail.com <mailto:jnankin at gmail.com>> wrote:
>>>
>>>             Yeah, I'm seeing that now.  I just did a capture and
>>>             verified, the
>>>             200s are coming out of my Asterisk box, and OpenSIPS is
>>>             relaying them
>>>             properly.  I'm not getting the ACK back from my carrier.
>>>              I'm going to
>>>             check with them and send the capture files I just
>>>             generated - they use
>>>             IP whitelists, and this may just be a
>>>             authentication/security problem.
>>>
>>>             Thanks again!
>>>
>>>             -Josh
>>>
>>>             On Wed, Mar 14, 2012 at 12:59 PM, Bogdan-Andrei Iancu
>>>             <bogdan at opensips.org <mailto:bogdan at opensips.org>> wrote:
>>>             > Hi Joshua,
>>>             >
>>>             > It seams to be a lot of 200 OK retransmissions from
>>>             Asterisk because there
>>>             > is no ACK from the original caller side.
>>>             >
>>>             > Do you see the caller sending such ACK ? have you
>>>             tried to make a network
>>>             > capture ?
>>>             >
>>>             > Regards,
>>>             > Bogdan
>>>             >
>>>             >
>>>             >
>>>             > On 03/14/2012 06:27 PM, Joshua Nankin wrote:
>>>             >>
>>>             >> Hey Bogdan!
>>>             >>
>>>             >> So, it appears that the call gets to the LB and is
>>>             forwarded to
>>>             >> Asterisk.  Here's what happens in both the LB logs
>>>             and Asterisk:
>>>             >>
>>>             >> Asterisk - http://pastebin.com/
>>>             >> OpenSIPS - http://pastebin.com/
>>>             >>
>>>             >>
>>>             >> I have debug=6 on OpenSIPS, so there's quite a bit of
>>>             logging
>>>             >> happening for a pretty short call.  It seems that
>>>             there's a
>>>             >> retransmission problem here.  Also, I'm trying to
>>>             negotiate T.38, so
>>>             >> I'm not sure if that has something to do with this.
>>>             >>
>>>             >> Thanks,
>>>             >> Josh
>>>             >>
>>>             >> On Wed, Mar 14, 2012 at 7:25 AM, Bogdan-Andrei Iancu
>>>             >> <bogdan at opensips.org <mailto:bogdan at opensips.org>>
>>>              wrote:
>>>             >>>
>>>             >>> Hi Joshua,
>>>             >>>
>>>             >>> Have you checked (at network level) if the actual
>>>             call (the inbound one,
>>>             >>> from a client) gets to opensips LB ? and if so, if
>>>             the call gets
>>>             >>> forwarded
>>>             >>> to Asterisk ?
>>>             >>>
>>>             >>> Regards,
>>>             >>> Bogdan
>>>             >>>
>>>             >>>
>>>             >>> On 03/13/2012 10:00 PM, Joshua Nankin wrote:
>>>             >>>>
>>>             >>>> Hello,
>>>             >>>>
>>>             >>>> Trying to use OpenSIPS as both a load balancer for
>>>             incoming calls and
>>>             >>>> as an outbound proxy to my carrier.  I have been
>>>             unsuccessful to place
>>>             >>>> outgoing or incoming calls, and I think I just need
>>>             some help with the
>>>             >>>> configuration.  Just for testing, I have one
>>>             Asterisk box behind
>>>             >>>> OpenSIPS and the load balancer table on OpenSIPS
>>>             looks like this:
>>>             >>>>
>>>             >>>>
>>>             >>>>
>>>             >>>>
>>>             +----+----------+-------------------+-----------+------------+-------------+
>>>             >>>> | id | group_id | dst_uri           | resources |
>>>             probe_mode |
>>>             >>>> description
>>>             >>>> |
>>>             >>>>
>>>             >>>>
>>>             >>>>
>>>             +----+----------+-------------------+-----------+------------+-------------+
>>>             >>>> |  1 |        1 | sip:10.36.115.119 | fax=300   |  
>>>                    0 | tester
>>>             >>>>  |
>>>             >>>>
>>>             >>>>
>>>             >>>>
>>>             +----+----------+-------------------+-----------+------------+-------------+
>>>             >>>>
>>>             >>>>
>>>             >>>> The dst_ur is the internal IP of my asterisk box.
>>>              I'm using this for
>>>             >>>> fax, so I have set the resources field to 300
>>>             channels of "fax".   On
>>>             >>>> my asterisk box, I've added
>>>             "outboundproxy=23.21.170.154", as the 23.*
>>>             >>>> IP is the external IP of the opensips box.  Below
>>>             is my simple
>>>             >>>> opensips.cfg that I've adapted from the load
>>>             balancing tutorial.  Any
>>>             >>>> help would be much appreciated.  Additionally, for
>>>             debugging purposes,
>>>             >>>> I've opened all UDP and TCP ports.  Still not able
>>>             to connect.
>>>             >>>>
>>>             >>>>
>>>             >>>> debug=6
>>>             >>>> memlog=1
>>>             >>>>
>>>             >>>> fork=yes
>>>             >>>> children=2
>>>             >>>> log_stderror=yes
>>>             >>>> log_facility=LOG_LOCAL0
>>>             >>>>
>>>             >>>> disable_tcp=yes
>>>             >>>> disable_dns_blacklist = yes
>>>             >>>>
>>>             >>>> auto_aliases=no
>>>             >>>>
>>>             >>>> check_via=no
>>>             >>>> dns=off
>>>             >>>> rev_dns=off
>>>             >>>> port=5060
>>>             >>>>
>>>             >>>> mpath="/usr/lib/opensips/modules/"
>>>             >>>> loadmodule "maxfwd.so"
>>>             >>>> loadmodule "sl.so"
>>>             >>>> loadmodule "db_mysql.so"
>>>             >>>> loadmodule "tm.so"
>>>             >>>> loadmodule "uri.so"
>>>             >>>> loadmodule "rr.so"
>>>             >>>> loadmodule "dialog.so"
>>>             >>>> loadmodule "mi_fifo.so"
>>>             >>>> loadmodule "signaling.so"
>>>             >>>> loadmodule "textops.so"
>>>             >>>> loadmodule "load_balancer.so"
>>>             >>>>
>>>             >>>> modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
>>>             >>>> modparam("mi_fifo", "fifo_mode",0666)
>>>             >>>>
>>>             >>>> modparam("dialog", "db_mode", 1)
>>>             >>>> modparam("dialog", "db_url",
>>>             "mysql://root:opensips@localhost/opensips")
>>>             >>>>
>>>             >>>> modparam("rr","enable_double_rr",1)
>>>             >>>> modparam("rr","append_fromtag",1)
>>>             >>>>
>>>             >>>> modparam("load_balancer",
>>>             >>>> "db_url","mysql://root:opensips@localhost/opensips")
>>>             >>>>
>>>             >>>>
>>>             >>>> route{
>>>             >>>>        if (!mf_process_maxfwd_header("3")) {
>>>             >>>>                sl_send_reply("483","looping");
>>>             >>>>                exit;
>>>             >>>>        }
>>>             >>>>
>>>             >>>>
>>>             >>>>        if (!has_totag()) {
>>>             >>>>                 # initial request
>>>             >>>>                record_route();
>>>             >>>>        } else {
>>>             >>>>                # sequential request ->    obey
>>>             Route indication
>>>             >>>>                loose_route();
>>>             >>>>                 t_relay();
>>>             >>>>                 exit;
>>>             >>>>         }
>>>             >>>>
>>>             >>>>         # handle cancel and re-transmissions
>>>             >>>>        if ( is_method("CANCEL") ) {
>>>             >>>>                if ( t_check_trans() )
>>>             >>>>                        t_relay();
>>>             >>>>                exit;
>>>             >>>>        }
>>>             >>>>
>>>             >>>>
>>>             >>>>         # from now on we have only the initial requests
>>>             >>>>         if (!is_method("INVITE")) {
>>>             >>>>                 send_reply("405","Method Not Allowed");
>>>             >>>>                 exit;
>>>             >>>>         }
>>>             >>>>
>>>             >>>>         # detect resources and do balancing
>>>             >>>>        load_balance("1","fax");
>>>             >>>>
>>>             >>>>         # LB function returns negative if no
>>>             suitable destination (for
>>>             >>>> requested resources) is found,
>>>             >>>>         # or if all destinations are full
>>>             >>>>         if ($retcode<0) {
>>>             >>>>              sl_send_reply("500","Service full");
>>>             >>>>              exit;
>>>             >>>>         }
>>>             >>>>
>>>             >>>>        xlog("Selected destination is: $du\n");
>>>             >>>>
>>>             >>>>         # send it out
>>>             >>>>        if (!t_relay()) {
>>>             >>>>                sl_reply_error();
>>>             >>>>        }
>>>             >>>> }
>>>             >>>>
>>>
>>
>>         -- 
>>         Bogdan-Andrei Iancu
>>         OpenSIPS Founder and Developer
>>         http://www.opensips-solutions.com
>>
>>
>
>
>     -- 
>     Bogdan-Andrei Iancu
>     OpenSIPS Founder and Developer
>     http://www.opensips-solutions.com
>
>


-- 
Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
http://www.opensips-solutions.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20120316/65bb6348/attachment-0001.htm>


More information about the Users mailing list