مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
آموزشی

ساخت Load Balancer برای Asterisk با Kamailio؛ مدیریت تماس‌های پرترافیک

Kamailio یک SIP Server بسیار سبک و سریع است که معمولاً جلوی Asterisk، FreeSWITCH یا سایر موتورهای تلفنی قرار می‌گیرد تا Registration، SIP Routing، Load Balancing، NAT، امنیت و High Availability را در لایه…

ساخت Load Balancer برای Asterisk با Kamailio؛ مدیریت تماس‌های پرترافیک
خلاصه سریع این آموزش

Kamailio یک SIP Server بسیار سبک و سریع است که معمولاً جلوی Asterisk، FreeSWITCH یا سایر موتورهای تلفنی قرار می‌گیرد تا Registration، SIP Routing، Load Balancing، NAT، امنیت و High…

۲۶ دقیقه مطالعه ۰ دیدگاه ۲۵ مهر ۱۴۰۵ آخرین به‌روزرسانی
Kamailio یک SIP Server بسیار سبک و سریع است که معمولاً جلوی Asterisk، FreeSWITCH یا سایر موتورهای تلفنی قرار می‌گیرد تا Registration، SIP Routing، Load Balancing، NAT، امنیت و High Availability را در لایه ورودی مدیریت کند.

اگر فقط یک Asterisk دارید، شاید اصلاً به Kamailio نیاز نداشته باشید. اما وقتی تعداد کاربران، SIP Trunkها یا تماس‌ها افزایش پیدا می‌کند و می‌خواهید چند Asterisk پشت یک آدرس واحد داشته باشید، Kamailio می‌تواند به لایه‌ای تبدیل شود که تمام SIP Traffic ابتدا وارد آن شده و سپس به Backend مناسب هدایت شود.

در این معماری، کاربر یا SIP Provider لزوماً نمی‌داند پشت آدرس عمومی شما سه، پنج یا ده Asterisk وجود دارد.

در این مقاله فقط Kamailio را معرفی نمی‌کنیم؛ یک معماری واقعی می‌سازیم که در آن چند Asterisk پشت یک SIP Proxy قرار دارند و مرحله‌به‌مرحله مشخص می‌کنیم Registrar کجا باشد، Load Balancing چگونه انجام شود، NAT و RTP چه می‌شوند، Failover چگونه طراحی می‌شود و چطور IPهای داخلی Asterisk را از اینترنت مخفی کنیم.

وضعیت نسخه در اکتبر ۲۰۲۶: نسخه پایدار فعلی Kamailio برابر 6.1.5 است که ۱۵ اکتبر ۲۰۲۶ منتشر شده است. برای Asterisk نیز شاخه LTS فعلی 22.11.0 است.

فهرست مطالب

Kamailio دقیقاً چیست؟

Kamailio یک SIP Server مبتنی بر استاندارد SIP است که مهم‌ترین وظیفه آن پردازش و مسیریابی پیام‌های SIP است.

یعنی پیام‌هایی مثل:

🔹 REGISTER

🔹 INVITE

🔹 ACK

🔹 BYE

🔹 OPTIONS

🔹 SUBSCRIBE

🔹 NOTIFY

می‌توانند قبل از رسیدن به Asterisk توسط Kamailio بررسی، احراز هویت، محدود یا Route شوند.

Kamailio با Asterisk چه تفاوتی دارد؟

Asterisk معمولاً یک B2BUA است.

یعنی تماس را دریافت می‌کند، Dialplan را اجرا می‌کند، Channel می‌سازد، Bridge ایجاد می‌کند و در صورت نیاز RTP را نیز پردازش می‌کند.

Kamailio در حالت معمول SIP Proxy است.

یعنی SIP Dialog را مثل Asterisk به دو تماس مستقل تبدیل نمی‌کند؛ بیشتر نقش Router بسیار سریع SIP را دارد.

پس Kamailio جای Asterisk را نمی‌گیرد

در معماری مورد بحث ما:

Kamailio = لایه ورودی، Routing، Registration، Security و Load Balancing

Asterisk = منطق تماس، Dialplan، Queue، IVR، Recording و Application

این دو مکمل هم هستند، نه رقیب مستقیم.

معماری ساده چند Asterisk پشت Kamailio

یک معماری پایه می‌تواند چنین باشد:

IP Phones / SIP Providers
           |
           v
    +---------------+
    |    Kamailio   |
    |  SIP Proxy/LB |
    +---------------+
       /     |     \
      /      |      \
     v       v       v
Asterisk1 Asterisk2 Asterisk3
10.20.0.11 10.20.0.12 10.20.0.13

کاربران فقط:

sip.example.com

را می‌بینند.

Asteriskها می‌توانند کاملاً روی Private Network قرار داشته باشند.

چرا Kamailio را جلوی Asterisk بگذاریم؟

مهم‌ترین دلایل عبارت‌اند از:

🔹 توزیع تماس بین چند Asterisk

🔹 حذف Single Point of Capacity روی یک PBX

🔹 مخفی‌کردن IPهای Backend

🔹 جلوگیری از اتصال مستقیم اینترنت به Asterisk

🔹 مدیریت SIP Registration در لایه Edge

🔹 Rate Limiting و ACL

🔹 NAT Traversal

🔹 Failover سریع‌تر Backendها

🔹 تقسیم معماری Signaling و Application

Registrar و Proxy را با هم اشتباه نگیریم

این مهم‌ترین مفهوم مقاله است.

Kamailio می‌تواند فقط Proxy باشد یا هم‌زمان نقش Registrar را نیز انجام دهد.

SIP Proxy چیست؟

Proxy یک SIP Request را دریافت می‌کند و آن را به مقصد دیگری Forward می‌کند.

مثلاً:

INVITE
Phone
  ↓
Kamailio
  ↓
Asterisk-02

در این سناریو Kamailio تصمیم گرفته Asterisk-02 تماس را پردازش کند.

Registrar چیست؟

Registrar مقصد پیام REGISTER است.

