Hello,
I'm after some help on third-party SIP registration in Kamailio - specifically, how to
perform registration of user agents that don't register themselves, but only send out
occasional messages. The UAs not registering themselves are devices on a GSM network that
try to save band-width by not sending REGISTER requests for themselves. They only ever
send out SIP messages when necessary, to which they expect a reply message from our
processing server.
(Note, details like external IP addresses have been changed for security.)
The configuration is as follows. We have a SIP server running Kamailio (4.3, location db
enabled, nathelper enabled) on a static external IP address (50.170.158.149), a processing
server on an internal network registered with the SIP server (let's say with a User
agent name of '1000'), and a monitoring device in another part of the country
connected to the internet via a GSM network (let's say User agent name of
'2000'). The device is effectively NAT'd on the GSM provider's private
network.
At some point the device (UA 2000) sends a SIP message to the processing server via
Kamailio (to sip:1000@50.170.158.149). The processing server is registered, so the SIP
server knows where it is and forwards the message accordingly. 200/OK replies propagate
back successfully to the device.
The message flow appear as below. Only relevant header fields are shown:
Message received by the SIP server from remote device:
========
IP Src:60.250.149.198, Dst:50.170.158.149
UDP Src Port: 59177, Dst Port: 5060
--
Request-Line: MESSAGE sip:1000@50.170.158.149
Via: SIP/2.0/UDP 10.92.240.131:5060;branch=z9hG4bK...
To: <sip:1000@50.170.158.149>
From: <sip:2000@10.92.240.131>;tag=7a82c48a
========
Message forwarded from SIP server, received by processing server as shown:
========
IP Src:50.170.158.149, Dst: 192.168.0.235
UDP Src Port:5060, Dst Port:5060
--
Request-Line: MESSAGE sip:1000@50.170.158.146:5060; ob SIP/2.0
Via: SIP/2.0/UDP 50.170.158.149;branch=z9hG...
Via: SIP/2.0/UDP 10.92.240.131:5060;rport=59177;received=60.250.149.198;branch=z9hG...
To: <sip:1000@50.170.158.149>
From: <sip:2000@10.92.240.131>;tag=7a82c48a
========
The processing server now needs to send back a reply message to the remote, unregistered
device which is NATd on the GSM internal network. We can do this by sending back a reply
to the external IP address and rport values found in the second Via header of the message
received by the processing server (60.250.149.198, port 59177). The reply can only be sent
from the SIP server or the GSM network's router will ignore it - it's only a
temporary reply address/port open for a minute or so as it's effectively just a NAT
route to the internet.
In the first instance, when the processing server attempts to send back a message to the
remote device via the SIP server, the SIP server replies with a 404 as the remote device
hasn't registered and the SIP server has no idea where to send it.
After looking at RFC3261 my conclusion was that we must get the processing server to
perform a third-party registration on behalf of the remote device before we can send a
reply message back to that device.
My understanding is that to perform the third party registration I should send a REGISTER
request from our processing server to the SIP server:
1) Set the 'From' field to the AOR of the UA performing the registration (which is
the processing server, 1000).
2) Set the 'To' field to the AOR of the UA being registered (i.e. the remote
device, 2000).
3) Add a 'Contact' header field set to the IP address and port of the remote
device (from Via = 60.250.149.198 port 59177).
The message flow for the register is as follows (only relevant header fields shown):
Processing server sends a register request to the SIP Server:
========
Request-Line: REGISTER sip:50.170.158.149 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.235:5060;rport;branch=z9hG...
From: <sip:1000@50.170.158.149>;tag=e6e2d70...
To: <sip:2000@50.170.158.149>
Contact: <sip:2000@60.250.149.198:59177>
========
SIP server responds to the processing server with a 401 unauthorized response containing
the auth header field (nonce challenge):
========
WWW-Authenticate: Digest realm="50.170.158.149",
nonce="VytkJ1crIvu4ekGp/M4mnRlYmJRciF3N"
========
Processing server sends a revised register request to the SIP Server, augmented with the
authorisation header for the supplied nonce:
========
Request-Line: REGISTER sip:50.170.158.149 SIP/2.0
Via: SIP/2.0/UDP 50.170.158.146:1096; rport;branch=z9hG4...
From: <sip:1000@50.170.158.149>;tag=dae68a...
To: <sip:2000@50.170.158.149>
Contact: <sip:2000@60.250.149.198:59177>
Authorization: Digest username="1000", realm="50.170.158.149",
nonce="VytkJ1crIvu4ekGp/M4mnRlYmJRciF3N" response="d4d7ffba8..."
========
However, the SIP Server again responds with a 401 and won't perform the third-party
registration. I haven't been able to determine why. I *think* the response hash the
processing server is sending back is correct. I'm using PJSIP on our processing server
to perform all SIP functionality. The processing server does obviously register itself,
the difference being that the To and From fields are the same
(<sip:1000@50.170.158.149>) and there is no Contact header.
I'm at the point now of being unable to find any information or examples on how
third-party registration requests should be performed - apart from RFC3261, which
doesn't really describe the process very well.
Can anyone tell me why the third-party registration would fail, despite replying with the
authorisation header? Does Kamailio first need to be configured to allow third-party reg
somehow? Alternatively, should I be attempting to send back SIP messages to unregistered
devices in some other fashion?
I hope someone can help or point me in the right direction.
As an aside, when the device (UA2000) is plugged into a network via ethernet, it does then
perform its own registration and everything works - messages go back and forth without
issue.