Discussion:
[SR-Users] Kamailio as Websocket bridge to Asterisk, and Asterisk-sent OPTIONS
Alex Villací­s Lasso
2014-08-28 23:18:48 UTC
Permalink
As a continuation of my project, I am trying to set up Kamailio as a Websocket bridge to Asterisk. The asterisk instance is running as localhost, with its own websocket support disabled, but otherwise has accounts with all of the avfp and dtls settings for
websockets. Additionally, I have removed the bindaddr=127.0.0.1 from sip.conf and instead put a deny=0.0.0.0/0.0.0.0 and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to localhost. This allows asterisk to bypass rtpproxy when signaling
through a websocket. I have already established calls originating from the browser. However, I have an issue with the registration.

In my setup, Kamailio receives the REGISTER from whatever source, and forwards this through UDP to Asterisk, after the multiple-domain transformation. Therefore, Asterisk sees the following in its SIP port (all traffic through localhost):

REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
To: <sip:avillacisIM_pbx.villacis.com-savSHZN5Fh8qMp+***@public.gmane.org:5080>
From: "Alex Villac..s" <sip:avillacisIM_pbx.villacis.com-savSHZN5Fh8qMp+***@public.gmane.org:5080>;tag=b5c0lq4kac
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Contact: <sip:fnuql6ft-***@public.gmane.org:47307;transport=ws>;reg-id=1;+sip.instance="<urn:uuid:6b0c58ee-bdc5-47c0-aff0-963132dc0cad>";expires=600
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0

Asterisk answers this through UDP, and Kamailio forwards it through the websocket:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s" <sip:avillacisIM_pbx.villacis.com-savSHZN5Fh8qMp+***@public.gmane.org:5080>;tag=b5c0lq4kac
To: <sip:avillacisIM_pbx.villacis.com-savSHZN5Fh8qMp+***@public.gmane.org:5080>;tag=as5ae2df76
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Contact: <sip:fnuql6ft-***@public.gmane.org:47307;transport=ws>;expires=600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0

Then Asterisk sends this through UDP, and Kamailio again forwards it through the websocket:

NOTIFY sip:fnuql6ft-***@public.gmane.org:47307;transport=ws SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
From: "asterisk" <sip:asterisk-savSHZN5Fh8qMp+***@public.gmane.org:5080>;tag=as43c12840
To: <sip:fnuql6ft-***@public.gmane.org:47307;transport=ws>
Contact: <sip:asterisk-savSHZN5Fh8qMp+***@public.gmane.org:5080>
Call-ID: 04deeb0068a847fa514d748c7d9993c5-savSHZN5Fh8qMp+***@public.gmane.org:5080
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89

Messages-Waiting: no
Message-Account: sip:*97-savSHZN5Fh8qMp+***@public.gmane.org:5080
Voice-Message: 0/0 (0/0)

Since I have not implemented handling of voicemail indications, the browser answers this:

SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
To: <sip:fnuql6ft-***@public.gmane.org:47307;transport=ws>;tag=ggu5etber9
From: "asterisk" <sip:asterisk-savSHZN5Fh8qMp+***@public.gmane.org:5080>;tag=as43c12840
Call-ID: 04deeb0068a847fa514d748c7d9993c5-savSHZN5Fh8qMp+***@public.gmane.org:5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0


After that, Asterisk wants to send an OPTIONS packet. From the point of view of Asterisk (sip set debug on), it is already sent, but never gets a response. However, tcpdump shows that the packet is never sent through the localhost interface in the first
place. It is also not sent through any other interface. My guess is that since the REGISTER has a contact with transport=ws , Asterisk wants to send this through a websocket (which is disabled). So I could have to generate a contact without transport=ws .

