[Elastix MT] Call Antar Extension Tidak Bersuara Sama Sekali

Harusnya saya membahas panjang lebar terlebih dahulu apa sebenarnya Elastix MT (Multi Tenant), konsep dan cara kerjanya. Berhubung saat saya menulis sudah larut malam dan harus bangun 4 jam lagi, maka saya tuliskan hasil troubleshoot kali ini sebelum saya lupa lagi.

Latar belakangnya adalah, saya menginstall Elastix MT di VM yang dibuat ip addressnya diassign oleh HyperVisornya (yang kebetulan berupa ip address private). Kemudian saya menggantinya dengan ip address public. Karena pada saat instalasi menggunakan ip address lama, maka setting Kamailio multihomed menggunakan ip address tersebut, yang menyebabkan SIP phone bisa melakukan registrasi, tetapi tidak bisa melakukan panggilan sesama ekstensi (panggilan tersambung tetapi tidak ada yang lewat sama sekali). Untuk mengatasi hal ini saya hanya harus mengedit file /etc/kamailio/kamailio-mhomed-elastix.cfg, pada baris:

if (is_in_subnet($var(target_remote_ip), “192.168.1.0/24”)) {

$var(rtpproxy_set) = 1;
$var(rtpproxy_if) = “192.168.1.89”;
return 1;
}

menjadi

if (is_in_subnet($var(target_remote_ip), “1.2.3.0/25”)) {

$var(rtpproxy_set) = 1;
$var(rtpproxy_if) = “1.2.3.4”;
return 1;
}

Lalu juga di baris:

$var(rtpproxy_set) = 1;
$var(rtpproxy_if) = “192.168.1.89”;

menjadi:

$var(rtpproxy_set) = 1;
$var(rtpproxy_if) = “1.2.3.4”;

Atau cara paling mudah adalah dengan menjalankan script bawaan dari Elastix MT sendiri :

root# /usr/sbin/elastix-setup-kamailio-rtpproxy

Sampai di sini seharusnya call sudah bisa ditangani tanpa ada kendala suara tidak terdengar.

Membuat Acrobat Reader Membuka Halaman Yang Terakhir Dibaca

Saya banyak menghabiskan waktu di depan laptop dengan membaca ebook, terutama format .pdf. Jika di Ubuntu, saya selalu menggunakan Evince. Selain memang sudah default dari Ubuntu untuk membuka .pdf, Evince selalu membuka halaman yang saya baca terakhir kali. Agak berbeda dengan Acrobat Reader, karena secara default akan membuka halaman pertama ketika hendak meneruskan membaca ebook. Dan saya selalu lupa melakukan setting agar Adobe Acrobat membuka halaman yang saya baca terakhir kali. Padahal caranya gampang. Tinggal pilih menu Edit -> Preferences -> Document lalu beri tanda centang pada opsi Restore last view settings when reopenning documents.

adobe acrobat

nah kali ini saya tulis di sini biar saya sendiri tidak lupa caranya. Sepele, printilan tapi kalau lupa nyebelin juga.

Mendaftarkan Domain ke Manage Domain TELEPONRAKYAT.ID

Bagi yang ingin memiliki nomer VoIP Rakyat sendiri (prefix +62520 dan +62521), tanpa harus menstup SIP gateway, bisa mendaftarkan domain di TELEPONRAKYAT.ID. Di dalam website tersebut terdapat petunjuk bagaimana dengan cukup mendaftarkan domain, kita bisa mendapatkan akses hosted PBX dengan alokasi nomer. Nomer ini bisa dihubungi dari nomer VoIP Rakyat mana pun. Bagi yang sudah pernah mendaftar di voiprakyat.or.id, bisa melakukan test ke blok nomer TELEPONRAKYAT.ID. Sedangkan yang sudah memiliki/memaintain server SIP sendiri, bisa mendaftar sebagai Manage Gateway yang caranya bisa dilihat di sini.

Kelebihan dengan mendatarkan domain ke TELEPONRAKYAT.ID adalah:

  • Tidak perlu lagi memaintain SIP gateway sendiri, karena dengan mengarahkan domain ke SIP server yang telah disediakan TELEPONRAKYAT.ID, maka semua panggilan VoIP akan dilewatkan ke network TELEPONRAKYAT.ID.
  • Disediakan web control panel gratis bagi pemilik domain untuk mengatur user. Bahkan telah disediakan pula portal untuk mendaftar gratis ke domain SIP kita jika kita memperbolehkan orang lain mendaftar sebagai user secara bebas.
  • Setiap user akan memiliki nomer ekstensi dan juga nomer alokasi prefix +62520/+62521 yang bisa ditelpon dari nomer VoIP Rakyat mana pun. Formatnya adalah +62520***-XXXXXX. Tiga tanda bintang adalah 3 digit id dari prefix +62520  khusus untuk realm SIP kita, sedangan 6 digit terakhir adalah nomer ekstensi. Pengguna realm yang sama bisa saling menelpon dengan cukup menekan 6 digit ekstensi tersebut.

Sedangkan kekurangannya adalah:

  • Panggilan masih terbatas ke sesama ekstensi di realm yang sama, dan juga ke sesama nomer VoIP rakyat (prefix +62520 dan +62521).
  • Belum bisa interkoneksi ke jaringan PSTN/PLMN, atau mekanisme untuk menghubungkan hosted PBX ke gateway PSTN/PLMN kita sendiri jika kita memilikinya. Kemungkinan ini sehubungan dengan regulasi juga, atau memang fitur tersebut belum sempat disertakan.