وقتی تلفن Register می‌شود، Registrar باید بداند:

داخلی 1001 اکنون از چه IP و Portی قابل دسترسی است؟

مثلاً:

1001
sip:1001@198.51.100.25:50872
expires=300

Kamailio برای این کار از ماژول‌های:

registrar
usrloc

استفاده می‌کند.

سه مدل معماری Registration داریم

مدل اول: Kamailio فقط Proxy است

REGISTER از تلفن وارد Kamailio می‌شود ولی Kamailio آن را به یکی از Asteriskها Forward می‌کند.

پس Contact داخل Asterisk ذخیره می‌شود.

مزیت این مدل سادگی Migration است.

اگر قبلاً تمام داخلی‌ها روی Asterisk Register می‌شدند، تغییر کمتری لازم دارید.

مشکل این مدل چیست؟

Registration State روی همان Asterisk باقی می‌ماند.

اگر داخلی 1001 روی Asterisk-01 Register شده باشد ولی تماس بعدی به Asterisk-03 فرستاده شود، Asterisk-03 Contact همان تلفن را ندارد.

در چنین معماری‌ای باید Sticky Routing داشته باشید.

برای REGISTER از Hash استفاده کنیم

Dispatcher الگوریتمی برای Hash بر اساس Authentication Username دارد.

در نتیجه می‌توانید تلاش کنید تمام REGISTERهای یک User به همان Backend برسند.

اما Failover همچنان پیچیده است؛ چون Registration State بین Asteriskها به‌طور خودکار مشترک نیست.

مدل دوم: Kamailio خودش Registrar است

در این معماری:

Phone REGISTER
      ↓
   Kamailio
 registrar/usrloc
      ↓
   200 OK

Asterisk دیگر مالک Contact تلفن نیست.

تمام Location State روی Kamailio قرار دارد.

مزیت بزرگ Registrar مرکزی

حالا Asteriskها Statelessتر می‌شوند.

تماس ورودی می‌تواند روی هر Asterisk پردازش شود و وقتی لازم است به User برسد، دوباره به Kamailio فرستاده شود.

Kamailio با Location Lookup مقصد واقعی تلفن را پیدا می‌کند.

اما این مدل پیچیده‌تر است

اگر FreePBX، VitalPBX یا Dialplan شما فرض می‌کند Extensionها مستقیماً روی Asterisk Register می‌شوند، نمی‌توانید Registrar را بدون طراحی مجدد ناگهان به Kamailio منتقل کنید.

Authentication، Presence، BLF، MWI، Contact State و Device Status باید در معماری جدید بررسی شوند.

مدل سوم: Kamailio Edge + Registrar + Asterisk Application Pool

این معماری برای سیستم‌های بزرگ بسیار جذاب است.

Phones
   |
REGISTER
   |
   v
Kamailio Registrar
   |
   +---- Location / NAT
   |
INVITE
   |
   v
Kamailio Dispatcher
   |
   +---------+---------+
   |         |         |
   v         v         v
Asterisk1 Asterisk2 Asterisk3

در این حالت Asteriskها بیشتر نقش Application Server را دارند.

برای این مقاله کدام معماری را می‌سازیم؟

برای اینکه Setup پایه قابل‌فهم و کم‌ریسک باشد، ابتدا Kamailio را به‌عنوان:

SIP Edge Proxy + Load Balancer

جلوی چند Asterisk قرار می‌دهیم.

بعد Registrar مرکزی را به‌عنوان مرحله پیشرفته‌تر بررسی می‌کنیم.

نسخه فعلی Kamailio

در زمان بررسی این مقاله:

Kamailio 6.1.5

آخرین نسخه پایدار است.

شاخه 6.1 چه تغییر مهمی دارد؟

از تغییرهای شاخه 6.1 می‌توان به مواردی مثل:

🔹 Multi-threaded TLS Operations

🔹 بهبود ARM64

🔹 قابلیت‌های بیشتر SIPREC با RTPEngine

🔹 SHA-512 و SHA-512-256 برای Authentication

🔹 بهبود TLS Connection Handling

🔹 قابلیت‌های جدید Dispatcher و DMQ

اشاره کرد.

سیستم‌عامل پیشنهادی

Repository رسمی Kamailio برای 6.1.x در حال حاضر Packageهای Debian 12 و Debian 13 را ارائه می‌کند.

برای این آموزش از:

Debian 12 Bookworm

استفاده می‌کنیم.

مرحله ۱: نصب Repository رسمی Kamailio

apt update
apt install -y wget gpg ca-certificates

Signing Key رسمی:

wget -O- https://deb.kamailio.org/kamailiodebkey.gpg \
| gpg --dearmor \
| tee /usr/share/keyrings/kamailio.gpg >/dev/null

Repository شاخه 6.1 روی Debian 12

echo 'deb [signed-by=/usr/share/keyrings/kamailio.gpg] http://deb.kamailio.org/kamailio61 bookworm main' \
> /etc/apt/sources.list.d/kamailio.list

apt update

مرحله ۲: نصب Kamailio

برای Proxy پایه:

apt install -y kamailio kamailio-tls-modules

اگر بعداً Registrar با Database می‌سازید، Driver دیتابیس مناسب مثل MySQL/MariaDB یا PostgreSQL را نیز نصب کنید.

نسخه نصب‌شده را بررسی کنید

kamailio -V

فایل اصلی تنظیمات کجاست؟

/etc/kamailio/kamailio.cfg

قبل از هر تغییر:

cp /etc/kamailio/kamailio.cfg \
/etc/kamailio/kamailio.cfg.before-lb

مرحله ۳: Backendهای Asterisk را روی شبکه خصوصی قرار دهید

مثلاً:

Node Private IP
Asterisk-01 10.20.0.11
Asterisk-02 10.20.0.12
Asterisk-03 10.20.0.13
Kamailio 10.20.0.5 + Public IP

IPها مثال مستندسازی هستند.

