Juha Heinanen wrote:
in summary: a load balancing solution that at the same time is redundant is not possible using the participating sers alone. some intelligent front end help is needed and i'm not convinced yet that even that could be done.
What about this (maybe a special case):
I was just thinking about STUN, and AFAIK this relies on a NAT device not matching the source IP of a datagram, so the client opens a NAT binding to an STUN server to determine an external IP/port pair which is filled in the Contact header. The Proxy then can also send SIP requests to this external IP/port which is forwarded to the client by the NAT device. Is this basically correct?
If so, it theoretically should work with transparent NAT handling on two SERs too, if both SERs know the external IP/port of UAC-1.
I also think I know now why it didn't work for me: SER-1 got the request from UAC-1 and stored the contact IP and the received IP in the location table. SER-2 got the replicated register but stored SER-1's IP as received IP:
On SER-1 (2.2.2.2 is the external IP of UAC-1, 3.3.3.3 is the IP of SER-1):
mysql root@ser> select * from location where username='018904449'\G *************************** 1. row *************************** username: 018904449 domain: contact: sip:018904449@192.168.34.187:50600 received: sip:2.2.2.2:50600 expires: 2005-05-03 10:19:17 q: -1.00 callid: 1338383826@192.168.34.187 cseq: 2 last_modified: 20050503101557 replicate: NULL state: NULL flags: 1 user_agent: Linphone-1.0.1/eXosip 1 row in set (0.00 sec)
And on SER-2: mysql root@ser> select * from location where username='018904449'\G *************************** 1. row *************************** username: 018904449 domain: contact: sip:018904449@192.168.34.187:50600 received: sip:3.3.3.3:46236;transport=TCP expires: 2005-05-03 10:19:15 q: -1.00 callid: 1338383826@192.168.34.187 cseq: 2 last_modified: 20050503101555 replicate: NULL state: NULL flags: 1 user_agent: Linphone-1.0.1/eXosip 1 row in set (0.00 sec)
My config basically looks like this (NAT-flag is "2"):
if (method=="REGISTER") { if(is not from Peer-SER-IP) { if(!search("^Contact: *") && client_nat_test("7")) { setflag(2); fix_nated_register(); force_rport(); append_hf("Natted: yes\r\n"); }
if(!www_authorize("<auth domain>", "subscriber")) { www_challenge("<auth domain>", "0"); break; } if(!check_to()) { sl_send_reply("403", "Use To=id next time"); break; }
consume_credentials();
if(!save("location")) { sl_reply_error(); break; }
forward_tcp("<Peer-SER-IP>", 5060); } else { if(is_present_hf("Natted")) { setflag(2); fix_nated_register(); force_rport(); } save_noreply("location"); } break; }
I'll investigate the problem and report back here. Or do I miss something important?
Andy