2016-09-05 4 views
0

Ich habe drei virtuelle Server mit Ubuntu 14.04. Auf einem Server habe ich Kamailio und auf den anderen Asterisk installiert. Ich möchte, dass der Kamailio-Server als Load-Balancer arbeitet und die eingehenden Anrufe an die Asterisk-Server weiterleitet (Round-Robin).Kamailio als Load Balancer für mehrere Stern-Server

Ich möchte es zuerst mit einem Asterisk-Server testen und wenn das funktioniert, kann ich mehr für mehr Leistung hinzufügen.

ich so meine SIP-Provider-Anmeldeinformationen hinzugefügt:

kamctl add test testpasswd 

dann den Asterisk-Server an den Dispatcher Tabelle wie folgt ich hinzugefügt:

INSERT INTO dispatcher (setid,destination,flags,priority,attrs,description) VALUES (1,"sip:10.1.1.3:5060",0,0,"","Asteriskl-I"); 

ich die sip.conf Datei auf meinem Stern geändert Server, dass es mit meinem Kamailio-Server verbindet und das scheint zu funktionieren.

Meine kamailio.cfg Datei sieht wie folgt aus:

#!KAMAILIO 
 
# 
 
# sample config file for dispatcher module 
 
# - load balancing of VoIP calls with round robin 
 
# - no TPC listening 
 
# - don't dispatch REGISTER and presence requests 
 
# 
 
# Kamailio (OpenSER) SIP Server v3.2 
 
#  - web: http://www.kamailio.org 
 
#  - git: http://sip-router.org 
 
# 
 
# Direct your questions about this file to: [email protected] 
 
# 
 
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php 
 
# for an explanation of possible statements, functions and parameters. 
 
# 
 
# Several features can be enabled using '#!define WITH_FEATURE' directives: 
 
# 
 
# *** To run in debug mode: 
 
#  - define WITH_DEBUG 
 
# 
 

 
####### Global Parameters ######### 
 

 
#!define WITH_DEBUG 
 

 
#!ifdef WITH_DEBUG 
 
debug=4 
 
log_stderror=yes 
 
#!else 
 
debug=2 
 
log_stderror=no 
 
#!endif 
 

 
memdbg=5 
 
memlog=5 
 

 
log_facility=LOG_LOCAL0 
 

 
fork=yes 
 
children=4 
 

 
/* comment the next line to enable TCP */ 
 
disable_tcp=yes 
 

 
/* uncomment the next line to disable the auto discovery of local aliases 
 
    based on revers DNS on IPs (default on) */ 
 
auto_aliases=no 
 

 
/* add local domain aliases */ 
 
# alias="mysipserver.com" 
 

 
port=5060 
 

 
/* uncomment and configure the following line if you want Kamailio to 
 
    bind on a specific interface/port/proto (default bind on all available) */ 
 
# listen=udp:127.0.0.1:5060 
 

 
sip_warning=no 
 

 
####### Modules Section ######## 
 

 
#set module path 
 
mpath="/usr/local/lib64/kamailio/modules/" 
 

 
# loadmodule "db_mysql.so" 
 
loadmodule "mi_fifo.so" 
 
loadmodule "kex.so" 
 
loadmodule "tm.so" 
 
loadmodule "tmx.so" 
 
loadmodule "sl.so" 
 
loadmodule "rr.so" 
 
loadmodule "pv.so" 
 
loadmodule "maxfwd.so" 
 
loadmodule "textops.so" 
 
loadmodule "siputils.so" 
 
loadmodule "xlog.so" 
 
loadmodule "sanity.so" 
 
# loadmodule "ctl.so" 
 
loadmodule "mi_rpc.so" 
 
loadmodule "acc.so" 
 
loadmodule "dispatcher.so" 
 

 

 
# ----------------- setting module-specific parameters --------------- 
 

 

 
# ----- mi_fifo params ----- 
 
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") 
 

 

 
# ----- rr params ----- 
 
# add value to ;lr param to cope with most of the UAs 
 
modparam("rr", "enable_full_lr", 1) 
 
# do not append from tag to the RR (no need for this script) 
 