در Production بهتر است Asteriskها از اینترنت Public SIP مستقیم دریافت نکنند.

Asterisk فقط باید Kamailio را ببیند

در Firewall Backendها، SIP ورودی را تا حد امکان فقط از:

10.20.0.5

یا IPهای Kamailio Cluster مجاز کنید.

این کار Attack Surface را بسیار کاهش می‌دهد.

مرحله ۴: Dispatcher را فعال کنید

ماژول `dispatcher` برای پخش SIP Request بین چند مقصد ساخته شده است.

در Configuration:

loadmodule "dispatcher.so"
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "sanity.so"

فایل مقصدهای Dispatcher

برای نمونه:

1 sip:10.20.0.11:5060 0 0 duid=ast01;weight=50
1 sip:10.20.0.12:5060 0 0 duid=ast02;weight=50
1 sip:10.20.0.13:5060 0 0 duid=ast03;weight=50

هر سه داخل Dispatcher Set شماره 1 هستند.

مسیر فایل را مشخص کنید

modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")

Health Check را فعال کنید

اگر Backend خراب شد، نمی‌خواهیم تماس جدید همچنان به آن ارسال شود.

برای نمونه:

modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_interval", 10)
modparam("dispatcher", "ds_probing_mode", 1)

Kamailio به مقصدها OPTIONS می‌فرستد و وضعیت Availability آن‌ها را بررسی می‌کند.

روی Asterisk به OPTIONS پاسخ بدهید

Health Check فقط وقتی مفید است که پاسخ Backend واقعاً نشان‌دهنده سلامت سرویس باشد.

اگر Firewall یا PJSIP روی Asterisk OPTIONS را بی‌دلیل Reject کند، Kamailio ممکن است Backend سالم را Down تصور کند.

الگوریتم‌های Dispatcher

Dispatcher فقط Round Robin نیست.

Algorithm کاربرد
4 Round Robin
5 Hash بر اساس Auth Username
9 Weight-based Distribution
10 Call Load Distribution
13 Latency-optimized Dispatching

برای شروع کدام الگوریتم را انتخاب کنیم؟

برای سه Asterisk تقریباً هم‌اندازه، Round Robin نقطه شروع مناسبی است.

ds_select_dst("1", "4")

اگر سرورها منابع متفاوت دارند

Weight-based بهتر است.

مثلاً Asterisk-01 دو برابر Asterisk-03 CPU دارد.

می‌توانید Weight متفاوت تعریف کنید تا سهم بیشتری از تماس‌ها بگیرد.

Call Load Distribution چه زمانی بهتر است؟

Round Robin فقط تعداد انتخاب‌ها را تقریباً تقسیم می‌کند.

اما ممکن است Node اول 100 تماس طولانی داشته باشد و Node دوم تماس‌های کوتاه زیادی دریافت کرده باشد.

الگوریتم Call Load Distribution می‌تواند بر اساس بار تماس فعال تصمیم دقیق‌تری بگیرد.

نمونه Routing پایه INVITE

یک Baseline ساده:

request_route {

    if (!sanity_check("1511", "7")) {
        exit;
    }

    if (!mf_process_maxfwd_header("10")) {
        sl_send_reply("483", "Too Many Hops");
        exit;
    }

    if (is_method("OPTIONS") && uri == myself) {
        sl_send_reply("200", "OK");
        exit;
    }

    if (has_totag()) {
        if (loose_route()) {
            route(RELAY);
        }
        exit;
    }

    if (is_method("INVITE")) {
        record_route();

        if (!ds_select_dst("1", "4")) {
            sl_send_reply("503", "No Asterisk Available");
            exit;
        }

        t_on_failure("ASTERISK_FAILOVER");
        route(RELAY);
        exit;
    }

    route(RELAY);
}

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

این Configuration فقط Baseline آموزشی است و Production کامل محسوب نمی‌شود.

چرا record_route مهم است؟

اگر Kamailio فقط INVITE اولیه را Route کند و از مسیر Dialog خارج شود، Requestهای بعدی مثل:

🔹 BYE

🔹 re-INVITE

🔹 UPDATE

🔹 REFER

ممکن است مسیر دیگری طی کنند.

`record_route()` باعث می‌شود Kamailio در Route Set تماس باقی بماند.

loose_route چه کاری انجام می‌دهد؟

Requestهای داخل Dialog را طبق Route Header موجود Route می‌کند.

نکته مهم این است که تماس اولیه را با Dispatcher انتخاب می‌کنیم؛ قرار نیست هر BYE یا re-INVITE دوباره Round Robin شود و به Asterisk دیگری برود.

Failover Backend را اضافه کنیم

اگر Asterisk انتخاب‌شده پاسخ مناسب نداد، می‌توان Destination بعدی Dispatcher را امتحان کرد.

نمونه مفهومی:

failure_route[ASTERISK_FAILOVER] {

    if (t_is_canceled()) {
        exit;
    }

    if (t_check_status("408|5[0-9][0-9]")) {

        if (ds_next_dst()) {
            t_on_failure("ASTERISK_FAILOVER");
            t_relay();
            exit;
        }
    }
}

Failover تماس جدید با Failover تماس فعال فرق دارد

این نکته بسیار مهم است.

اگر Asterisk-01 قبل از Answer شدن تماس خراب شود، Kamailio می‌تواند INVITE را به Backend بعدی بفرستد.

اما اگر Asterisk وسط یک تماس ۳۰ دقیقه‌ای Crash کند، Kamailio نمی‌تواند به‌سادگی همان تماس فعال را به Asterisk-02 منتقل کند.

State تماس و Media روی Asterisk-01 بوده است.

پس High Availability واقعی یعنی چه؟

در بسیاری از معماری‌های عملی هدف این است:

تماس‌های جدید بلافاصله از Node خراب دور شوند.

نه اینکه هر تماس فعال بدون وقفه بین Asteriskها Live Migrate شود.

وضعیت Dispatcher را ببینیم

از RPC:

kamcmd dispatcher.list

استفاده کنید.

بعد از تغییر فایل مقصدها:

kamcmd dispatcher.reload

قبل از Reload فایل Kamailio را Validate کنید

kamailio -c -f /etc/kamailio/kamailio.cfg

در Production ابتدا Syntax Check و سپس Reload یا Restart کنترل‌شده انجام دهید.

NAT در معماری Kamailio + Asterisk

یکی از اصلی‌ترین دلیل‌های استفاده از SIP Edge Proxy، مدیریت بهتر NAT است.

اما باید دو بخش را جدا کنید:

SIP Signaling NAT

RTP Media NAT

Kamailio به‌صورت پیش‌فرض Media Proxy نیست

این اشتباه رایج است.

اگر INVITE از Kamailio عبور کند لزوماً RTP از Kamailio عبور نمی‌کند.

مسیر می‌تواند چنین باشد:

SIP:
Phone → Kamailio → Asterisk

RTP:
Phone ↔ Asterisk

nathelper برای Signaling NAT

Kamailio ماژول:

nathelper

دارد.

این ماژول می‌تواند NAT Detection، Contact Handling و NAT Keepalive را مدیریت کند.

fix_nated_contact را کورکورانه استفاده نکنید

مستند رسمی خود Kamailio هشدار می‌دهد `fix_nated_contact()` خود Contact Header را Rewrite می‌کند و این روش کاملاً RFC-compliant نیست.

در بسیاری از سناریوهای جدید، ترکیب‌هایی مثل:

add_contact_alias()
handle_ruri_alias()

انتخاب استانداردتری هستند.

NAT Binding باید زنده بماند

تلفن‌های پشت NAT ممکن است Port Mapping خود را بعد از مدتی از دست بدهند.

Kamailio می‌تواند Keepalive یا SIP Ping ارسال کند تا Binding فعال بماند.

اگر Media را هم کنترل کنیم چه؟

در این حالت RTPEngine به معماری اضافه می‌شود.

        SIP
Phone -------- Kamailio -------- Asterisk
  \                                 /
   \                               /
    +--------- RTPEngine ----------+
              RTP Media

RTPEngine چه کاری انجام می‌دهد؟

Kamailio SDP را به RTPEngine می‌دهد.

RTPEngine آدرس Media را Rewrite می‌کند تا RTP از Media Relay عبور کند.

توابع مهم ماژول Kamailio:

rtpengine_offer()
rtpengine_answer()
rtpengine_manage()
rtpengine_delete()

چه زمانی RTPEngine لازم است؟

مثلاً وقتی:

🔹 Endpointها پشت NATهای سخت هستند.

🔹 نمی‌خواهید Public IP Asterisk در SDP دیده شود.

🔹 WebRTC و RTP معمولی باید به هم متصل شوند.

🔹 Media باید از یک نقطه کنترل‌شده عبور کند.

🔹 نیاز به Transcoding یا Media Policy دارید.

اگر Asterisk خودش Media را Anchor می‌کند چه؟

لزومی ندارد حتماً RTPEngine اضافه کنید.

هر Media Relay جدید Complexity و مصرف منابع ایجاد می‌کند.

اول مشخص کنید چه کسی مالک Media Path است:

Asterisk یا RTPEngine؟

دو بار Rewrite کردن SDP در لایه‌های مختلف بدون طراحی مشخص می‌تواند باعث صدای یک‌طرفه شود.

Topology Hiding چیست؟

وقتی SIP Packet از چند Proxy و Backend عبور می‌کند ممکن است Headerهایی مثل:

🔹 Via

🔹 Record-Route

🔹 Route

🔹 Contact

اطلاعات شبکه داخلی را آشکار کنند.

topoh چه کاری می‌کند؟

ماژول `topoh` Routing Headerهای SIP را Mask می‌کند.

مثلاً کاربر بیرونی نباید ببیند تماس از:

10.20.0.11
10.20.0.12

عبور کرده است.

topos چه تفاوتی دارد؟

`topos` Routing Headerهای مربوط به Topology را Strip می‌کند و اطلاعات موردنیاز برای بازسازی مسیر را داخل Storage نگه می‌دارد.

Backendهای Storage آن می‌توانند شامل:

🔹 Database

🔹 Redis

🔹 HTable

باشند.

برای HA، انتخاب Storage اهمیت دارد

اگر چند Kamailio Active دارید و از `topos` استفاده می‌کنید، Topology State باید در معماری Failover دیده شود.

Storage صرفاً Local ممکن است باعث شود Node دیگر اطلاعات لازم برای بازسازی Dialog را نداشته باشد.

در چنین طراحی‌هایی Redis یا Database مشترک می‌تواند بررسی شود.

Topology Hiding امنیت کامل نیست

مخفی‌کردن IP داخلی مفید است، اما:

Topoh یا Topos جای Firewall نیست.

اگر Backend Asterisk همچنان از اینترنت قابل دسترسی باشد، مخفی‌شدن IP داخل SIP Header تضمین امنیت نمی‌کند.

برای مخفی‌کردن کامل Backend باید Media را هم در نظر بگیرید

ممکن است SIP Headerها کاملاً Mask شده باشند ولی داخل SDP هنوز این IP دیده شود:

c=IN IP4 10.20.0.11

اگر هدف واقعی مخفی‌کردن Media Topology است، SDP نیز باید با RTPEngine یا Media Architecture مناسب مدیریت شود.

امنیت Kamailio؛ Edge Server مستقیماً روی اینترنت است

وقتی Kamailio جلوی همه Asteriskها قرار می‌گیرد، خودش اولین نقطه تماس اینترنت با SIP Infrastructure می‌شود.

پس Edge Security باید جدی‌تر از یک PBX داخلی باشد.

اول Firewall

فقط Protocol و Portهایی را باز کنید که واقعاً استفاده می‌کنید.

اگر UDP/5060 دارید، نیازی نیست ده‌ها Port SIP دیگر بدون کاربرد باز باشند.

