[OpenSIPS-Users] basic load balancer setup

Joshua Nankin jnankin at gmail.com
Fri Mar 16 15:02:42 CET 2012


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>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>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>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> 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>  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 Developerhttp://www.opensips-solutions.com
>>
>>
>
>
> --
> Bogdan-Andrei Iancu
> OpenSIPS Founder and Developerhttp://www.opensips-solutions.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20120316/b0132638/attachment-0001.htm>


More information about the Users mailing list