I am trying to reach a suitable trade-off between minimising the amount of
proxied media and minimising one-way/no audio for all clients including
NATed ones.
When a UA that has been configured to use STUN sends a register message to
SER the behaviour differs depending on the device. Some, such as a Sipura
device, send the private address in the Via and the public address in the
Contact:
U 60.234.nnn.nnn:5060 -> 147.202.nnn.nnn:5060 REGISTER
sip:domain.com
SIP/2.0..Via: SIP/2.0/UDP 192.168.0.14:5060;branch=z9hG4bK-64d76b15..From:
<sip:6435488773@domain.com >;tag=4cdc1208fa650916o0..To:
<sip:6435488773@domain.com>..Call-ID: 1143f50-45857c6e@192.168.0.14..CSeq: 1
REGISTER..Max-Forwards: 70..Contact:
<sip:6435488773@60.234.nnn.nnn:5060>;expires=60..User-Agent:
Sipura/SPA3000-2.0.13(GWg)..Content-Length: 0..Allow: ACK, BYE, CANCEL,
INFO, INVITE, NOTIFY, OPTIONS, REFER..Supported: x-sipura....
Others, such as a Grandstream device, send the public address in both the
Via and Contact:
U 60.234.nnn.nnn:32483 -> 147.202.nnn.nnn:5060 REGISTER
sip:domain.com
SIP/2.0..Via: SIP/2.0/UDP
60.234.nnn.nnn:32483;branch=z9hG4bK113cfc09c6acd189..From: "User" <sip:
5551234@domain.com>;tag=dede17c9405d4e0e..To:
<sip:5551234@domain.com>..Contact: <sip:5551234@60.234.nnn.nnn:32483>..
Call-ID: fc200867c9a03268@192.168.0.10..CSeq: 100 REGISTER..Expires:
60..User-Agent: Grandstream BT100 1.0.6.7..Max-Forwards: 70..Allow:
INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE..Content-Length:
0....
I am using the
opsip.org configuration file together with mediaproxy. In the
case of the Sipura, flag(6) is set in route[2] since client_nat_test("7")
evaluates to true and so any calls with this device will be proxied. From
ready various posts on the topic I understand this is a very safe
configuration since it will deal with virtually every scenario. However it
is also very expensive since it will proxy audio in situations where it is
not really required. For example a call between two Sipura devices will be
proxied when, due to STUN, it is unecessary in most cases. As I understand
it the cases when it would be necessary are:
- both UAs behind the same NAT with the SER proxy outside the NAT and router
doesn't support hairpinning
- devices behind symmetric NATs
On the other hand, flag(6) will not be set with the Grandstream and so audio
will not be proxied when this device calls another device that is either not
behind NAT or is another NATed Grandstream. This is great in most cases but
audio problems could arise in the cases described above.
What I am therefore thinking is that by default I will not proxy media for
devices where a public IP address has been determined. But I will create an
avp that specifies by user whether to enable the standard
onsip.org config.
Also there could even be a dial prefix (e.g. *666) that turns proxying on.
route[2]
#Do this by default
if (!search("^Contact: [ ]*\*") && client_nat_test("1") {
etc
#Do this if avp set or prefix dialled
if (!search("^Contact: [ ]*\*") && client_nat_test("7") {
etc
I would appreciate any comments on the above. Have I understood the issues
correctly? Will this type of configuration work? What are the disadvantages?
Regards
Cameron