اگر Provider IP ثابت دارد، Traffic Trunk را بر اساس Source IP محدود کنید.

Backendها را به Internet Exposure ندهید

یکی از مهم‌ترین مزایای Kamailio همین است.

اگر Asterisk-01 فقط باید از Kamailio SIP بگیرد، Firewall آن را همین‌طور تنظیم کنید.

Sanity Check قبل از Routing

ماژول:

sanity

می‌تواند Packetهای SIP معیوب را قبل از ورود به Logic اصلی رد کند.

Max-Forwards را بررسی کنید

برای جلوگیری از Routing Loop:

mf_process_maxfwd_header("10")

یک Guard ساده اما ضروری است.

ACL با permissions

Kamailio ماژول `permissions` دارد که می‌تواند IP-based ACL را برای مواردی مثل:

🔹 Trusted SIP Provider

🔹 Registration

🔹 Call Routing

🔹 Address Permission

مدیریت کند.

چرا ACL برای SIP Trunk مهم است؟

اگر Carrier فقط از سه IP مشخص INVITE می‌فرستد، لازم نیست یک INVITE ناشناس از هرجای اینترنت وارد Routing Trunk شود.

Authentication و ACL می‌توانند در لایه Edge قبل از رسیدن Packet به Asterisk اعمال شوند.

Flood Protection

Kamailio ماژول‌هایی مثل:

pike
ratelimit
htable
secfilter

برای شناسایی یا محدودکردن الگوهای مشکوک دارد.

اما Threshold را از اینترنت Copy نکنید.

یک Carrier ممکن است در Peak صدها INVITE در ثانیه بفرستد و همان عدد برای یک شبکه کوچک Attack به نظر برسد.

TLS را کجا Terminate کنیم؟

یکی از معماری‌های رایج این است:

Phone/Provider → TLS → Kamailio → Private SIP → Asterisk

در این حالت Certificate Public روی Kamailio مدیریت می‌شود.

اگر Compliance یا Zero-Trust داخلی دارید، می‌توانید بین Kamailio و Asterisk نیز TLS داشته باشید.

Kamailio 6.1 TLS چندریسمانی را بهبود داده است

شاخه 6.1 امکان Multi-threaded TLS Operations را اضافه کرده است.

برای Platformهایی با تعداد TLS Connection بالا، این تغییر می‌تواند از نظر طراحی ظرفیت اهمیت داشته باشد.

Registrar مرکزی را چطور طراحی کنیم؟

اگر تصمیم گرفتید Registration روی Kamailio Terminate شود، حداقل این اجزا نیازند:

🔹 registrar

🔹 usrloc

🔹 Authentication

🔹 NAT Handling

🔹 Persistent Storage یا Replication در صورت HA

فقط save(“location”) کافی نیست

یک Configuration ناامن ممکن است چیزی شبیه:

if (is_method("REGISTER")) {
    save("location");
    exit;
}

داشته باشد.

این نمونه برای Production مناسب نیست.

قبل از `save()` باید Authentication و Registration Policy اعمال شود.

چرا Registration Permissions مهم است؟

ماژول `permissions` حتی می‌تواند Contactهایی را که نباید Register شوند رد کند.

مثلاً نباید یک User مخرب بتواند Contact خودش را روی IP یک PSTN Gateway ثبت کند و Routing Security را دور بزند.

Location Table را مشاهده کنیم

اگر Kamailio Registrar است:

kamcmd ul.dump

می‌تواند Contactهای ثبت‌شده را نشان دهد.

HA Registrar با دو Kamailio

اگر فقط یک Kamailio دارید و Registrar روی آن است، همان Server تبدیل به Single Point of Failure می‌شود.

برای معماری بزرگ‌تر می‌توانید دو یا چند Kamailio داشته باشید.

                SIP Clients
                    |
               VIP / DNS
                /      \
               /        \
        Kamailio-01  Kamailio-02
             \          /
              \        /
             Asterisk Pool

Location Recordها را بین Kamailioها Replicate کنیم

ماژول:

dmq_usrloc

برای Replication رکوردهای `usrloc` بین Kamailio Nodeها ساخته شده است.

این ماژول از:

dmq
usrloc

استفاده می‌کند.

DMQ چیست؟

Distributed Message Queue مکانیزمی داخل Kamailio است که اطلاعات را بین Nodeهای Kamailio Replicate می‌کند.

Location Record، Cached Data و برخی Stateها می‌توانند از طریق Channelهای DMQ منتقل شوند.

یک نکته نسخه‌ای مهم در DMQ

مستند رسمی هشدار می‌دهد Nodeهای DMQ باید Major Version یکسان داشته باشند.

مثلاً Cluster 6.1 را با Node 6.0 بدون بررسی دقیق مخلوط نکنید.

Kamailio خودش نباید Single Point of Failure شود

یکی از اشتباه‌های معماری این است که سه Asterisk HA بسازیم ولی فقط یک Kamailio داشته باشیم.

در آن صورت:

Asteriskها High Available هستند اما Edge Proxy نه.

روش‌های دسترسی به چند Kamailio

بسته به شبکه می‌توانید از:

🔹 Virtual IP

🔹 DNS SRV

🔹 Load Balancer لایه 4

🔹 Anycast در معماری‌های پیشرفته

استفاده کنید.

انتخاب روش باید با UDP/TCP/TLS Session Behavior و Registrar State هماهنگ باشد.

Load Balancer عمومی HTTP را برای SIP فرض نکنید

SIP با HTTP یکسان نیست.

اگر Load Balancer جلوی Kamailio قرار می‌دهید، باید UDP/TCP/TLS و حفظ Flowها را درست پشتیبانی کند.

Kamailio یا HAProxy؟

HAProxy و Load Balancerهای L4 می‌توانند Connection Distribution انجام دهند، اما Kamailio SIP را می‌فهمد.

یعنی می‌تواند بر اساس:

🔹 SIP Method

🔹 User

🔹 Domain