modparam("rr", "append_fromtag", 0) 
 

 

 
# ----- acc params ----- 
 
modparam("acc", "log_flag", 1) 
 
modparam("acc", "failed_transaction_flag", 3) 
 
modparam("acc", "log_extra", 
 
     "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd;src_ip=$si") 
 

 
# ----- tm params ----- 
 
modparam("tm", "fr_timer", 2000) 
 
modparam("tm", "fr_inv_timer", 40000) 
 

 
# ----- dispatcher params ----- 
 
# modparam("dispatcher", "db_url", 
 
#  "mysql://kamailio:[email protected]/kamailio") 
 
modparam("dispatcher", "table_name", "dispatcher") 
 
modparam("dispatcher", "flags", 2) 
 
modparam("dispatcher", "dst_avp", "$avp(AVP_DST)") 
 
modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)") 
 
modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)") 
 

 
####### Routing LogiC######## 
 

 

 
# main request routing logic 
 

 
route { 
 

 
     # per request initial checks 
 
     route(REQINIT); 
 

 
     # handle requests within SIP dialogs 
 
     route(WITHINDLG); 
 

 
     ### only initial requests (no To tag) 
 

 
     # CANCEL processing 
 
     if (is_method("CANCEL")) 
 
     { 
 
       if (t_check_trans()) 
 
         t_relay(); 
 
       exit; 
 
     } 
 

 
     t_check_trans(); 
 

 
     # record routing for dialog forming requests (in case they are routed) 
 
     # - remove preloaded route headers 
 
     remove_hf("Route"); 
 
     if (is_method("INVITE|SUBSCRIBE")) 
 
       record_route(); 
 
     #if (is_method("INVITE")) 
 
     #{ 
 
     #  ds_select_domain("1","4"); 
 
     #  #sl_send_reply("300","Redirect"); 
 
     #  #t_relay(); 
 
     #  exit; 
 
     #} 
 

 
     # account only INVITEs 
 
     if (is_method("INVITE")) 
 
     { 
 
       setflag(1); # do accounting 
 
     } 
 

 
     # handle presence related requests 
 
     route(PRESENCE); 
 

 
     # handle registrations 
 
     route(REGISTRAR); 
 

 
     if ($rU==$null) 
 
     { 
 
       # request with no Username in RURI 
 
       sl_send_reply("484","Address Incomplete"); 
 
       exit; 
 
     } 
 

 
     # dispatch destinations 
 
     route(DISPATCH); 
 

 
     route(RELAY); 
 
} 
 

 

 
route[RELAY] { 
 
     if (!t_relay()) { 
 
       sl_reply_error(); 
 
     } 
 
     exit; 
 
} 
 

 
# Per SIP request initial checks 
 
route[REQINIT] { 
 
     if (!mf_process_maxfwd_header("10")) { 
 
       sl_send_reply("483","Too Many Hops"); 
 
       exit; 
 
     } 
 

 
     if(!sanity_check("1511", "7")) 
 
     { 
 
       xlog("Malformed SIP message from $si:$sp\n"); 
 
       exit; 
 
     } 
 
} 
 

 
# Handle requests within SIP dialogs 
 
route[WITHINDLG] { 
 
     if (has_totag()) { 
 
       # sequential request withing a dialog should 
 
       # take the path determined by record-routing 
 
       if (loose_route()) { 
 
         if (is_method("BYE")) { 
 
           setflag(1); # do accounting ... 
 
           setflag(3); # ... even if the transaction fails 
 
         } 
 
         route(RELAY); 
 
       } else { 
 
         if (is_method("SUBSCRIBE") && uri == myself) { 
 
           # in-dialog subscribe requests 
 
           route(PRESENCE); 
 
           exit; 
 
         } 
 
         if (is_method("ACK")) { 
 
           if (t_check_trans()) { 
 
             # non loose-route, but stateful ACK; 
 
             # must be ACK after a 487 or e.g. 404 from upstream server 
 
             t_relay(); 
 
             exit; 
 
           } else { 
 
             # ACK without matching transaction ... ignore and discard. 
 
             exit; 
 
           } 
 
         } 
 
         sl_send_reply("404","Not here"); 
 
       } 
 
       exit; 
 
     } 
 
} 
 

 
# Handle SIP registrations 
 