I have worked around this by setting qualify=no in the account for the websocket, but I would like a better solution, one that allows the OPTIONS packet to reach the browser, and to get the response. What is the proper way to deal with this?
Paul Belanger
2014-08-29 00:09:04 UTC
Permalink
On Thu, Aug 28, 2014 at 7:18 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
As a continuation of my project, I am trying to set up Kamailio as a
Websocket bridge to Asterisk. The asterisk instance is running as localhost,
with its own websocket support disabled, but otherwise has accounts with all
of the avfp and dtls settings for websockets. Additionally, I have removed
the bindaddr=127.0.0.1 from sip.conf and instead put a deny=0.0.0.0/0.0.0.0
and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to
localhost. This allows asterisk to bypass rtpproxy when signaling through a
websocket. I have already established calls originating from the browser.
However, I have an issue with the registration.
Just in passing, why did you remove bindaddr=127.0.0.1?
Post by Alex Villací­s Lasso
In my setup, Kamailio receives the REGISTER from whatever source, and
forwards this through UDP to Asterisk, after the multiple-domain
transformation. Therefore, Asterisk sees the following in its SIP port (all
REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89
Messages-Waiting: no
Voice-Message: 0/0 (0/0)
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0
After that, Asterisk wants to send an OPTIONS packet. From the point of view
of Asterisk (sip set debug on), it is already sent, but never gets a
response. However, tcpdump shows that the packet is never sent through the
localhost interface in the first place. It is also not sent through any
other interface. My guess is that since the REGISTER has a contact with
transport=ws , Asterisk wants to send this through a websocket (which is
disabled). So I could have to generate a contact without transport=ws .
I have worked around this by setting qualify=no in the account for the
websocket, but I would like a better solution, one that allows the OPTIONS
packet to reach the browser, and to get the response. What is the proper way
to deal with this?
What does the OPTIONS message in asterisk look like?
--
Paul Belanger | PolyBeacon, Inc.
Jabber: ***@polybeacon.com | IRC: pabelanger (Freenode)
Github: https://github.com/pabelanger | Twitter: https://twitter.com/pabelanger
Alex Villací­s Lasso
2014-08-29 15:55:42 UTC
Permalink
Post by Paul Belanger
On Thu, Aug 28, 2014 at 7:18 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
As a continuation of my project, I am trying to set up Kamailio as a
Websocket bridge to Asterisk. The asterisk instance is running as localhost,
with its own websocket support disabled, but otherwise has accounts with all
of the avfp and dtls settings for websockets. Additionally, I have removed
the bindaddr=127.0.0.1 from sip.conf and instead put a deny=0.0.0.0/0.0.0.0
and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to
localhost. This allows asterisk to bypass rtpproxy when signaling through a
websocket. I have already established calls originating from the browser.
However, I have an issue with the registration.
Just in passing, why did you remove bindaddr=127.0.0.1?
If I keep the bindaddr, then asterisk fails to send the DTLS-SRTP handshake packets, resulting in no audio. Apparently rtpproxy does not route this.
Post by Paul Belanger
Post by Alex Villací­s Lasso
In my setup, Kamailio receives the REGISTER from whatever source, and
forwards this through UDP to Asterisk, after the multiple-domain
transformation. Therefore, Asterisk sees the following in its SIP port (all
REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0
Then Asterisk sends this through UDP, and Kamailio again forwards it through
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89
Messages-Waiting: no
Voice-Message: 0/0 (0/0)
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0
After that, Asterisk wants to send an OPTIONS packet. From the point of view
of Asterisk (sip set debug on), it is already sent, but never gets a
response. However, tcpdump shows that the packet is never sent through the
localhost interface in the first place. It is also not sent through any
other interface. My guess is that since the REGISTER has a contact with
transport=ws , Asterisk wants to send this through a websocket (which is
disabled). So I could have to generate a contact without transport=ws .
I have worked around this by setting qualify=no in the account for the
websocket, but I would like a better solution, one that allows the OPTIONS
packet to reach the browser, and to get the response. What is the proper way
to deal with this?
What does the OPTIONS message in asterisk look like?
elx3*CLI> sip qualify peer avillacisIM_pbx.villacis.com
Reliably Transmitting (NAT) to 127.0.0.1:5060:
OPTIONS sip:***@192.168.3.2:58927;transport=ws SIP/2.0
Via: SIP/2.0/WS 127.0.0.1:5080;branch=z9hG4bK2b267794;rport
Max-Forwards: 70
From: "asterisk" <sip:***@127.0.0.1:5080>;tag=as1a2c3be2
To: <sip:***@192.168.3.2:58927;transport=ws>
Contact: <sip:***@127.0.0.1:5080;transport=WS>
Call-ID: ***@127.0.0.1:5080
CSeq: 102 OPTIONS
User-Agent: Asterisk PBX 11.12.0
Date: Fri, 29 Aug 2014 15:54:10 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Length: 0


---
Paul Belanger
2014-08-29 19:44:15 UTC
Permalink
On Fri, Aug 29, 2014 at 11:55 AM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
Post by Paul Belanger
On Thu, Aug 28, 2014 at 7:18 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
As a continuation of my project, I am trying to set up Kamailio as a
Websocket bridge to Asterisk. The asterisk instance is running as localhost,
with its own websocket support disabled, but otherwise has accounts with all
of the avfp and dtls settings for websockets. Additionally, I have removed
the bindaddr=127.0.0.1 from sip.conf and instead put a
deny=0.0.0.0/0.0.0.0
and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to
localhost. This allows asterisk to bypass rtpproxy when signaling through a
websocket. I have already established calls originating from the browser.
However, I have an issue with the registration.
Just in passing, why did you remove bindaddr=127.0.0.1?
If I keep the bindaddr, then asterisk fails to send the DTLS-SRTP handshake
packets, resulting in no audio. Apparently rtpproxy does not route this.
FWIW: I added a new setting into chan_sip, rptbindaddr[1], which
allows you to no control the interface RTP binds too. Not sure if
that helps in your setup or not.
Post by Alex Villací­s Lasso
Post by Paul Belanger
Post by Alex Villací­s Lasso
In my setup, Kamailio receives the REGISTER from whatever source, and
forwards this through UDP to Asterisk, after the multiple-domain
transformation. Therefore, Asterisk sees the following in its SIP port (all
REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0
Then Asterisk sends this through UDP, and Kamailio again forwards it through
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89
Messages-Waiting: no
Voice-Message: 0/0 (0/0)
Since I have not implemented handling of voicemail indications, the
browser
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0
After that, Asterisk wants to send an OPTIONS packet. From the point of view
of Asterisk (sip set debug on), it is already sent, but never gets a
response. However, tcpdump shows that the packet is never sent through the
localhost interface in the first place. It is also not sent through any
other interface. My guess is that since the REGISTER has a contact with
transport=ws , Asterisk wants to send this through a websocket (which is
disabled). So I could have to generate a contact without transport=ws .
I have worked around this by setting qualify=no in the account for the
websocket, but I would like a better solution, one that allows the OPTIONS
packet to reach the browser, and to get the response. What is the proper way
to deal with this?
What does the OPTIONS message in asterisk look like?
elx3*CLI> sip qualify peer avillacisIM_pbx.villacis.com
Via: SIP/2.0/WS 127.0.0.1:5080;branch=z9hG4bK2b267794;rport
Max-Forwards: 70
CSeq: 102 OPTIONS
User-Agent: Asterisk PBX 11.12.0
Date: Fri, 29 Aug 2014 15:54:10 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Length: 0
Ya, your via address is over the WS. What does your peer settings look
like for avillacisIM_pbx.villacis.com ?

[1] http://svnview.digium.com/svn/asterisk?view=revision&revision=422241
--
Paul Belanger | PolyBeacon, Inc.
Jabber: ***@polybeacon.com | IRC: pabelanger (Freenode)
Github: https://github.com/pabelanger | Twitter: https://twitter.com/pabelanger
Alex Villací­s Lasso
2014-08-29 21:08:50 UTC
Permalink
Post by Paul Belanger
On Fri, Aug 29, 2014 at 11:55 AM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
Post by Paul Belanger
On Thu, Aug 28, 2014 at 7:18 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
As a continuation of my project, I am trying to set up Kamailio as a
Websocket bridge to Asterisk. The asterisk instance is running as localhost,
with its own websocket support disabled, but otherwise has accounts with all
of the avfp and dtls settings for websockets. Additionally, I have removed
the bindaddr=127.0.0.1 from sip.conf and instead put a
deny=0.0.0.0/0.0.0.0
and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to
localhost. This allows asterisk to bypass rtpproxy when signaling through a
websocket. I have already established calls originating from the browser.
However, I have an issue with the registration.
Just in passing, why did you remove bindaddr=127.0.0.1?
If I keep the bindaddr, then asterisk fails to send the DTLS-SRTP handshake
packets, resulting in no audio. Apparently rtpproxy does not route this.
FWIW: I added a new setting into chan_sip, rptbindaddr[1], which
allows you to no control the interface RTP binds too. Not sure if
that helps in your setup or not.
Post by Alex Villací­s Lasso
Post by Paul Belanger
Post by Alex Villací­s Lasso
In my setup, Kamailio receives the REGISTER from whatever source, and
forwards this through UDP to Asterisk, after the multiple-domain
transformation. Therefore, Asterisk sees the following in its SIP port (all
REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0
Then Asterisk sends this through UDP, and Kamailio again forwards it through
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89
Messages-Waiting: no
Voice-Message: 0/0 (0/0)
Since I have not implemented handling of voicemail indications, the
browser
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0
After that, Asterisk wants to send an OPTIONS packet. From the point of view
of Asterisk (sip set debug on), it is already sent, but never gets a
response. However, tcpdump shows that the packet is never sent through the
localhost interface in the first place. It is also not sent through any
other interface. My guess is that since the REGISTER has a contact with
transport=ws , Asterisk wants to send this through a websocket (which is
disabled). So I could have to generate a contact without transport=ws .
I have worked around this by setting qualify=no in the account for the
websocket, but I would like a better solution, one that allows the OPTIONS
packet to reach the browser, and to get the response. What is the proper way
to deal with this?
What does the OPTIONS message in asterisk look like?
elx3*CLI> sip qualify peer avillacisIM_pbx.villacis.com
Via: SIP/2.0/WS 127.0.0.1:5080;branch=z9hG4bK2b267794;rport
Max-Forwards: 70
CSeq: 102 OPTIONS
User-Agent: Asterisk PBX 11.12.0
Date: Fri, 29 Aug 2014 15:54:10 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Content-Length: 0
Ya, your via address is over the WS. What does your peer settings look
like for avillacisIM_pbx.villacis.com ?
[1] http://svnview.digium.com/svn/asterisk?view=revision&revision=422241
mysql> select * from sip where name = 'avillacisIM_pbx.villacis.com';
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
| id | name | context | callingpres | deny | permit | acl | secret | md5secret | remotesecret | transport | host | nat | type | accountcode | amaflags | callgroup | pickupgroup |
namedcallgroup | namedpickupgroup | callerid | directmedia | directmediapermit | directmediaacl | description | defaultip | dtmfmode | fromuser | fromdomain | insecure | language | tonezone | mailbox | qualify | regexten |
rtptimeout | rtpholdtimeout | setvar | disallow | allow | fullcontact | ipaddr | port | username | defaultuser | dial | trustrpid | sendrpid | progressinband | promiscredir |
useclientcode | callcounter | busylevel | allowoverlap | allowsubscribe | allowtransfer | lastms | useragent | regseconds | regserver | videosupport | maxcallbitrate | rfc2833compensate | session-timers | session-expires | session-minse |
session-refresher | outboundproxy | callbackextension | timert1 | timerb | qualifyfreq | constantssrc | contactpermit | contactdeny | contactacl | usereqphone | textsupport | faxdetect | buggymwi | auth | fullname | trunkname | cid_number | mohinterpret |
mohsuggest | parkinglot | hasvoicemail | subscribemwi | vmexten | rtpkeepalive | g726nonstandard | ignoresdpversion | subscribecontext | template | keepalive | t38pt_usertpsource | organization_domain | outofcall_message_context | sippasswd |
kamailioname | mwi_from | avpf | dtlsenable | dtlsverify | dtlscertfile | dtlsprivatekey | dtlssetup | force_avp | icesupport | encryption |
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
| 12 | avillacisIM_pbx.villacis.com | pbx.villacis.com-from-internal | NULL | 0.0.0.0/0.0.0.0 | 0.0.0.0/0.0.0.0 | NULL | NULL | NULL | NULL | ws,wss,udp | dynamic | force_rport,comedia | friend | NULL | NULL | NULL |
NULL | NULL | NULL | device <avillacisIM> | no | NULL | NULL | NULL | NULL | auto | NULL | NULL | NULL | es | NULL | ***@pbx.villacis.com-default | no
| NULL | 60 | 300 | NULL | all | ulaw,alaw,gsm | sip:***@192.168.3.2:59675^3Btransport=ws | 127.0.0.1 | 5060 | | avillacisIM | SIP/avillacisIM_pbx.villacis.com | yes | no | NULL |
NULL | NULL | yes | NULL | no | NULL | yes | 0 | SIP.js/0.6.2 | 1409346610 | | yes | 384 | NULL | NULL | NULL | NULL | NULL
| NULL | NULL | NULL | NULL | 60 | NULL | NULL | NULL | NULL | NULL | NULL | yes | NULL | NULL | 101 | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | *97 | NULL | NULL | NULL | pbx.villacis.com-im-sip | NULL | NULL | NULL | pbx.villacis.com | pbx.villacis.com-im-sip | Avillacis12345 | avillacisIM |
NULL | yes | yes | no | /etc/pki/tls/certs/localhost_asterisk.crt | /etc/pki/tls/private/localhost_asterisk.key | actpass | yes | yes | yes |
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
1 row in set (0.00 sec)


[***@elx3 kamailio]# asterisk -rnx 'sip show peer avillacisIM_pbx.villacis.com'


* Name : avillacisIM_pbx.villacis.com
Description :
Realtime peer: Yes, cached
Secret : <Not set>
MD5Secret : <Not set>
Remote Secret: <Not set>
Context : pbx.villacis.com-from-internal
Record On feature : automon
Record Off feature : automon
Subscr.Cont. : pbx.villacis.com-im-sip
Language : es
Tonezone : <Not set>
AMA flags : Unknown
Transfer mode: open
CallingPres : Presentation Allowed, Not Screened
Callgroup :
Pickupgroup :
Named Callgr :
Nam. Pickupgr:
MOH Suggest :
Mailbox : ***@pbx.villacis.com-default
VM Extension : *97
LastMsgsSent : 0/0
Call limit : 2147483647
Max forwards : 0
Dynamic : Yes
Callerid : "101" <avillacisIM>
MaxCallBR : 384 kbps
Expire : 153
Insecure : no
Force rport : Yes
Symmetric RTP: Yes
ACL : Yes
DirectMedACL : No
T.38 support : Yes
T.38 EC mode : FEC
T.38 MaxDtgrm: 4294967295
DirectMedia : No
PromiscRedir : No
User=Phone : No
Video Support: Yes
Text Support : No
Ign SDP ver : No
Trust RPID : Yes
Send RPID : No
TrustIDOutbnd: Legacy
Subscriptions: Yes
Overlap dial : No
DTMFmode : auto
Timer T1 : 500
Timer B : 32000
ToHost :
Addr->IP : 127.0.0.1:5060
Defaddr->IP : (null)
Prim.Transp. : WS
Allowed.Trsp : UDP,WS,WSS
Def. Username: avillacisIM
SIP Options : (none)
Codecs : (gsm|ulaw|alaw)
Codec Order : (ulaw:20,alaw:20,gsm:20)
Auto-Framing : No
Status : Unmonitored
Useragent : SIP.js/0.6.2
Reg. Contact : sip:***@192.168.3.2:59675;transport=ws
Qualify Freq : 60000 ms
Keepalive : 0 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot :
Use Reason : No
Encryption : Yes
Ign.Lifetime : No

I think the situation is because of the change of transport. How should this be handled so that Asterisk stops trying to use websocket transport for the signaling that came from the UDP port?
Paul Belanger
2014-08-29 22:29:38 UTC
Permalink
On Fri, Aug 29, 2014 at 5:08 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
Post by Paul Belanger
On Fri, Aug 29, 2014 at 11:55 AM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
Post by Paul Belanger
On Thu, Aug 28, 2014 at 7:18 PM, Alex Villací­s Lasso
Post by Alex Villací­s Lasso
As a continuation of my project, I am trying to set up Kamailio as a
Websocket bridge to Asterisk. The asterisk instance is running as localhost,
with its own websocket support disabled, but otherwise has accounts
with
all
of the avfp and dtls settings for websockets. Additionally, I have removed
the bindaddr=127.0.0.1 from sip.conf and instead put a
deny=0.0.0.0/0.0.0.0
and permit=127.0.0.1/255.255.255.0 in order to restrict SIP signaling to
localhost. This allows asterisk to bypass rtpproxy when signaling
through
a
websocket. I have already established calls originating from the browser.
However, I have an issue with the registration.
Just in passing, why did you remove bindaddr=127.0.0.1?
If I keep the bindaddr, then asterisk fails to send the DTLS-SRTP handshake
packets, resulting in no audio. Apparently rtpproxy does not route this.
FWIW: I added a new setting into chan_sip, rptbindaddr[1], which
allows you to no control the interface RTP binds too. Not sure if
that helps in your setup or not.
Post by Alex Villací­s Lasso
Post by Paul Belanger
Post by Alex Villací­s Lasso
In my setup, Kamailio receives the REGISTER from whatever source, and
forwards this through UDP to Asterisk, after the multiple-domain
transformation. Therefore, Asterisk sees the following in its SIP port (all
REGISTER sip:pbx.villacis.com SIP/2.0
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
Max-Forwards: 69
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Allow: ACK,CANCEL,BYE,OPTIONS,INFO,NOTIFY,INVITE,MESSAGE
Supported: path,gruu,outbound
User-Agent: SIP.js/0.6.2
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP
127.0.0.1;branch=z9hG4bKc1c5.cb49f656197d0ba16f2a1661dd6a44cc.0;received=127.0.0.1;rport=5060
Via: SIP/2.0/WSS
r01r0mla9hdp.invalid;rport=47307;received=192.168.3.2;branch=z9hG4bK9309681
From: "Alex Villac..s"
Call-ID: vp2akar0aqfmgfa6m1taau
CSeq: 82 REGISTER
Server: Asterisk PBX 11.12.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 600
Date: Thu, 28 Aug 2014 22:21:15 GMT
Content-Length: 0
Then Asterisk sends this through UDP, and Kamailio again forwards it through
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport
Max-Forwards: 70
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX 11.12.0
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 89
Messages-Waiting: no
Voice-Message: 0/0 (0/0)
Since I have not implemented handling of voicemail indications, the
browser
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK4d60f167;rport=5080
CSeq: 102 NOTIFY
Supported: outbound
Content-Length: 0
After that, Asterisk wants to send an OPTIONS packet. From the point of view
of Asterisk (sip set debug on), it is already sent, but never gets a
response. However, tcpdump shows that the packet is never sent through the
localhost interface in the first place. It is also not sent through any
other interface. My guess is that since the REGISTER has a contact with
transport=ws , Asterisk wants to send this through a websocket (which is
disabled). So I could have to generate a contact without transport=ws .
I have worked around this by setting qualify=no in the account for the
websocket, but I would like a better solution, one that allows the OPTIONS
packet to reach the browser, and to get the response. What is the
proper
way
to deal with this?
What does the OPTIONS message in asterisk look like?
elx3*CLI> sip qualify peer avillacisIM_pbx.villacis.com
Via: SIP/2.0/WS 127.0.0.1:5080;branch=z9hG4bK2b267794;rport
Max-Forwards: 70
CSeq: 102 OPTIONS
User-Agent: Asterisk PBX 11.12.0
Date: Fri, 29 Aug 2014 15:54:10 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO,
PUBLISH, MESSAGE
Supported: replaces, timer
Content-Length: 0
Ya, your via address is over the WS. What does your peer settings look
like for avillacisIM_pbx.villacis.com ?
[1] http://svnview.digium.com/svn/asterisk?view=revision&revision=422241
mysql> select * from sip where name = 'avillacisIM_pbx.villacis.com';
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
| id | name | context | callingpres | deny
| permit | acl | secret | md5secret | remotesecret | transport |
host | nat | type | accountcode | amaflags | callgroup
| pickupgroup | namedcallgroup | namedpickupgroup | callerid |
directmedia | directmediapermit | directmediaacl | description | defaultip |
dtmfmode | fromuser | fromdomain | insecure | language | tonezone | mailbox
| qualify | regexten | rtptimeout | rtpholdtimeout | setvar | disallow |
allow | fullcontact | ipaddr |
port | username | defaultuser | dial | trustrpid
| sendrpid | progressinband | promiscredir | useclientcode | callcounter |
busylevel | allowoverlap | allowsubscribe | allowtransfer | lastms |
useragent | regseconds | regserver | videosupport | maxcallbitrate |
rfc2833compensate | session-timers | session-expires | session-minse |
session-refresher | outboundproxy | callbackextension | timert1 | timerb |
qualifyfreq | constantssrc | contactpermit | contactdeny | contactacl |
usereqphone | textsupport | faxdetect | buggymwi | auth | fullname |
trunkname | cid_number | mohinterpret | mohsuggest | parkinglot |
hasvoicemail | subscribemwi | vmexten | rtpkeepalive | g726nonstandard |
ignoresdpversion | subscribecontext | template | keepalive |
t38pt_usertpsource | organization_domain | outofcall_message_context |
sippasswd | kamailioname | mwi_from | avpf | dtlsenable | dtlsverify |
dtlscertfile | dtlsprivatekey
| dtlssetup | force_avp | icesupport | encryption |
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
| 12 | avillacisIM_pbx.villacis.com | pbx.villacis.com-from-internal | NULL
| 0.0.0.0/0.0.0.0 | 0.0.0.0/0.0.0.0 | NULL | NULL | NULL | NULL
| ws,wss,udp | dynamic | force_rport,comedia | friend | NULL | NULL
This is your issue, you are allowing ws and wss as the transport.
Because you are forwarding calls over UDP, that is the only protocol
you should be allowing.
Post by Alex Villací­s Lasso
| NULL | NULL | NULL | NULL | device
<avillacisIM> | no | NULL | NULL | NULL
| NULL | auto | NULL | NULL | NULL | es | NULL
300 | NULL | all | ulaw,alaw,gsm |
| avillacisIM | SIP/avillacisIM_pbx.villacis.com | yes | no |
NULL | NULL | NULL | yes | NULL | no
| NULL | yes | 0 | SIP.js/0.6.2 | 1409346610 |
| yes | 384 | NULL | NULL | NULL
| NULL | NULL | NULL | NULL |
NULL | NULL | 60 | NULL | NULL | NULL |
NULL | NULL | NULL | yes | NULL | NULL | 101
| NULL | NULL | NULL | NULL | NULL | NULL
| NULL | *97 | NULL | NULL | NULL
| pbx.villacis.com-im-sip | NULL | NULL | NULL |
pbx.villacis.com | pbx.villacis.com-im-sip | Avillacis12345 |
avillacisIM | NULL | yes | yes | no |
/etc/pki/tls/certs/localhost_asterisk.crt |
/etc/pki/tls/private/localhost_asterisk.key | actpass | yes | yes |
yes |
+----+------------------------------+--------------------------------+-------------+-----------------+-----------------+------+--------+-----------+--------------+------------+---------+---------------------+--------+-------------+----------+-----------+-------------+----------------+------------------+----------------------+-------------+-------------------+----------------+-------------+-----------+----------+----------+------------+----------+----------+----------+------------------------------+---------+----------+------------+----------------+--------+----------+---------------+-----------------------------------------------+-----------+------+----------+-------------+----------------------------------+-----------+----------+----------------+--------------+---------------+-------------+-----------+--------------+----------------+---------------+--------+--------------+------------+-----------+--------------+----------------+-------------------+----------------+-----------------+---------------+-------------------+---------------+-------------------+---------+--------+-------------+--------------+---------------+-------------+------------+-------------+-------------+-----------+----------+------+----------+-----------+------------+--------------+------------+------------+--------------+--------------+---------+--------------+-----------------+------------------+-------------------------+----------+-----------+--------------------+---------------------+---------------------------+----------------+--------------+----------+------+------------+------------+-------------------------------------------+---------------------------------------------+-----------+-----------+------------+------------+
1 row in set (0.00 sec)
avillacisIM_pbx.villacis.com'
* Name : avillacisIM_pbx.villacis.com
Realtime peer: Yes, cached
Secret : <Not set>
MD5Secret : <Not set>
Remote Secret: <Not set>
Context : pbx.villacis.com-from-internal
Record On feature : automon
Record Off feature : automon
Subscr.Cont. : pbx.villacis.com-im-sip
Language : es
Tonezone : <Not set>
AMA flags : Unknown
Transfer mode: open
CallingPres : Presentation Allowed, Not Screened
VM Extension : *97
LastMsgsSent : 0/0
Call limit : 2147483647
Max forwards : 0
Dynamic : Yes
Callerid : "101" <avillacisIM>
MaxCallBR : 384 kbps
Expire : 153
Insecure : no
Force rport : Yes
Symmetric RTP: Yes
ACL : Yes
DirectMedACL : No
T.38 support : Yes
T.38 EC mode : FEC
T.38 MaxDtgrm: 4294967295
DirectMedia : No
PromiscRedir : No
User=Phone : No
Video Support: Yes
Text Support : No
Ign SDP ver : No
Trust RPID : Yes
Send RPID : No
TrustIDOutbnd: Legacy
Subscriptions: Yes
Overlap dial : No
DTMFmode : auto
Timer T1 : 500
Timer B : 32000
Addr->IP : 127.0.0.1:5060
Defaddr->IP : (null)
Prim.Transp. : WS
Allowed.Trsp : UDP,WS,WSS
Again, see above, this should only be udp.
Post by Alex Villací­s Lasso
Def. Username: avillacisIM
SIP Options : (none)
Codecs : (gsm|ulaw|alaw)
Codec Order : (ulaw:20,alaw:20,gsm:20)
Auto-Framing : No
Status : Unmonitored
Useragent : SIP.js/0.6.2
Qualify Freq : 60000 ms
Keepalive : 0 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Use Reason : No
Encryption : Yes
Ign.Lifetime : No
I think the situation is because of the change of transport. How should this
be handled so that Asterisk stops trying to use websocket transport for the
signaling that came from the UDP port?
See my responses above.
--
Paul Belanger | PolyBeacon, Inc.
Jabber: ***@polybeacon.com | IRC: pabelanger (Freenode)
Github: https://github.com/pabelanger | Twitter: https://twitter.com/pabelanger
Loading...