🔹 Call-ID

🔹 SIP Header

🔹 Authentication Username

تصمیم Route بگیرد.

برای چند Asterisk کدام Topology مناسب‌تر است؟

برای شروع:

Internet
   |
Kamailio x2
   |
Dispatcher
   |
Asterisk x3
   |
DB / Services

معماری خوبی است.

اگر Registration روی Kamailio است:

DMQ/Location Replication را نیز اضافه کنید.

اگر Media Relay نیاز دارید:

RTPEngine Cluster را جدا کنید.

Asterisk Backend باید چه چیزی بداند؟

Asterisk باید بداند ترافیک SIP قانونی از Kamailio می‌آید.

اما نباید صرفاً Source IP Kamailio را معادل User Authentication فرض کنید مگر معماری شما دقیقاً همین‌طور طراحی شده باشد.

Kamailio می‌تواند Headerها، Identity و Authentication را قبل از Backend بررسی کند.

Source IP اصلی کاربر را گم نکنیم

وقتی تمام Packetها از Kamailio وارد Asterisk می‌شوند، Asterisk در لایه Network ممکن است Source را Kamailio ببیند.

اگر برای Logging، Fraud Detection یا CDR به IP واقعی User نیاز دارید، آن را با Header یا Metadata کنترل‌شده منتقل کنید.

به Header دلخواه Client اعتماد نکنید؛ Kamailio باید آن را حذف و خودش مقدار معتبر تولید کند.

REGISTER را Round Robin نکنید بدون طراحی State

این یکی از رایج‌ترین اشتباه‌هاست.

اگر:

REGISTER شماره ۱ → Asterisk-01

REGISTER شماره ۲ → Asterisk-02

REGISTER شماره ۳ → Asterisk-03

شود، Device State شما بین Serverها پخش و ناپایدار می‌شود.

برای Registration یا Registrar مرکزی بسازید یا Sticky Routing طراحی کنید.

INVITE جدید را می‌توان Load Balance کرد

برخلاف REGISTER، تماس جدید برای Application Pool راحت‌تر قابل توزیع است.

Kamailio Backend را انتخاب می‌کند و همان Dialog از همان مسیر ادامه پیدا می‌کند.

BLF و Presence را فراموش نکنید

اگر سیستم شما فقط Voice Call نیست و Featureهایی مثل:

🔹 BLF

🔹 Presence

🔹 MWI

🔹 SUBSCRIBE/NOTIFY

دارد، Multi-Asterisk Design پیچیده‌تر می‌شود.

SUBSCRIBE State باید با Backend و Registrar Architecture هماهنگ باشد.

Database مشترک همه مشکلات را حل نمی‌کند

ممکن است سه Asterisk به یک Database متصل باشند، اما SIP Dialog و Registration Memory همچنان State محلی داشته باشند.

Shared DB را با Shared Runtime State اشتباه نگیرید.

Monitoring چه چیزهایی لازم دارد؟

برای Kamailio فقط CPU را مانیتور نکنید.

مهم‌اند:

🔹 SIP Requests Per Second

🔹 Active Transactions

🔹 Dispatcher Destination State

🔹 Registrar Contact Count

🔹 4xx / 5xx Rate

🔹 TCP/TLS Connections

🔹 Retransmission Rate

🔹 Backend Latency

🔹 RTPEngine Session Count

Latency-aware Dispatching

Dispatcher جدید الگوریتمی دارد که می‌تواند Latency Backendها را در انتخاب مقصد لحاظ کند.

این قابلیت زمانی مفید است که Nodeها در دیتاسنترهای متفاوت یا با Performance متفاوت باشند.

اما در Cluster هم‌مکان و Stable، پیچیدگی غیرضروری ایجاد نکنید؛ Round Robin یا Call Load ممکن است کافی باشد.

چطور معماری را Test کنیم؟

Test Plan فقط نباید یک تماس دستی باشد.

مرحله ۱: هر Asterisk جداگانه تماس بگیرد.

مرحله ۲: Dispatcher هر سه را Up نشان دهد.

مرحله ۳: ۳۰ تماس جدید ایجاد کنید و Distribution را ببینید.

مرحله ۴: Asterisk-02 را Stop کنید.

مرحله ۵: ببینید OPTIONS Health Check آن را Down تشخیص می‌دهد.

مرحله ۶: تماس جدید نباید به Node خراب برود.

مرحله ۷: Asterisk-02 را برگردانید.

مرحله ۸: Recovery Dispatcher را بررسی کنید.

مرحله ۹: NAT Client واقعی تست شود.

مرحله ۱۰: تماس دوطرفه و RTP تست شود.

Load Test با SIPp

برای سامانه جدی، SIPp می‌تواند INVITE Rate و Call Concurrency را افزایش دهد.

در Load Test بررسی کنید:

🔹 Kamailio CPU

🔹 CPS

🔹 SIP Error Rate

🔹 Dispatcher Distribution

🔹 Backend CPU

🔹 Call Setup Delay

Kamailio احتمالاً زودتر از Asterisk Bottleneck می‌شود؟

در بسیاری از معماری‌ها Kamailio بسیار سبک است و Media را پردازش نمی‌کند؛ بنابراین Bottleneck زودتر ممکن است روی:

🔹 Asterisk Media

🔹 Transcoding

🔹 Recording

🔹 Database

ظاهر شود.

اما هیچ عدد عمومی را جای Benchmark واقعی نگذارید.

یک معماری پیشنهادی Production

                      Internet
                         |
                    sip.example.com
                         |
                 +----------------+
                 | VIP / SIP Edge |
                 +----------------+
                    /          \
                   /            \
          Kamailio-01         Kamailio-02
              |                   |
              +------ DMQ --------+
                      |
                 Dispatcher
                 /    |    \
                /     |     \
               v      v      v
           Asterisk Asterisk Asterisk
             01       02       03
               \       |      /
                \      |     /
                 Application DB

Optional Media:
Kamailio ↔ RTPEngine Cluster