Yang Perlu Disiapkan

  • Siapkan satu domain/subdomain untuk dijadikan alamat SIP server (DSS – Domain name for SIP Server) yang diarahkan ke ip address (per tanggal penulisan ini) : 202.153.128.61. Misal, untuk DSS yang saya daftarkan adalah public.proxy.voip.or.id, maka saya harus mengarahkan subdomain ini ke ip address di atas. Domain name ini nantinya akan menjadi alamat proxy/registrar ketika kita setting SIP client/phone.
  • Untuk manajemen user (DCP – Domain name for Control Panel), siapkan sebuah Domain/Subdomain yang diarahkan ke ip address (per tanggal penulisan ini): 202.153.128.63. Misal, saya memperbolehkan setiap orang bisa mendaftar sebagai user SIP di Domain yang saya daftarkan denngan mengakses halaman http://portal.voip.or.id , maka saya mengarahkan DNS untuk domain tersebut ke ip address di atas. TELEPONRAKYAT.ID akan menyediakan halaman web untuk manajemen user untuk kita.

Setelah setting DNS selesai, berikut cara mendaftar di TELEPONRAKYAT.ID:

  • Login ke account TELEPONRAKYAT.ID. Jika belum memiliki, silahkan mendaftar dengan mengikuti petunjuk di sini.
  • Pilih menu Setting -> Manage Domain -> Add. Di dalam halaman ini akan dimunculkan form untuk diisi yang antara lain:

Domain title: (misal) Talk Is Cheap.

Domain name for Control Panel: (isikan sesuai setting DCP di atas) portal.voip.or.id

Domain name for SIP Server: (isikan sesuai setting DSS di atas) public.proxy.voip.or.id

Allow user registration: (pilih Yes jika kita memperbolehkan setiap orang untuk mendaftar bebas) Yes

Description: (keterangan tambahan mengenai layanan ini) misal, Free VoIP Rakyat Account for Everyone.

Theme: (menu pulldown untuk memilih theme halaman DCP. Silahkan pilih theme yang disukai).

