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

SamyGo govoiper at gmail.com
Sun Jul 24 23:34:02 CEST 2016


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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20160724/e0d63858/attachment.html>


More information about the sr-users mailing list