چرا دو Kamailio و سه Asterisk؟

این عدد قانون نیست.

هدف فقط جداکردن Failure Domainها است.

Kamailio Edge Failure نباید کل سیستم را قطع کند و Asterisk Application Node Failure نیز نباید تماس‌های جدید را متوقف کند.

Backendها را Drain کنیم، نه ناگهان خاموش

برای Maintenance بهتر است ابتدا Backend را از Dispatcher Selection خارج کنید.

تماس‌های فعال را اجازه دهید تمام شوند.

بعد Service را Restart یا Upgrade کنید.

این روش از قطع بی‌دلیل تماس‌های فعال جلوگیری می‌کند.

Upgrade Kamailio 6.1.x

Releaseهای Minor شاخه 6.1 مانند 6.1.5 با Compatibility Configuration و Database Schema شاخه قبلی 6.1 منتشر شده‌اند.

با این حال روی Production:

Backup → Node Drain → Upgrade یک Node → Test → Upgrade Node بعدی

روش امن‌تری است.

Kamailio چه زمانی اضافه‌کاری است؟

اگر فقط:

یک شرکت کوچک، ۲۰ تلفن و یک Asterisk دارید، اضافه‌کردن Kamailio ممکن است فقط Complexity ایجاد کند.

یک Asterisk درست کانفیگ‌شده احتمالاً کافی است.

چه زمانی Kamailio ارزش واقعی پیدا می‌کند؟

وقتی یکی از این نیازها دارید:

🔹 چند Asterisk

🔹 چند دیتاسنتر

🔹 ترافیک SIP بالا

🔹 Hosted PBX

🔹 Carrier Interconnect

🔹 Registrar مستقل

🔹 Security Edge

🔹 SIP Routing پیچیده

🔹 High Availability

Kamailio با FreePBX قابل استفاده است؟

از نظر فنی بله، چون FreePBX روی Asterisk است.

اما اگر چند FreePBX پشت Kamailio قرار می‌دهید، Database و Extension Configuration هر Node باید با معماری Registration و Routing شما هماهنگ باشد.

قرار دادن چند FreePBX پشت Round Robin بدون طراحی State، HA واقعی ایجاد نمی‌کند.

Kamailio با VitalPBX چطور؟

همان اصل برقرار است.

Kamailio می‌تواند SIP Edge باشد ولی باید مشخص باشد:

Registrar چه سیستمی است؟

BLF کجا مدیریت می‌شود؟

Extension State کجا نگه‌داری می‌شود؟

Dialplan کدام Node را انتخاب می‌کند؟

Kamailio با FusionPBX چه؟

FusionPBX مبتنی بر FreeSWITCH است، اما Kamailio می‌تواند جلوی FreeSWITCH هم همان نقش SIP Proxy و Dispatcher را انجام دهد.

پس معماری Kamailio محدود به Asterisk نیست.

مقایسه نقش‌ها

وظیفه Kamailio Asterisk
SIP Proxy بله، نقش اصلی نه به همان مدل
Registrar بله بله
Load Balancing SIP بسیار مناسب نقش اصلی نیست
IVR نقش اصلی نیست بله
Queue نقش اصلی نیست بله
Recording معمولاً خیر بله
RTP Processing با Media Relay خارجی بله
Topology Hiding بله محدودتر
SIP Edge Security بسیار مناسب ممکن است اما بهتر است پشت Edge باشد

اشتباه‌های رایج در معماری Kamailio + Asterisk

اشتباه ۱: REGISTER را Round Robin می‌کنیم بدون اینکه State را طراحی کنیم.

اشتباه ۲: تصور می‌کنیم Kamailio خودش RTP Proxy است.

اشتباه ۳: Asteriskها هنوز از اینترنت مستقیم در دسترس‌اند.

اشتباه ۴: یک Kamailio جلوی پنج Asterisk می‌گذاریم و Edge را SPOF می‌کنیم.

اشتباه ۵: Topology Hiding را جای Firewall می‌گیریم.

اشتباه ۶: NAT را هم در Kamailio و هم Asterisk بدون Ownership مشخص Rewrite می‌کنیم.

اشتباه ۷: OPTIONS Health Check داریم ولی Backendها پاسخ درست نمی‌دهند.

اشتباه ۸: Dialogهای فعال را هنگام Maintenance ناگهان Kill می‌کنیم.

پرسش‌های رایج

Kamailio چیست؟

Kamailio یک SIP Server متن‌باز و بسیار سبک است که می‌تواند به‌عنوان SIP Proxy، Registrar، Location Server، Load Balancer و Security Edge در جلوی Asterisk یا FreeSWITCH استفاده شود.

آخرین نسخه Kamailio در اکتبر ۲۰۲۶ چیست؟

آخرین نسخه پایدار فعلی Kamailio نسخه 6.1.5 است که ۱۵ اکتبر ۲۰۲۶ منتشر شده است.

آیا Kamailio جای Asterisk را می‌گیرد؟

معمولاً خیر. Kamailio بیشتر مسئول SIP Routing و Edge است و Asterisk برای Dialplan، IVR، Queue، Recording و Application Logic استفاده می‌شود.

آیا Kamailio می‌تواند Registrar باشد؟

بله. ماژول registrar همراه usrloc می‌تواند Contactهای کاربران را ذخیره و Location Lookup انجام دهد.

برای چند Asterisk چه ماژولی استفاده کنیم؟

ماژول dispatcher برای توزیع SIP بین چند Asterisk طراحی شده و الگوریتم‌هایی مثل Round Robin، Weight، Call Load و Latency-aware دارد.

اگر یکی از Asteriskها Down شود چه می‌شود؟

با Dispatcher Probing و Failover می‌توان تماس‌های جدید را از Backend خراب دور کرد. تماس فعال روی Node خراب الزاماً قابل انتقال زنده نیست.

آیا RTP از Kamailio عبور می‌کند؟