Homepage: (saya belum bereksperimen banyak di form ini, jadi sekedar saya isikan kalimat bebas) misal, Akun VoIP gratis untuk tersambung ke jaringan VoIP Rakyat.

  • Klik Submit.
  • Lakukan test dengan mendaftar di DCP. Buka halaman DCP (dalam contoh ini: http://portal.voip.or.id). Pilih menu Register dan isikan informasi pada form yang muncul (Nama, username, passwd, dll).
  • Setelah selesai, login ke account yang sudah dibuat lalu pilih menu SETTINGS -> PHONE NUMBER. Ini adalah halaman informasi mengenai alokasi nomer VoIP untuk panggilan OnNet, beserta username untuk account SIP yang akan dimasukkan ke SIP client/phone. Contoh halamannya seperti berikut:

001

Pada contoh di atas, nomer panggilan OnNet saya adalah +62520589569010. Username saya: 569010. Untuk user dengan realm yang sama (dalam hal ini public.proxy.voip.or.id), bisa melakukan panggilan cukup dengan mendial username/Local Phone Number. Jadi untuk mengontak saya, cukup mendial 569010. Tapi untuk panggilan dari realm lain (misal dari voiprakyat.or.id), harus mendial nomer format E164: +62520589569010.

  • Sampai di sini, kita harus menambkah password untuk username SIP client. Klik icon bergambar pinsil di halaman Manage Phone Number di atas. Lalu isikan password yang kita inginkan di form SIP Password. Halaman Edit Phone Number tersebut menampilkan informasi akun yang perlu disetup di SIP client/phone (username, nama domain, alamat sip server, password, dll).
  • Registrasikan SIP client/phone dengan informasi di atas. Lalu test call.

Selamat mencoba!

Setup Elastix dengan OpenVox VS-GW1600

$_35

 

Baru-baru ini didaulat untuk mengiintegraskian IP PBX Elastix sebuah kantor dengan OpenVox VS-GW1600-8G VoxStack 8 Port GSM Gateway. VoxStack ini merupakan GSM gateway berbasis Asterisk juga dengan kemudahan pengaturan menu inbound/outbound call, LCR, trunking, peering dst. Ukuran box sebesar 1U rack mount dengan 6 slot module yang bisa diisi dengan module yang berbeda (GSM, ethernet, FXO/FXS), bahkan mixed. Berikut adalah cara penyambungan VoxStack sebagai PLMN gateway untuk Elastix:

 Asumsi

  • ip address untuk VoxStack adalah 192.168.33.3
  • ip address untuk Elastix IP PBX adalah 192.168.33.2
  • Gateway VoxStack melakukan registrasi ke Elastix.

Setup Sisi Elastix IP PBX

  • Edit file /etc/asterisk/sip_custom.conf dengan menambahkan baris berikut:

[voxstack]
deny=0.0.0.0/0.0.0.0
context=from-internal
username=voxstack
secret=voxstack
type=friend
port=5060
host=dynamic
permit=0.0.0.0/0.0.0.0
qualify=yes
canreinvite=no
insecure=port,invite

  • Tambahkan konfigurasti Trunk dengan nama (misal) VoxStack. Lalu tambahkan Peer Details seperti berikut:

001

  • Ketika klik Submit, Elastix akan menyarankan menambahkan Outbound Route untuk panggilan melalui trunk ini. Tambahkan Outbound Routes dengan nama (misal) VoxStack, yang isi Dial Patterns dan Trunk Sequence seperti berikut:

002

Dial Pattern diatas dibuat dengan asumsi trunk ini hanya akan dipakai untuk melakukan panggilan ke network selular saja, yang kebetulan di Indonesia hampir semua berawalan 08 atau +628.

Setup VoxStack

  • Login ke VoxStack lalu klik System -> Status untuk mengetahui daftar nomer port dan operator seperti berikut:

003

Di sini tampak VoxStack memiliki dua module GSM port dengan masing-masing module berisi 4 slot GSM. Masing-masing slot GSM akan menampilkan nama carrier seperti di atas, sehingga kita bisa mengarahkan panggilan ke sesama operator yang (diharapkan) akan jauh lebih murah dibandingkan panggilan lintas operator. Setelah mencatat lokasi port dan nama carrier masing-masing slot GSM, maka lanjutkan dengan mebuat SIP endpoint.

  • Pilih menu SIP -> SIP Endpoints -> Add New SIP Endpoint. Isikan credential sesuai dengan yang kita tambahkan pada sip_custom.conf di Elastix IP PBX sebelumnya.

004

Pada menu pull down Registration pilih “This gateway registers with the endpoint”. Isikan User Name dan Password seperti yang telah ditambahkan di sip_custom.conf. Sedangkan Hostname or IP Address adalah ip address Elastix IP PBX (sesuai dengan persiapan sebelumnya, ip address Elastix adalah 192.168.33.2). Klik Save dan Apply.

  • Selanjut nya masuk ke menu Routing -> Groups -> New Group. Dalam contoh di sini kita akan membuat 5 buah group dengan setting seperti berikut:

005

Masing-masing group terdiri dari dua slot GSM dengan operator yang sama. Tujuannya adalah untuk mempermudah pengaturan routing call keluar. Setelah selesai klik Save dan Apply.

  • Pilih menu Call Routing Rules -> New Call Routing. Di sini kita akan mengatur panggilan ke masing-masing nomer operator dan juga panggilan masuk dari semua operator. Pada contoh pertama kita akan membuat Call Routing bernama OutBoundXL yang akan mengatur semua panggilan ke nomer-nomer XL.

Routing Name: OutBoundXL

Call comes in From: (menu drop down, pilih elastix). Nama ini kita peroleh ketika melakukan setting SIP endpoint.

Send Call Through: (menu drop down, pilih XL). Nama ini kita peroleh ketika kita membuat Group port GSM.

Lalu untuk dial pattern yang sesuai dengan nomer XL bisa dilihat dalam contoh berikut:

006

Untuk dial pattern menggunakan aturan Asterisk tidak akan saya bahas di sini karena bisa di baca di http://www.voip-info.org/wiki/view/Asterisk+Dialplan+Patterns.

Untuk keseluruhan Call Routing Rules ketika semua operator ditambahkan akan seperti ini:

007

Untuk rule nomer 5, semua panggilan masuk dari semua operator (group ALLGSM) akan diarahkan ke SIP Endpoint Elastix.

Test Setup

  • Untuk mengetahui apakan gateway VoxStack sudah teregistrasi ke Elastix bisa dengan memasuki console Asterisk (asterisk -vr) lalu jalankan perintah: sip show peer voxstack atau cukup dengan sip show peers. Jika berhasil akan muncul :
voxstack/voxstack         192.168.33.3                             D  Yes        Yes         A  5060     OK (2 ms)
  • Register ke salah satu ekstensi Elastix PBX dan lakukan panggilan ke nomer GSM.

Memblokir Panggilan Keluar Dari Ekstensi Tertentu

Gara-gara ada thread https://asterisk.id/t/membatasi-call-out-berdasarkan-ext/195/12, saya jadi ingat script untuk membatasi panggilan keluar dari ekstensi tertentu sebelum ada module Custom Context di FreePBX. Setelah dicari-cari akhirnya ketemu juga dan perlu saya tulis di sini supaya tidak lupa cara ini. Mungkin lain waktu ada IP PBX yang butuh workaround karena tidak dimungkinkan memasang Custom Context. Dan jujur sih, sebenarnya saya juga belum mencoba module satu itu. Jadi untuk sementara pakai cara berikut sepertinya lebih cepat.

  • Edit file /etc/asterisk/extensions_custom.conf melalui menu PBX -> PBX Confguration -> Tools -> Asterisk File Editor. Lalu tambahkan baris:
[from-internal-restricted]
#exec /var/lib/asterisk/bin/restricted.sh
  • Setelah itu edit file /etc/asterisk/asterisk.conf dan tambahkan baris:
execincludes = yes
  • Buat file shell script /var/lib/asterisk/bin/restricted.sh yang isinya:
#!/bin/bash
numbers=/etc/asterisk/whitelist
awk '/^;/{f=0} f{print} /^\[from-internal-additional\]/{f=1}' /etc/asterisk/extensions_additional.conf |grep -v "include => outbound-allroutes"
while read number comments; do
echo "exten => $number,1,Dial(Local/$number@from-internal)"
done < "$numbers"

File /etc/asterisk/whitelist berisi daftar nomer telpon dengan format nomertelpon keterangan. Misal: 14045 McDonald. Variabel numbers akan menyimpan daftar nomer telepon dengan keterangannya, yang kemudian akan dibaca oleh:

while read number comments; do … done < "$numbers"

Sedangkan baris perintah awk akan mengeluarkan semua context yang digunakan untuk ekstensi internal, dengan pengecualian context outbound-allroutes. Setelah diedit, simpan file tersebut lalu ubah menjadi executable :

chmod + x /var/lib/asterisk/bin/restricted.sh
  • Buat file /etc/asterisk/whitelist dengan isi (misal) seperti berikut:
147 CSTelkom
14045 McDonald
113 Damkar
110 Polisi
108 Informasi
  • Masuk ke menu Web GUI dan cari ekstensi yang akan kita blacklist untuk tidak bisa menggunakan outbound PSTN call. Klik ekstensi tersebut, lalu pada bagian Device Options, pada parameter context, isikan “from-internal-restricted” seperti di bawah ini:

restricted

  • Test panggilan dari ekstensi yang diberlakukan context from-internal-restricted ke nomer luar, lalu bandingkan dengan panggilan yang sudah dimasukkan ke whitelist.

 

[ENUM] Membagi Alokasi Prefix +62520 teleponrakyat.id Ke Trunk

Masih berhubungan dengan panggilan ENUM dari direktori E164.ID di postingan yang lalu, kali ini saya share bagaimana membagikan alokasi nomer prefix +62520 yang sudah saya dapatkan dari teleponrakyat.id, ke trunk interkoneksi antar PBX di jaringan saya. Saat ini saya memaintain 3 Elastix IP PBX yang saling tersambung, full-meshed, dengan menggunakan IAX2 trunk. Tujuan dari trunk ini adalah supaya antar ekstensi masing-masing kantor cabang bisa melakukan panggilan langsung dengan mendial nomer ekstensi yang dituju dengan mudah. Masing-masing cabang sengaja dibedakan nomer kepala ekstensinya untuk mempermudah routing panggilan (hal ini juga akan membantu routing panggilan dari prefix +62520).

Idealnya, untuk setup jaringan dengan tujuan di atas adalah seperti berikut:

TrunkEnum 004

Dengan topology di atas, maka kita tidak perlu meng-enable anonymous call di salah satu gateway Elastix. Sehingga kita tidak perlu memikirkan keamanan server Elastix lagi. Karena semua panggilan masuk dari anonymous SIP call langsung dihandle oleh gateway tersebut, selain juga bisa berfungsi sebagai lapisan keamanan jaringan VoIP kita.

Tapi bisa juga dengan cara mengatifkan salah satu Elastix IP PBX sebagai gateway untuk semua panggilan masuk dari ENUM directory. Dengan demikian server Elastix tersebut yang akan bertugas mengarahkan panggilan ke ekstensinya sendiri, atau panggilan yang ditujukan ke IP PBX lainnya. Dengan menyatukan fungsi gateway maka topologinya menjadi seperti ini:

TrunkEnum 005

Untuk setup gateway sudah pernah saya posting sebelumnya (baca tautan link). Sekarang yang kita perlu dipikirkan adalah mengarahkan panggilan DID prefix +62520 yang ditujukan ke ekstensi yang berada di IP PBX lain.

Saya mengasumsikan sebagai berikut:

  1. Server Elastix di Office A, B, dan C sudah terhubung ke IAX2 trunk. (Bisa juga terhubung dengan SIP trunk, tetapi saya lebih suka IAX2 trunk).
  2. Masing-masing ekstensi terdiri dari 4 digit dengan dibedakan kepala digitnya. Kepala 1 (1XXX) untuk Office A. Kepala 2 (2XXX) untuk Office B, dan kepala 3 (3XXX) untuk Office C). Masing2 IP PBX memiliki dialplan untuk mengarahkan panggilan ke ekstensi di IP PBX lain. Misal di Office B, memiliki dialplan 1XXX yang diarahkan ke trunk Office A, dan 3XXX untuk diarahkan ke trunk Office C.
  3. Dalam contoh ini Office B akan menjadi gateway bagi panggilan masuk dari hasil lookup query ENUM. IP PBX Office B akan bertugas mengatur panggilan masuk untuk diarahkan ke ekstensi-ekstensi di IP PBX Office A, B, dan C. Setup untuk menjadi gateway panggilan masuk dari ENUM directory bisa dibaca di sini.
  4. Dalam contoh ini, format penomorannya sebagai berikut: alokasi prefix yang didapat dari teleponrakyat.id adalah +62520364. Format pembagian prefix ke 3 kantor cabang: prefix +625203641 untuk Office A, +625203642 untuk Office B, dan +625203643 untuk Office C. Untuk panggilan, misal, ke ekstensi 3004 di Office C, maka nomer ENUM yang dialokasikan adalah +6252036433004. Misal untuk ekstensi 1027 di Office A, maka alokasinya +6252036411027, dst.
  5. Selanjutnya, tambahkan setting SIP Alias dan Outbound CID di masing-masing ekstensi yang mendapatkan alokasi nomer ENUM teleponrakyat.id. Misal di ekstensi 3027 Office C, set SIP Alias: 6252036433016. Lalui Outbound CID: +6252036433016, dst.

Setelah semua asumsi di atas terpenuhi, sekarang saatnya mengatur inbound route di IP PBX Office B (karena dalam contoh ini Office B menjadi gateway incoming call dari ENUM).

  • Masuk ke menu PBX -> PBX Configuration -> Inbound Routes -> Add Incoming Routes. Isi parameter kira-kira seperti berikut ini:
Description:  (misal) Route2OfficeC
DID Number: _625203643XXXX
Set Destination: (pilih trunk yang mengarah ke OfficeC)

Setelah itu klik Submit.

  • Lakukan hal serupa untuk yang mengarah ke Office A.
  • Test call.

Jika step-step dilakukan seperti di atas, seharusnya sudah bisa dicall dari ekstensi mana pun dengan mendial nomer, misal,  +6252036433016.

Selamat mencoba!

Bagaimana VoIP Gateway Tersambung dengan VoIP Server/IP PBX

Sepertinya perlu dibahas pemahaman dasar mengenai hubungan keduanya. Sebab beberapa kali saya menemukan pertanyaan mengenai bagaimana menyambungkan VoIP Gateway merk A, B, C dst ke VoIP Server/IP PBX. Dan proses menjawab pertanyaan tersebut menjadi panjang dan lebar dikarenakan pengguna masih terjebak dengan menu konfigurasi yang spesifik per perangkat tanpa mengetahui konsep dasarnya. Diharapkan setelah membaca ini, setidaknya jadi tau di mana permasalahan yang muncul ketika belum berhasil menyambungkan VoIP Gateway dengan VoIP Server/IP PBX.

VoIP gateway sendiri adalah sebuah perangkat yang mengubah koneksi dari jaringan telepon legacy (T1/E1/PRI) ke jaringan VoIP (SIP/H323/IAX2, dll). Dalam pembahasan di sini, saya akan mengasumsikan jaringan VoIP yang digunakan adalah SIP, dan VoIP Server/IP PBX yang akan disambungkan adalah Asterisk based (dengan FreePBX). Sedangkan konsep keseluruhan bisa diaplikasikan ke jenis VoIP gateway merek apa pun dan VoIP Server/IP PBX  jenis apa pun. Dan sebenarnya, paling bagus jika kita mau meluangkan waktu mempelajari lebih dalam cara kerja protokol SIP. Karena dengan mengetahui konsep SIP, kita tidak akan menemui masalah saat harus mengintegrasikan berbagai jenis perangkat berbasis SIP.  Tapi sebagai awalan, semoga tulisan ini cukup membantu.

Bagaimana Cara Kerjanya?

Jika kita hendak menyambungkan sebuah VoIP gateway dengan Asterisk PBX, maka kedua perangkat ini perlu ‘mengenal’ satu sama lain, dengan cara melalui autentikasi. Jika autentikasi sudah terjadi, maka Asterisk PBX akan memperbolehkan panggilan masuk atau keluar dari dan ke  VoIP gateway, begitu juga sebaliknya. Tidak masalah dari mana ke mana arah autentikasi ini. Bisa dari Asterisk ke VoIP gateway (karena ada VoIP gateway yang menyediakan autentikasi juga), atau sebaliknya. Yang paling umum memang VoIP gateway yang melakukan autentikasi ke Asterisk PBX. Untuk VoIP gateway supaya bisa melakukan autentikasi ke Asterisk PBX, biasanya ada menu semacam SIP settings,  SIP domain setting, domain realm setup, Domain Service, dll. Jika autentikasi sudah terjadi, maka Asterisk PBX akan memperbolehkan panggilan masuk atau keluar dari dan ke  VoIP gateway, begitu juga sebaliknya.

Jika VoIP gateway melakukan autentikasi ke Asterisk PBX, kita perlu menentukan SIP typenya. Ada 3 SIP type di Asterisk PBX, yaitu peer, user, dan friend. Perbedaannya akan saya jelaskan dengan contoh ketika menambahkan VoIP gateway ke sip.conf atau sip_custom.conf (untuk distro yang menggunakan FreePBX, menambahkan autentikasi manual di sip_custom.conf jika tidak ingin konfigurasi dioverride oleh FreePBX).

[NAMA_VOIP_GATEWAY]
deny=0.0.0.0/0.0.0.0
context=from-internal
host=dynamic
type=&lt;peer,user,atau friend&gt; 
port=5060
qualify=yes
permit=x.x.x.x/y.y.y.y

Asterisk PBX akan melakukan match call (supaya panggilan dari VoIP gateway diterima) dengan :

  • peer jika bagian permit sesuai dengan ip address VoIP gateway yang digunakan untuk registrasi.
  • user jika bagian nama VoIP gateway dalam square bracket sesuai dengan From dalam packet INVITE SIP.
  • friend jika Asterisk memperbolehkan kedua type di atas sekaligus (peer dan user) untuk melakukan match call dari VoIP gateway.

Apabila match call terpenuhi, maka panggilan dari VoIP gateway akan diproses oleh Asterisk PBX sesuai dengan context.

Jika keduanya sudah saling ‘mengenal’ dengan cara di atas, maka selanjutnya perlu dilakukan routing panggilan. Routing panggilan ini punya sebutan yang bermacam-macam. Kalau di Asterisk biasanya kita sebut sebagai dialplan. Di beberapa tipe VoIP gateway punya istilah lain lagi. Ada yang menyebut sama sebagai dialplan, ada yang menyebut dialrule, routeplan, callroute, route call, dial pattern, dan banyak lagi. Tapi jika sudah tau cara dasar kerjanya, secara intuitive kita akan mengenali fungsi tersebut, walaupun dengan istilah yang baru/lain.

Dari sisi Asterisk PBX, kita perlu membuat dialplan, untuk mengatur kategori panggilan yang perlu diarahkan ke VoIP gateway. Biasanya panggilan yang diarahkan ke VoIP gateway ini adalah panggilan ke jaringan telepon PSTN atau PLMN (untuk jaringan mobile). Setelah dialplan disetup, lalu kita juga perlu melakukan routing panggilan di VoIP gateway, supaya ketika  menerima routing call dari Asterisk PBX, VoIP gateway tau bagimana mengarahkan panggilan tersebut. Begitu juga sebaliknya, ketika ada panggilan masuk dari jaringan PSTN ke VoIP gateway, perlu ditentukan juga ke mana arah panggilan tersebut hendak dilempar.

“Kenapa perlu diatur ke mana mengarahkan panggilan? Kan sudah pasti dari VoIP Gateway ke Asterisk PBX, dan sebaliknya?”

Perlu kita ingat juga, kadang Asterisk PBX bisa tersambung ke lebih dari satu VoIP Gateway, dan sebaliknya, sebuah VoIP gateway bisa tersambung ke lebih dari satu VoIP Server/IP PBX. Ada pola dial tertentu yang harus diarahkan ke route yang berbeda. Contohnya adalah panggilan dengan prefix. Jika kita mendial dengan awalan 9, maka akan diarahkan ke VoIP gateway A. Jika diawali dengan 8, maka diarahkan ke VoIP gateway B, dst. Atau jika kita menerima panggilan yang masuk dari PSTN ke VoIP gateway dengan nomer 1234567, maka diarahkan IP PBX A, lalu panggilan ke nomer telepon PSTN 7654321 diarahkan ke IP PBX B, dst.

Satu hal yang sedikit membingungkan dalam setup routing panggilan adalah arah inbound call dan outbound call di VoIP gateway jika tersambung ke Asterisk PBX. Yang dimaksud inbound call adalah panggilan ke VoIP gateway dari Asterisk PBX, bukan dari port PSTN. Begitu juga dengan outbound call. Yang dimaksud outbound call di sini adalah call dari arah VoIP gateway ke Asterisk PBX, bukan ke arah port PSTN.

Saya membahas perbedaan ini karena banyak yang membandingkan dengan arah panggilan Asterisk PBX, yaitu inbound call itu sudah pasti panggilan masuk dari jaringan luar ke ekstensi lokal Asterisk PBX dan outbound call itu panggilan ke luar, baik PSTN maupun VoIP trunk.

Lalu untuk mengatur panggilan dari dan ke port PSTN, biasanya VoIP gateway menyediakan menu pengaturan sendiri, semacam phonecall setting, call service, call setting dll. Nah, di sini ada hal yang sedikit ruwet. Terkadang VoIP gateway menggunakan pengaturan pola nomer dengan cara spesifik produk/aturan main mereka sendiri. Ini yang mau tidak mau kita harus mencari user manual produk tersebut. Misal untuk produk VoxStack (OpenVOX),  pengaturan patternnya masih mirip dengan Asterisk, menggunakan notasi X, N dan Z. Sedangkan untuk produk planet, akan berbeda lagi. Bahkan ada yang menggunakan Perl Regex (bisa ditemui di produk-produk telephony-nya Cudatel). Sekedar tambahan saja, jika kita sudah terbiasa dengan notasi Asterisk, ada baiknya jika mencari produk VoIP gateway yang berbasis Asterisk juga. Produk demikian ada di pasaran. Di antaranya Portech dan VoxStack. Dan pastinya lebih banyak lagi, tapi sejauh ini yang pernah saya tangani langsung baru dua perangkat tersebut. Ada baiknya melihat manual-nya terlebih dahulu sebelum membeli.

Dari keterangan di atas, maka bisa disimpulkan dengan  gambar diagram berikut:

voip gateway 01

Jika sudah memahami gambaran besar koneksi antara Asterisk PBX dan VoIP gateway di atas, maka nanti yang paling sulit adalah bagian memelototi menu-menu setting VoIP gateway. 😀

Selamat mencoba!

Tautan Lain

IPTables untuk Asterisk Based IP PBX

Sampai saat ini masih ada rekan-rekan sysadmin yang memasang IP PBX (terutama Asterisk based) dengan menggunakan ip public langsung. Dan agak mengkhawatirkan lagi IP PBX tersebut tersambung ke jaringan telepon umum. Beberapa kali muncul kasus kebobolan yang menyebabkan mereka diharuskan membayar penggunaan telepon mencapai puluhan bahkan ratusan juta. Ada banyak alasan kenapa rekan-rekan masih harus memasang ip public langsung ke IP PBX, di antaranya karena topology dan alokasi ip address yang tidak memungkinkan DMZ, permasalahan VoIP jika harus dilewatkan NAT/port forward, dan lain sebagainya. Terlepas dari hal tersebut, sangat disarankan untuk melindungi IP PBX sebaik mungkin termasuk meletakannya di dalam IP PBX. Jika memang terpaksa harus meletakkan nya dengan ip public, maka berikut template IPTables yang bisa digunakan untuk mengurangi resiko kebobolan (tapi mohon diingat, cara ini bukan obat manjur untuk menahan penetrasi):

#!/bin/bash
# cwd=/etc/sysconfig/
#

#VARS
EXTIF=”eth0″
INTIF=”eth1″

# flush all existing rules and chains
iptables -F
iptables -X

# allow inbound ssh connection on external/public interface
iptables -A INPUT -p tcp –dport 22 –sport 1024:65535 -m state –state NEW,ESTABLISHED -j ACCEPT

# set default policies (allow any outbound, block inbound, restrict forwarding between interfaces)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Allow TCP 80 and 443
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
iptables -A INPUT -p tcp –dport 443 -j ACCEPT

# Allow RTP traffic
iptables -A INPUT -p udp –dport 10000:20000 -j ACCEPT

# Allow SIP traffic
iptables -A INPUT -p tcp –dport 5060 -j ACCEPT
iptables -A INPUT -p udp –dport 5060 -j ACCEPT

# allow all inbound traffic coming in on loopback and the internal/private interfaces
#iptables -A INPUT -i $INTIF -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# allow your home / office ip
iptables -A INPUT -i $INTIF -s XXX.XXX.XXX.XXX/XX -j ACCEPT
iptables -A INPUT -i $INTIF -s XXX.XXX.XXX.XXX/XX -j ACCEPT

# allow inbound traffic for established connections on external/public interface
iptables -A INPUT -i $EXTIF -m state –state ESTABLISHED,RELATED -j ACCEPT

# block packets coming in with invalid source ips
iptables -A INPUT -i $EXTIF -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $EXTIF -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $EXTIF -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $EXTIF -s 224.0.0.0/4 -j DROP
iptables -A INPUT -i $EXTIF -s 240.0.0.0/5 -j DROP
iptables -A INPUT -i $EXTIF -s 0.0.0.0/8 -j DROP
iptables -A INPUT -i $EXTIF -s 169.254.0.0/16 -j DROP
iptables -A INPUT -i $EXTIF -s 127.0.0.0/8 -j DROP

# ICMP
iptables -A INPUT -p icmp –icmp-type echo-request -m limit –limit 1/sec -j ACCEPT

# SYN flood limiter
iptables -A INPUT -p tcp –syn -m limit –limit 5/s -j ACCEPT

# catch-all for end of rules
# LOG and DENY other traffic to help identify additional filters required
iptables -A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level debug
iptables -A INPUT -j REJECT –reject-with icmp-host-prohibited

# Save settings
#
# On CentOS / Fedora this will output the current IPTables to the stdout, which we can pipe to a file that sets these on boot
iptables-save > /etc/sysconfig/iptables
#
# List rules
#
iptables -L -v

