Hi All,
I'm trying to setup a redundant environment with DNS SRV records, 2 (or more) SIP registration servers, and Asterisk gateways. Basically I've setup both OpenSER clients to t_replicate each other the registration message if its coming from a client, and save it to the database or to memory when its coming from the other OpenSER server.
However, every once in a while, I get message to big, and or duplicate messages (WARNING: warning skipped -- too big, or ERROR: warning_builder: buffer size exceeded, submit_query: Duplicate entry ,db_insert: Error while submitting query...)
While it seems to work in general, I was not sure that this is the "right" way to do it.
I'm attaching my openser.cfg of one of the machines; the other is more or less identical... Thanks
# ----------- global configuration parameters ------------------------
debug=9 # debug level (cmd line: -dddddddddd) fork=yes log_stderror=no # (cmd line: -E)
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) listen=172.28.132.20 rev_dns=no # (cmd. line: -R) port=5060 children=4 fifo="/tmp/openser_fifo" alias="mydomain.com"
# ------------------ module loading ----------------------------------
loadmodule "/usr/local/lib/openser/modules/mysql.so" loadmodule "/usr/local/lib/openser/modules/sl.so" loadmodule "/usr/local/lib/openser/modules/tm.so" loadmodule "/usr/local/lib/openser/modules/rr.so" loadmodule "/usr/local/lib/openser/modules/maxfwd.so" loadmodule "/usr/local/lib/openser/modules/usrloc.so" loadmodule "/usr/local/lib/openser/modules/registrar.so" loadmodule "/usr/local/lib/openser/modules/textops.so" loadmodule "/usr/local/lib/openser/modules/auth.so" loadmodule "/usr/local/lib/openser/modules/auth_db.so" loadmodule "/usr/local/lib/openser/modules/lcr.so" loadmodule "/usr/local/lib/openser/modules/xlog.so"
# ----------------- setting module-specific parameters ---------------
modparam("usrloc", "db_mode", 2) modparam("usrloc|lcr|auth_db|avpops|group","db_url","mysql://openser:ope nserrw@voip-db.mydomain.com/openser") modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "password_column", "password")
modparam("rr", "enable_full_lr", 1)
# ------------------------- request routing logic -------------------
# main routing logic
route{
# initial sanity checks -- messages with # max_forwards==0, or excessively long requests if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); exit; };
if (msg:len >= 2048 ) { sl_send_reply("513", "Message too big"); exit; };
# we record-route all messages -- to make sure that # subsequent messages will go through our proxy; that's # particularly good if upstream and downstream entities # use different transport protocol if (!method=="REGISTER") record_route();
# subsequent messages withing a dialog should take the # path determined by record-routing if (loose_route()) { # mark routing logic in request append_hf("P-hint: rr-enforced\r\n"); route(1); };
if (!uri==myself) { route(1); };
# Handle Request logic here if (uri==myself) { if (method=="REGISTER") { route(2); exit; } lookup("aliases"); if (!uri==myself) { append_hf("P-hint: outbound alias\r\n"); route(1); };
if (!load_gws()) { sl_send_reply("500", "Server Internal Error - Cannot load gateways"); exit; }; if (!next_gw()) { sl_send_reply("503", "Service not available, no gateways found"); log (1,"No more gateways"); } else { log (1,"Found a gateway"); } if (!lookup("location")) { sl_send_reply("404", "Not Found"); exit; }; append_hf("P-hint: usrloc applied\r\n"); }; route(1); }
route[1] { # send it out now; use stateful forwarding as it works reliably # even for UDP2TCP if (!t_relay()) { sl_reply_error(); }; exit; }
route[2] { #handle all Registration here.... if (search("^(Contact|m): .*@(voip.mydomain.com)")){ log(1, "ALERT: someone trying to set aor==server address\n"); sl_send_reply("476", "Server address in contacts is not allowed" ); exit; };
# challenge/response #if a registration request is coming from another ser server, it means that's it's already authenticated the user and wrote #an entry in the database, so lets just write it into our memory. if (src_ip==172.28.132.21) { save_memory("location"); log(1, "Registered replicated user from Proxy"); exit; }; # this is a new request, lets check that the user is valid. if (!www_authorize("mydomain.com", "subscriber")) { www_challenge("mydomain.com", "0"); log(1, "Authentication challenge issued. Waiting for reply.\n"); exit; };
# Authentication successful, add entry to our Contact database log(1, "Authentication challenge reply ok.\n"); if (!save("location")) { sl_reply_error(); log(1, "ALERT: Unable to save URI to location database.\n"); } else { # and replicate the request to the backup server if (!src_ip==172.28.132.21) { log(1, "REPLICATE: Replicating register request\n"); t_replicate("sip:172.28.132.21:5060"); };
}; }