به‌صورت پیش‌فرض خیر. Kamailio SIP Signaling را Proxy می‌کند. برای Anchor کردن Media می‌توان RTPEngine یا Media Proxy دیگری به معماری اضافه کرد.

برای NAT، Kamailio بهتر است یا Asterisk؟

هر دو قابلیت NAT Handling دارند. در معماری Edge بهتر است مالکیت NAT مشخص باشد و از Rewrite دوگانه بدون طراحی جلوگیری شود. Kamailio می‌تواند Signaling NAT را مدیریت و در صورت نیاز RTPEngine Media NAT را انجام دهد.

Topology Hiding چه کاری می‌کند؟

ماژول‌هایی مثل topoh و topos اطلاعات Routing داخلی را از SIP Headerها مخفی می‌کنند. این قابلیت جای Firewall نیست و برای مخفی‌کردن Media IP باید SDP نیز جداگانه مدیریت شود.

آیا Kamailio خودش Single Point of Failure می‌شود؟

اگر فقط یک Node داشته باشید بله. در معماری HA بهتر است حداقل دو Kamailio و در صورت Registrar بودن Replication مناسب usrloc داشته باشید.

چطور Registrar State بین چند Kamailio هماهنگ می‌شود؟

یکی از روش‌های رسمی استفاده از dmq_usrloc است که رکوردهای User Location را از طریق DMQ بین Kamailio Nodeها Replicate می‌کند.

Kamailio برای یک شرکت کوچک لازم است؟

نه لزوماً. اگر فقط یک Asterisk و تعداد کمی User دارید، Kamailio ممکن است Complexity غیرضروری ایجاد کند. ارزش اصلی آن در Scale، SIP Edge، Multi-Node و HA دیده می‌شود.

جمع‌بندی

Kamailio زمانی ارزش واقعی خود را نشان می‌دهد که یک Asterisk دیگر پاسخ‌گوی معماری شما نباشد و بخواهید Signaling را از Application Layer جدا کنید.

در ساده‌ترین حالت می‌توانید Kamailio را به‌عنوان SIP Proxy و Dispatcher جلوی چند Asterisk قرار دهید تا INVITEهای جدید بین Nodeها توزیع شوند و Backend خراب از چرخه خارج شود.

اما Registration موضوع متفاوتی است. اگر REGISTER همچنان روی Asteriskها Terminate شود، باید Sticky Routing و State هر Backend را مدیریت کنید. در معماری پیشرفته‌تر می‌توانید Registrar را به Kamailio منتقل و Contactها را در usrloc نگه‌داری کنید.

برای NAT نیز باید Signaling و Media را جدا ببینید. Kamailio با nathelper می‌تواند Signaling NAT را مدیریت کند، ولی RTP به‌صورت پیش‌فرض از آن عبور نمی‌کند؛ برای Media Relay معمولاً RTPEngine وارد معماری می‌شود.

در بخش امنیت، Backendهای Asterisk را از اینترنت جدا کنید، Carrierها را ACL کنید، Packetهای معیوب و Flood را در Edge متوقف کنید و Topology Hiding را فقط یک لایه تکمیلی بدانید، نه جایگزین Firewall.

در نهایت، اگر HA می‌خواهید، فقط Asteriskها را تکثیر نکنید. خود Kamailio نیز باید حداقل دو Node داشته باشد و اگر Registrar روی آن است، Location State باید بین Nodeها Replicate شود.

معماری درست معمولاً چیزی شبیه این است:

Kamailio Edge Cluster → Asterisk Application Pool → Media/Database Services

و هر لایه مسئولیت مشخص خودش را دارد.

منابع و مستندات
نسخه روز Kamailio، تفاوت Proxy و Registrar، Dispatcher، NAT، Topology Hiding، RTPEngine و Replication این مقاله با مستندات رسمی پروژه تا ۱۷ اکتبر ۲۰۲۶ بررسی شده‌اند.
نسخه روز
مرجع انتشار نسخه پایدار 6.1.5 در ۱۵ اکتبر ۲۰۲۶ و Compatibility شاخه 6.1
Install
مرجع Repository رسمی Kamailio 6.1 برای Debian 12 و Debian 13 و Signing Key فعلی
Dispatcher
مرجع Load Balancing، Round Robin، Weight، Call Load، Latency-aware Selection، Health Check و Destination Probing
Registrar
مرجع REGISTER، save، lookup، Path Handling و ارتباط Registrar با usrloc
User Location
مرجع نگه‌داری Contact و Address of Record، NAT Contact Matching، Database Mode و Location Statistics
NAT
مرجع NAT Traversal، Keepalive، Contact Handling و تفاوت fix_nated_contact با Contact Alias
Media Relay
مرجع rtpengine_offer، rtpengine_answer، rtpengine_manage، SDP Rewrite و Media Relay
Topology
مرجع Topology Stripping و ذخیره State در Database، Redis یا HTable
Registrar HA
مرجع Replication رکوردهای User Location میان چند Kamailio با استفاده از DMQ
پیشنهاد ایرانیکاسرور برای معماری Kamailio + Asterisk

چند Asterisk دارید؟ قبل از اضافه‌کردن Server بیشتر، لایه SIP Edge را جدا کنید

وقتی تعداد تماس‌ها بالا می‌رود، اضافه‌کردن Asterisk جدید بدون Load Balancer و Registrar Architecture معمولاً فقط سیستم را پیچیده‌تر می‌کند. Kamailio می‌تواند Public SIP Endpoint ثابت شما باشد و Asteriskها روی شبکه خصوصی فقط Application و Media موردنیاز را اجرا کنند.

برای چنین معماری‌ای بهتر است Kamailio و Asteriskها روی سرورهایی با IP ثابت، شبکه پایدار و امکان کنترل کامل Firewall قرار داشته باشند. قبل از ورود کاربران اصلی نیز Dispatcher Failover، NAT، RTP، Registrar State و Load Test باید آزمایش شوند.

مشاوره معماری Kamailio، Asterisk و SIP Trunk: 021-91302467

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *