[SR-Users] How to forward REGISTERs to Asterisk in kamailio with dispatcher module with several Asterisk PBXs?

SamyGo govoiper at gmail.com
Mon Jul 25 01:40:04 CEST 2016


I asked for "kamctl dispatcher dump". 'show' only prints the table.

On Jul 24, 2016 18:38, "Tickling Contest" <tickling.contest at gmail.com>
wrote:

> Thanks, Sammy. I fixed the error re: transport on Kamailio, but now
> nothing is sent as the dispatcher doesn't seem to work as expected by me.
> Here's the output you requested, any help is appreciated:
>
> root at kamailio:/etc/kamailio# kamctl dispatcher show
> dispatcher gateways
>
> +----+-------+--------------------------------------+-------+----------+------------+-------------+
> | id | setid | destination                          | flags | priority |
> attrs      | description |
>
> +----+-------+--------------------------------------+-------+----------+------------+-------------+
> |  1 |     1 | sip:192.168.1.102:5060;transport=tcp |     0 |        0 |
> weight=100 | Asterisk A  |
>
> +----+-------+--------------------------------------+-------+----------+------------+-------------+
>
> root at kamailio:/etc/kamailio# netstat -pln | grep kamailio
> tcp        0      0 0.0.0.0:5060            0.0.0.0:*
> LISTEN      4453/kamailio
> unix  2      [ ACC ]     STREAM     LISTENING     789407   4447/kamailio
>     /tmp/kamailio_ctl
> root at opensipsA:/etc/kamailio#
>
>
> And on the Asterisk server:
>
> root at asterisk:~# netstat -pln | grep asterisk
> tcp        0      0 0.0.0.0:5060            0.0.0.0:*
> LISTEN      2826/asterisk
> tcp        0      0 0.0.0.0:2000            0.0.0.0:*
> LISTEN      2826/asterisk
> udp        0      0 0.0.0.0:5000            0.0.0.0:*
>       2826/asterisk
> udp        0      0 0.0.0.0:4520            0.0.0.0:*
>       2826/asterisk
> udp        0      0 0.0.0.0:4569            0.0.0.0:*
>       2826/asterisk
> udp        0      0 0.0.0.0:49207           0.0.0.0:*
>       2826/asterisk
> udp        0      0 0.0.0.0:54857           0.0.0.0:*
>       2826/asterisk
> udp        0      0 0.0.0.0:2727            0.0.0.0:*
>       2826/asterisk
> unix  2      [ ACC ]     STREAM     LISTENING     31087    2826/asterisk
>     /var/run/asterisk/asterisk.ctl
>
>
> Now, the ds_select in the REGFWD does not seem to select anything (and so
> nothing is forwarded).
>
> My complete, current kamailio.cfg is here:
> https://gist.github.com/ticklingcontest/0b46e8e53bf50aa3875395c8fb86ff66
>
> BTW, I moved away from dispatcher.list file as I could not get it to work
> (the DB values always registered, but the list file didn't take).
>
> Any insight is appreciated.
>
> Thanks!
>
>
>
> On Sun, Jul 24, 2016 at 5:34 PM, SamyGo <govoiper at gmail.com> wrote:
>
>> Hey,
>> Can you show whats the output of the following commands on Kamailio
>> server:
>> "kamctl dispatcher dump"
>> "netstat -pln | grep kamailio"
>>
>> Send the output of the second command from asterisk server as well i.e
>> "netstat -pln | grep asterisk"
>>
>> Looking at the error it seems like you are trying to reach asterisk on a
>> protocol which kamailio is not listening on.
>>
>> Regards,
>> Sammy
>>
>> On Jul 24, 2016 14:38, "Tickling Contest" <tickling.contest at gmail.com>
>> wrote:
>>
>>> Hey guys,
>>>
>>> I dug a little deeper and I found these logs in /var/log/kamailio where
>>> 192.168.1.102 is my asterisk server:
>>>
>>> ul 24 14:25:32 kamailio /usr/sbin/kamailio[3726]: ERROR: tm [ut.h:343]:
>>> uri2dst2(): no corresponding socket for af 2
>>> Jul 24 14:25:32 kamailio /usr/sbin/kamailio[3726]: ERROR: tm
>>> [uac.c:266]: t_uac_prepare(): t_uac: no socket found
>>> Jul 24 14:25:32 kamailio /usr/sbin/kamailio[3726]: ERROR: dispatcher
>>> [dispatch.c:2436]: ds_check_timer(): unable to ping [sip:
>>> 192.168.1.102:5060]
>>>
>>> I can broadly tell that the message was not even sent, but the asterisk
>>> server VM is alive and well (and indeed on the same physical machine as
>>> kamailio VM).
>>>
>>> What am I missing? Why is this failing? I am running kamailio 4.0.4.
>>>
>>> On Sat, Jul 23, 2016 at 8:07 PM, Tickling Contest <
>>> tickling.contest at gmail.com> wrote:
>>>
>>>> I corrected an error with my dispatcher configuration and now, I do hit
>>>> the code where
>>>>
>>>> ds_select_dst ("1", "4")
>>>>
>>>> is no longer null.
>>>>
>>>> However, while the xlog I added says uac_req_send () is called, nothing
>>>> is sent. The xlog prints out the value of $uac_req(hdrs) as
>>>>
>>>>  Contact: <sip:101 at 192.168.1.101:5060>#015#012Expires: 600#015
>>>>
>>>> after which the uac_req_send () is called.
>>>>
>>>> I am not sure if this is the correct way? What am I missing?
>>>>
>>>> Oh, nothing shows up in the tcpdump trace (only the OPTIONS message for
>>>> the asterisk<->kamailio peering shows up).
>>>>
>>>> On Sat, Jul 23, 2016 at 3:48 PM, Tickling Contest <
>>>> tickling.contest at gmail.com> wrote:
>>>>
>>>>> Thanks, guys!
>>>>>
>>>>> Sammy, I tried your code in REGFWD, but unfortunately, it does not
>>>>> forward anything to Asterisk. I can confirm this because it keeps going
>>>>> into the else clause in the REGFWD (which I added to confirm). My current
>>>>> REGFWD looks like this:
>>>>>
>>>>> route[REGFWD] {
>>>>>         if(!is_method("REGISTER"))
>>>>>         {
>>>>>                 return;
>>>>>         }
>>>>>         xlog ("L_DEBUG", "MYDEBUG: In REGFWD");
>>>>>         if(!ds_select_dst("1", "4"))    {
>>>>>                $var(rip) = $(du{s.select,1,:});
>>>>>                $var(rport) = $(du{s.select,2,:});
>>>>>                $uac_req(method)="REGISTER";
>>>>>                $uac_req(ruri)="sip:" + $var(rip) + ":" + $var(rport) +
>>>>> ";transport=tcp";
>>>>>                $uac_req(furi)="sip:" + $au + "@" + $var(rip);
>>>>>                $uac_req(turi)="sip:" + $au + "@" + $var(rip);
>>>>>                $uac_req(hdrs)="Contact: <sip:" + $au + "@
>>>>> 192.168.1.101:5060" + ">\r\n";
>>>>>                 xlog ("L_DEBUG", "MYDEBUG: In REGFWD, sending
>>>>> registration info to Asterisk at $uac_req(ruri)");
>>>>>                if($sel(contact.expires) != $null)
>>>>>                             $uac_req(hdrs)= $uac_req(hdrs) + "Expires:
>>>>> " + $sel(contact.expires) + "\r\n";
>>>>>                 else
>>>>>                             $uac_req(hdrs)= $uac_req(hdrs) + "Expires:
>>>>> " + $hdr(Expires) + "\r\n";
>>>>>                 uac_req_send();
>>>>>         }
>>>>>         else
>>>>>         {
>>>>>                 xlog ("L_DEBUG", "In REGFWD, not forwarding!");
>>>>>         }
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>>
>>>>> My entire kamailio.cfg file is here:
>>>>> https://gist.github.com/ticklingcontest/f96aa4d08b08dc4643056d73da24f0a5
>>>>>
>>>>> Any insight is appreciated. Thanks again.
>>>>>
>>>>> My dispatcher at the moment has only one Asterisk server. My endpoint
>>>>> registers (auth with realtime DB in Mysql), but the registration
>>>>> information does not reach Asterisk.
>>>>>
>>>>> My kamailio box is peering with the asterisk box like so:
>>>>>
>>>>> root at asterisk:~# more /etc/asterisk/pjsip_wizard.conf
>>>>> [kamailio]
>>>>> type = wizard
>>>>> sends_auth = no
>>>>> sends_registrations = no
>>>>> remote_hosts = 192.168.1.101
>>>>> server_uri_pattern = sip:${REMOTE_HOST}\;transport=tcp
>>>>> client_uri_pattern = sip:${REMOTE_HOST}\;transport=tcp
>>>>> contact_pattern = sip:${REMOTE_HOST}\;transport=tcp
>>>>> outbound_auth/username = dispatcher
>>>>> aor/qualify_frequency = 0
>>>>> endpoint/context = from-external ;;; change later
>>>>> endpoint/disallow = all ;;; change later
>>>>> endpoint/allow = ulaw ;;; change later
>>>>> endpoint/dtmf_mode=rfc4733
>>>>> endpoint/media_address=192.168.1.101 ;;
>>>>> aor/qualify_frequency = 15
>>>>>
>>>>> BTW, my intention is to store the registrations on the Asterisk
>>>>> servers as well as my ARI code depends on it. As soon I get the single
>>>>> Asterisk situation working, I intend adding more servers to check the load
>>>>> balancing and REGISTER forwarding, and to Colin's point, the business of
>>>>> just using Kamailio as an outbound proxy.
>>>>>
>>>>> Again, any insight wrt why no REGISTERs are forwarding to Asterisk is
>>>>> appreciated. Why is ds_select_dst("1", "4") evaluating to false for me?
>>>>>
>>>>> My dispatcher info:
>>>>>
>>>>> root at kamailio:/etc/kamailio# kamctl dispatcher show
>>>>> dispatcher gateways
>>>>>
>>>>> +----+-------+-------------------+-------+----------+-------+-------------+
>>>>> | id | setid | destination       | flags | priority | attrs |
>>>>> description |
>>>>>
>>>>> +----+-------+-------------------+-------+----------+-------+-------------+
>>>>> |  1 |     1 | sip:192.168.1.102 |     1 |        0 |       |
>>>>> AsteriskA   |
>>>>> |  2 |     1 | sip:192.168.1.102 |     1 |        0 |       |
>>>>> AsteriskA   |
>>>>>
>>>>> +----+-------+-------------------+-------+----------+-------+-------------+
>>>>>
>>>>>
>>>>> Thanks!
>>>>>
>>>>> On Fri, Jul 22, 2016 at 11:01 AM, Colin Morelli <
>>>>> colin.morelli at gmail.com> wrote:
>>>>>
>>>>>> If you're using Kamailio as a registrar, then it would make the most
>>>>>> sense to also use it as your outbound proxy for Asterisk.
>>>>>>
>>>>>> This would mean whenever Asterisk needs to dial an extension, it
>>>>>> would instead make a SIP call to your Kamailio instance which would then
>>>>>> perform the lookup, forking, and forwarding.
>>>>>>
>>>>>> Is there a reason this wouldn't work in your infrastructure? If for
>>>>>> some reason it can't - though I can't imagine how - then I don't see the
>>>>>> purpose in using Kamailio as a registrar at all. You should just forward
>>>>>> everything to Asterisk since it needs to be there anyway.
>>>>>>
>>>>>> Best,
>>>>>> Colin
>>>>>>
>>>>>> On Fri, Jul 22, 2016 at 9:58 AM SamyGo <govoiper at gmail.com> wrote:
>>>>>>
>>>>>>> Hi Tickles,
>>>>>>>
>>>>>>> a) Have you tried doing this on Asterisk realtime ? for any regular
>>>>>>> direct registering extension w/o kamailio(even before kamailio) ? If an
>>>>>>> extension registers to one asterisk the rest of the boxes would know where
>>>>>>> to contact this extension via realtime-db ? I'd say give that a try and it
>>>>>>> may solve your problem, else using this REGFWD block you can parallel fork
>>>>>>> this register request to ALL of your boxes and everybox would think it is
>>>>>>> registered locally ! (not a recommended option I must say)
>>>>>>>
>>>>>>> b) If you ignore my previous comment of parallel forking registers,
>>>>>>> using this  REGFWD block you can use dispatcher module to replace the
>>>>>>> $var(rip) and $sel(cfg_get.asterisk.bindport) by changing your
>>>>>>> REGFWD block like this:
>>>>>>>
>>>>>>> route[REGFWD] {
>>>>>>>         if(!is_method("REGISTER"))
>>>>>>>         {
>>>>>>>                 return;
>>>>>>>         }
>>>>>>>         if(!ds_select_dst("1", "4"))    {
>>>>>>>                $var(rip) = $(du{s.select,1,:});
>>>>>>>                $var(rport) = $(du{s.select,2,:});
>>>>>>>                $uac_req(method)="REGISTER";
>>>>>>>                $uac_req(ruri)="sip:" + $var(rip) + ":" +
>>>>>>> $var(rport) + ";transport=tcp";
>>>>>>>                $uac_req(furi)="sip:" + $au + "@" + $var(rip);
>>>>>>>                $uac_req(turi)="sip:" + $au + "@" + $var(rip);
>>>>>>>                $uac_req(hdrs)="Contact: <sip:" + $au + "@"
>>>>>>>                                 + $sel(cfg_get.kamailio.bindip)
>>>>>>>                                 + ":" +
>>>>>>> $sel(cfg_get.kamailio.bindport) + ">\r\n";
>>>>>>>                if($sel(contact.expires) != $null)
>>>>>>>                             $uac_req(hdrs)= $uac_req(hdrs) +
>>>>>>> "Expires: " + $sel(contact.expires) + "\r\n";
>>>>>>>                 else
>>>>>>>                             $uac_req(hdrs)= $uac_req(hdrs) +
>>>>>>> "Expires: " + $hdr(Expires) + "\r\n";
>>>>>>>                 uac_req_send();
>>>>>>>         }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> In summary, depending upon your business logic/use case there could
>>>>>>> be other ways to make this work as well.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Sammy
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Jul 22, 2016 at 8:53 AM, Tickling Contest <
>>>>>>> tickling.contest at gmail.com> wrote:
>>>>>>>
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> When using Kamailio with the dispatcher module for Asterisk load
>>>>>>>> balancing, I am offloading REGISTERs to Kamailio (works fine), but would
>>>>>>>> like to forward the REGISTERs to Asterisk so that outgoing calls from
>>>>>>>> Asterisk will be possible. I know this is not strictly necessary (e.g.,
>>>>>>>> just use Kamailio to forward everything), but I have a lot of application
>>>>>>>> logic behind my Asterisk boxes (using ARI) and so I don't want that to
>>>>>>>> break. Thereby, I do need this information in Asterisk as soon as possible
>>>>>>>> from Kamailio.
>>>>>>>>
>>>>>>>> Let's say I have three boxes Asterisk_1, Asterisk_2 and Asterisk_3
>>>>>>>> in the dispatcher module like so:
>>>>>>>>
>>>>>>>> 1 sip:192.168.1.201:5060;transport=tcp
>>>>>>>> 1 sip:192.168.1.202:5060;transport=tcp
>>>>>>>> 1 sip:192.168.1.203:5060;transport=tcp
>>>>>>>>
>>>>>>>> My system has endpoints as numerical extensions, from 101 to 110.
>>>>>>>> When a new endpoint registers with kamailio (and authenticates), I would
>>>>>>>> like to send the REGISTER to Asterisk. But I have the following questions:
>>>>>>>>
>>>>>>>> (a) Which Asterisk? I could send it to a round-robinned Asterisk
>>>>>>>> (say, Asterisk_2), but that Asterisk may not be the one responsible for
>>>>>>>> handling calls outbound for the endpoint that just registered. Even if I
>>>>>>>> use "hash over auth username" instead of round-robin (In
>>>>>>>> http://www.kamailio.org/docs/modules/4.0.x/modules/dispatcher.html#idp16940048,
>>>>>>>> choose 5 for "alg", for example) that wont solve this problem as an
>>>>>>>> outbound request may come from another Asterisk box which won't have the
>>>>>>>> requisite registration information. Should I forward REGISTERs to all
>>>>>>>> Asterisk boxes? Maybe I won't have to deal with this issue as I use
>>>>>>>> realtime and so the REGISTER information, sent to one Asterisk box, is
>>>>>>>> available to all Asterisk boxes after the write to the realtime DB. Is my
>>>>>>>> understanding correct?
>>>>>>>>
>>>>>>>> (b) How do I do this in kamailio.cfg? With some examples on the
>>>>>>>> Internet for WITH_ASTERISK directive, I see that you do
>>>>>>>>
>>>>>>>> route[REGFWD] {
>>>>>>>>         if(!is_method("REGISTER"))
>>>>>>>>         {
>>>>>>>>                 return;
>>>>>>>>         }
>>>>>>>>         $var(rip) = $sel(cfg_get.asterisk.bindip);
>>>>>>>>         $uac_req(method)="REGISTER";
>>>>>>>>         $uac_req(ruri)="sip:" + $var(rip) + ":" +
>>>>>>>> $sel(cfg_get.asterisk.bindport) + ";transport=tcp";
>>>>>>>>         $uac_req(furi)="sip:" + $au + "@" + $var(rip);
>>>>>>>>         $uac_req(turi)="sip:" + $au + "@" + $var(rip);
>>>>>>>>         $uac_req(hdrs)="Contact: <sip:" + $au + "@"
>>>>>>>>                                 + $sel(cfg_get.kamailio.bindip)
>>>>>>>>                                 + ":" +
>>>>>>>> $sel(cfg_get.kamailio.bindport) + ">\r\n";
>>>>>>>>         if($sel(contact.expires) != $null)
>>>>>>>>                 $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " +
>>>>>>>> $sel(contact.expires) + "\r\n";
>>>>>>>>         else
>>>>>>>>                 $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " +
>>>>>>>> $hdr(Expires) + "\r\n";
>>>>>>>>         uac_req_send();
>>>>>>>> }
>>>>>>>>
>>>>>>>> What is the equivalent for when you are using the dispatcher module
>>>>>>>> and the kamailio.bindip and asterisk.bindip etc. are not set in the
>>>>>>>> configuration, but instead should be procured from elsewhere?
>>>>>>>>
>>>>>>>> Any help is appreciated.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
>>>>>>>> list
>>>>>>>> sr-users at lists.sip-router.org
>>>>>>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
>>>>>>> list
>>>>>>> sr-users at lists.sip-router.org
>>>>>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
>>>>>> list
>>>>>> sr-users at lists.sip-router.org
>>>>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>> _______________________________________________
>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>> sr-users at lists.sip-router.org
>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>
>>
>
> _______________________________________________
> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
> sr-users at lists.sip-router.org
> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20160724/eaf71c05/attachment.html>


More information about the sr-users mailing list