route[REGISTRAR] { 
 
     if(!is_method("REGISTER")) 
 
       return; 
 
     #sl_send_reply("404", "No registrar"); 
 
     #t_relay(); 
 
     if(!ds_select_dst("1", "4")) 
 
     { 
 
       sl_send_reply("404", "No registrar"); 
 
       exit; 
 
     } 
 
     forward(); 
 

 
     exit; 
 
} 
 

 
# Presence server route 
 
route[PRESENCE] { 
 
     if(!is_method("PUBLISH|SUBSCRIBE")) 
 
       return; 
 

 
     sl_send_reply("404", "Not here"); 
 
     exit; 
 
} 
 

 
# Dispatch requests 
 
route[DISPATCH] { 
 
     # round robin dispatching on gateways group '1' 
 
     if(!ds_select_dst("1", "4")) 
 
     { 
 
       send_reply("404", "No destination"); 
 
       exit; 
 
     } 
 
     xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n"); 
 
     t_on_failure("RTF_DISPATCH"); 
 
     return; 
 
} 
 

 
# Sample failure route 
 
failure_route[RTF_DISPATCH] { 
 
     if (t_is_canceled()) { 
 
       exit; 
 
     } 
 
     # next DST - only for 500 or local timeout 
 
     if (t_check_status("500") 
 
         or (t_branch_timeout() and !t_branch_replied())) 
 
     { 
 
       if(ds_next_dst()) 
 
       { 
 
         t_on_failure("RTF_DISPATCH"); 
 
         route(RELAY); 
 
         exit; 
 
       } 
 
     } 
 
}

Wenn ich mein Stern-Box direkt an meinen SIP-Provider verbinden es funktioniert perfekt. Aber wenn ich es mit dem Kamailio-Server und dem Kamailio-Server mit dem SIP-Provider verbinde, tut es das nicht.

Ich googelte stundenlang und probierte viele Dinge aus und ich habe wirklich keine Ahnung, was ich als nächstes versuchen könnte ... Wenn mir jemand helfen könnte, wäre ich sehr glücklich!

Vielen Dank und viele Grüße

+0

Was genau Problem, das Sie haben? Standard-Dispatcher-Konfiguration, die mit kamailio geliefert wird, funktioniert ok, es sei denn, Sie möchten nat und andere Funktionen hinzufügen (die sehr spezielle Kenntnisse erfordern). Warum googelst du stundenlang? Sie müssen nur sip debug (mit tcpdump oder etwas) und stellen Sie sicher, dass Ihre Konfiguration korrekt ist. – arheops

+0

Also hast du eine Firewall, nein? – arheops

Antwort

0

I added my SIP provider credentials like this:

kamctl add test testpasswd - Das ist falsch.

prüfen detaillierten Infos folgenden Link, wie Sie sollten SIP-Trunk auf Kamailio Set-up, die Benutzernamen verwenden/Passwort-Authentifizierung:

http://lists.sip-router.org/pipermail/sr-users/2015-September/090001.html

+0

Hallo os11k, vielen Dank für Ihre Antwort! Ich habe versucht, es mit dieser Authentifizierung zu konfigurieren. Meine kamailio.cfg sieht jetzt so aus: http://pastebin.com/H6R8mZ0g Es kompiliert, aber wenn ich die Nummer anrufe, funktioniert es immer noch nicht. Irgendeine Idee? – simplex

+0

Ich habe das mit dem uac-Modul versucht, aber ich kann es nicht zur Arbeit bringen. Ich habe diese Informationen: SIP-Provider: Benutzername Passwort Domain Wie soll wie mein kamailio.cfg aussehen? Ich habe mit dem uac-Modul wie 10 verschiedene Varianten ausprobiert. Oder wie kann ich meinen kamailio-Server bei meinem SIP-Provider registrieren? – simplex

+0

Überprüfen Sie dies: http://www.kamailio.org/docs/modules/4.4.x/modules/uac.html#idp23591108 Es besagt, dass Sie Datensatz zu uacreg Tabelle hinzufügen müssen – os11k