Edit file tersebut sesuai dengan kondisi server masing-masing. Di sini saya mengasumsikan menggunakan dua interface. Berikut ini beberapa hal yang bisa ditambahkan untuk mengurangi resiko kebobolan

  • Gunakan dua interface LAN. Satu interface terpasang ip public dan interface lain terpasang ip address private untuk ke LAN. Biasanya saya hanya memperbolehkan Web GUI, dan SSH hanya bisa diakses dari LAN. Jika saya sedang tidak berada satu lokasi dengan server tersebut, saya mengaksesnya melalui VPN yang tersambung ke jaringan LAN.
  • set PermitRootLogin=no untuk ssh, dan buat akun shell tambahan yang dimasukkan list sudo supaya bisa melakukan aktifitas administrasi server.
  • Ubah port ssh dan web UI ke port lain yang hanya kita ketahui (misal 8241, 9231, dst), dan tetap difilter dengan IPTables.
  • Menambahkan setting httpd.conf misal:

<Directory>


Deny from all

Allow from 1.2.3.4

Allow from 6.7.8.0/24

Allow from 192.168.1.0/24

Allow from 10.0.0.0/24

Allow from 172.16.0.0/24

</Directory>

  • Bila perlu, block MySQL dari semua interface kecuali interface loopback/localhost.
  • Menambahkan fail2ban lebih bagus lagi.

Intinya, jadilan super paranoid jika berurusan dengan IP PBX terlebih yang tersambung ke jaringan telepon umum.

Mencoba ENUM dari E164.ID Di Elastix

Bagi yang belum paham betul apa itu ENUM (E164 Number Mapping), bisa mencari informasinya di link berikut ini:

Intinya E164.ID ini menjadi direktori nomer telepon dan bisa menjadi penghubung  semua pengelola VoIP server yang ingin bergabung membentuk komunitas VoIP. Untuk mendapatkan blok nomer telepon ini, bisa didapatkan dengan mendaftar di TELEPONRAKYAT.ID. Di web tersebut kita bisa mendaftar sebagai Gateway (jika kita memiliki VoIP server sendiri), atau cukup mendaftarkan domain/realm saja (jika kita tidak memiliki/mengelola VoIP server sendiri). Sedangkan untuk diskusi lebih lanjut mengenai E164.ID ini bisa bergabung di forum ASTERISK.ID .

Oh ya, sebelum kita berpikir bahwa blok nomer yang kita dapatkan dengan mendaftar di TELEPONRAKYAT.ID bisa berkomunikasi dengan nomer telepon regular, perlu disampaikan bahwa E164.ID belum melakukan interkoneksi ke jaringan telepon PSTN maupun PLMN. Untuk pengguna VoIPRakyat sudah bisa menikmati panggilan dengan menggunakan nomer E164.ID. Bagi yang mau coba, bisa kontak nomer demo +62520291901 (time announcement), +62520291902 (monkey), atau di +62520291903 (echo test).

Mendaftar di TELEPONRAKYAT.ID

Sebelum melanjutkan setup, kita terlebih dahulu harus mendaftar ke TELEPONRAKYAT.ID untuk mendapatkan nomer telpon/prefix dari E164.ID. Untuk cara mendaftar silahkan baca dengan mendownload file .pdf di sini. Dengan asumsi bahwa kita sudah memiliki server Elastix, maka daftar di bagian Manage Gateway. Di sini kita akan mendapatkan alokasi prefix nomer, contoh, prefix nomer yang saya dapatkan adalah +62520-364. Setelah mendaftar, tunggu sekitar 15 menit untuk bisa melakukan lookup di E164.ID. Caranya adalah dengan menjalankan perintah berikut di shell  prompt linux:

$ dig +short *.4.6.3.0.2.5.2.6.e164.id NAPTR

jika semua berjalan lancar maka outputnya seperti :

10 1 "u" "E2U+sip" "!^\\+?(.*)$!sip:\\1@sip.domain.tld!" .

Argument untuk dig di atas diambil dari digit prefix yang kita dapat, lalu hilangkan tanda ‘+’, setelah itu urutan dibalik dari depan ke belakang, dengan masing-masing digit dipisah tanda titik. Pada ujung sebelah kiri adalah wildcard (asterisk), artinya berapapun nomer berikutnya, asalkan prefixnya adalah alokasi prefix tersebut. Untuk keterangan hasil dig, digit pertama (10) adalah priority, lalu digit berikutnya adalah weight (1), baris berikutnya adalah protokol yang digunakan yaitu UDP (untuk U), dan SIP. Sedangkan yang terkakhir adalah format URI yang didapatkan dengan regular expression.

Elastix Setup

Berhubung saya setiap hari menggunakan Elastix maka contoh setup  berikut ini menggunakan distro tersebut. Karena distro tersebut pada dasarnya menggunakan FreePBX, maka setupnya tidak banyak  berbeda bila menggunakan distro FreePBX, AsteriskNow, trixbox, Briker, dkk. Stepnya adalah sebagai berikut:

  • Dari baris Tab di menu utama, pilih tanda panah paling kanan untuk memunculkan menu dropdown, lalu pilih Security -> Advanced Settings lalu aktifkan slide button untuk Enable anonymous SIP calls. 001002
  • Selanjut pilih menu PBX -> PBX Configuration -> Trunks -> Add ENUM Trunk. Beri nama Trunk di bagian Trunk Name, misal E164.ID,  lalu klik Submit Change.003
  • Pilih menu PBX -> PBX Configuration -> Outbound Routes -> Add Route. Di bagian Route Name, isikan nama untuk route ini, misal Outbound_ENUM, lalu isikan dial patterns seperti berikut:004
  • jangan lupa di bagian Trunk Sequence for Matched Routes pilih E164.ID (sesuai nama trunk yang sudah kita buat sebelumnya), dan klik Submit Changes.
  • Sebelum melanjutkan menambahkan Inbound Routes, ada baiknya kita melakukan edit file /etc/enum.conf. Saya lebih suka menghapus semua isi file tersebut dan cukup diisi dengan  :
search => e164.id
  • Lalu edit file /var/lib/asterisk/agi-bin/enumlookup.agi :
$ sudo chmod a+w /var/lib/asterisk/agi-bin/enumlookup.agi
$ sudo vi /var/lib/asterisk/agi-bin/enumlookup.agi

di bagian baris:

$enums = Array('e164.org','e164.arpa','e164.info');

menjadi:

$enums = Array('e164.id');

setelah menyimpan perubahan, jangan lupa mengembalikan mode file supaya tidak ditimpa ulang oleh system:

$ sudo chmod a-w /var/lib/asterisk/agi-bin/enumlookup.agi
  • Selanjutnya kita perlu menambahkan realm ke Elastix. Realm adalah nama domain gateway yang kita daftarkan ke TELEPONRAKYAT.ID. Sebagai awalan, ada baiknya jika nama realm sesuai dengan FQDN (contoh sip.domain.tld) server Elastix. Karena jika realm tidak sama dengan FQDN server, misal domain.tld, maka kita perlu menambahkan entry SRV ke DNS. Secara default, realm Elastix adalah “asterisk”. Untuk menggantinya, masuk ke menu PBX -> Tools -> Asterisk File Editor, lalu edit file sip_general_custom.conf dan tambahkan baris:
realm=sip.domain.tld

Klik Save lalu klik Reload Asterisk.

  • Buat satu extensi (misal 1001). Lalu registrasi melalui SIP phone (cara menambahkan extensi tidak akan dibahas di sini). Di bagian SIP Alias (masih di halaman pembuatan extensi), tambahkan alokasi nomer dari teleponrakyat.id, misal 6252036411001.  Setelah itu klik Submit.       SIP alias
  • Optional, tambahkan juga pada Outbound CID dengan nomer alokasi di atas lengkap dengan tanda +, menjadi: +6252036411001. Tujuannya supaya ketika kita melakukan panggilan ke gateway lain, nomer telpon yang muncul adalah nomert telpon Outbound CID tersebut, bukan nomer ekstensi.
  • Edit file /etc/asterisk/extensions.conf melalui web (karena jika tidak akan dioverride ketika system reload), dan edit bagian context from-sip-external. Default dari context tersebut seperti berikut:
[from-sip-external]
exten => _.,1,NoOp(Received incoming SIP connection from unknown peer to ${EXTEN})
exten => _.,n,Set(DID=${IF($["${EXTEN:1:2}"=""]?s:${EXTEN})})
exten => _.,n,Goto(s,1)
...
...

edit menjadi:

[from-sip-external]
exten => _.520364XXXXX,1,NoOp(Received incoming SIP connection from unknown peer to ${EXTEN})
exten => _.520364XXXXX,n,Set(DID=${IF($["${EXTEN}"=""]?s:${EXTEN})})
exten => _.520364XXXXX,n,Goto(s,1)
...
...

Pola _.520364XXXXX menyesuaikan prefix yang dialokasikan ke getway kita. Tujuan dari editing ini adalah untuk mengurangi panggilan dari source-source yang tidak dikenal karena kita memperbolehkan anonymous SIP call. Jika tidak kita ubah demkian, maka ekstensi kita akan mendapatkan banyak sekali telepon masuk dari nomer-nomer acak. Karena file extensions.conf ini tidak begitu banyak berubah/diedit oleh system (seperti extensions_additional.conf misalnya), maka lebih baik jika kita non aktifkan akses write ke file tersebut dengan perintah:

root# chmod a-w /etc/asterisk/extensions.conf

Dengan demikian file tersebut tidak akan bisa ditimpa secara tidak sengaja dan menyebabkan panggilan masuk dari URI tak dikenal (selain yang terdaftar di E164.ID) bisa lewat lagi.

  • Test call (di contoh ini saya coba test call dari nomer VoIP Rakyat) misal tidak ada kendala akan seperti ini:005Screenshot_2016-01-23-03-40-04
  • Setup firewall supaya server VoIP/IP PBX tetap aman. Contoh setup firewall bias dibaca di sini .
  • Aktifkan fail2ban (biasanya secara default sudah ada di instalasi Elastix), tinggal mengedit logpath diarahkan ke /var/log/asterisk/full (defaultnya ke /var/log/asterisk/messages) di dalam file jail.conf, lalu ubah alamat penerima dan pengirim email notifikasi. Hal ini untuk menambahkan layer keamanan di Asterisk.

Tambahan

Jika melihat CDR dari menu Reports, kita masih akan melihat banyak sekali log percobaan panggilan yang dilewatkan ke Elastix dari source-source tidak dikenal seperti ini:

007

walaupun sebenarnya tidak ada panggilan yang berhasil dilakukan, tapi log seperti ini akan tetap memenuhi CDR kita. Untuk menghindari hal ini bisa ditambahkan custom context di extensions_custom.conf seperti berikut:

[from-pstn-custom]
include => ext-did-catchall-custom
exten => s,1,Noop(No DID or CID Match)
exten => s,n,Hangup

[ext-did-catchall-custom]
exten => s,1,Noop(No DID or CID Match)
exten => s,n,Hangup

Klik Save dan Reload Asterisk.

Selamat mencoba!

[Kazoo] Problem Pergantian RabbitMQ Server

Karena sesuatu hal, saya harus mengubah topologi Kazoo, terutama server RabbitMQ yang menggunakan ip public menjadi ip private. Dan ternyata penggantian tersebut tidak mudah. Setelah dijalankan, WhistleApps masih mencari server AMQP lama, dan karena server tersebut sudah tidak ada, maka muncul error econnrefused seperti di bawah ini:

Jan 4 17:35:05 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:06 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:07 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:08 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:09 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:10 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused

Untuk mengatasi hal ini, maka broker harus dihilangkan secara manual dengan perintah:

root# sup whistle_amqp_maintenance remove_broker “amqp://guest:guest@1.2.3.4:5672”

Lalu tambahkan broker baru, misal:

root# sup whistle_amqp_maintenance add_connection “amqp://guest:guest@6.7.8.9:5672”

Dengan langkah tersebut, seharusnya broker sudah terarah ke server yang baru.