[TIPS] Error Create Database OpenSIPS Dengan “opensipsdbctl create”

Baru iseng-iseng nguprek OpenSIPS, pada saat create database dengan tool opensipsdbctl create, saya mendapatkan error berikut:

error:
RROR 1101 (42000) at line 2: BLOB, TEXT, GEOMETRY or JSON column 'extra_hdrs' can't have a default value
ERROR: Failed to create presence tables!

Setelah baca sana sini, ada petunjuk bahwa sql-mode di server memiliki setting STRICT_TRANS_TABLE (ndak tau juga ini apa, mau browse kok malah nanti repotnya jadi distraksi ke mana mana). Yang kemudian saya lakukan adalah masuk ke console mysql dan menjalankan perintah berikut:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SET @@GLOBAL.sql_mode ='';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Sebagai catatan saja, sebelum saya kosongkan isi dari GLOBAL.sql_mode adalah:

mysql> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Dan setelah dikosongkan:

+-------------------+
| @@GLOBAL.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)

Berikutnya dicoba lagi menjalakan perintah opensipsdbctl create :

root# opensipsdbctl create
MySQL password for root:
INFO: test server charset
INFO: creating database opensips ...
INFO: Using table engine InnoDB.
INFO: Core OpenSIPS tables successfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into opensips ...
INFO: Presence tables successfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute userblacklist b2b cachedb_sql registrant call_center fraud_detection emergency? (y/n): y
INFO: creating extra tables into opensips ...
INFO: Extra tables successfully created.

Done.

Link:

[TIPS] Menambah Rule Blocking Unauthorized Call Attempt Di Kamailio

Suatu pagi kebangun gara-gara laper. Sambail makan, sambil buka Homer Capture Server, nemu log unauthorized call seperti ini banyak sekali:

Click detail CallID:

Sebenarnya sudah ada module antiflood pike.so, cuma saya orangnya risih ngelihat seperti ini sempet lewat di log. Akhirnya saya tambahkan rule berikut di SIP Server Kamailio:

Di bagian route utama :

route{
    ...
    # bantai dulu, check belakangan
    route(SECURITY_CHECKS);
    ...
}

Kemudian di subroute:

#bantai dulu, check belakangan.
route[SECURITY_CHECKS] 
{
    if (is_method("INVITE|REGISTER")) {
        if($ua =~ "(friendly-scanner|sipvicious)") {
            xlog("L_INFO","Scanner dari  $si. ");
            exit;
        }

        # nemu $fU trunk di Homer:
        if($fU =~ "(trunk)") {
            xlog("L_INFO","calls attempt from bogus $si . Blocked! Tanpa tabayyun!");
            exit;
        }
    }
}

Rule di atas akan melakukan drop transaction ketika menemukan parameter User Agent bernama friendly-scanner atau sipvicious. Selain itu juga akan ngeblok from user dari header FROM SIP packet bernama “trunk” yang barusan tadi ketemu di log Homer.

Selanjutnya tinggal reload Kamailio dan tunggu hasilnya, dan bener saja, di log langsung muncul:

Nov 14 04:44:36 ss kamailio[11188]: INFO:  calls attempt from bogus 185.107.83.130 . Blocked! Tanpa tabayyun!
Nov 14 04:50:10 ss kamailio[11171]: INFO:  calls attempt from bogus 185.107.83.132 . Blocked! Tanpa tabayyun!
Nov 14 05:04:19 ss kamailio[11172]: INFO:  calls attempt from bogus 185.107.83.130 . Blocked! Tanpa tabayyun!

Kalau mau lebih kreatip lagi, log tersebut bisa ditambahkan di regex fail2ban, dan ketika sudah muncul sekian kali bisa langsung diblok permanen. Tapi tidak saya bahas dulu di sini, mungkin besok-besok.

Dan kalau masih bingung dengan variable $fU, $si, $ua dst, itu adalah pseudo variable dari Kamailio, yang listnya bisa dilihat di :

https://www.kamailio.org/wiki/cookbooks/4.2.x/pseudovariables

 

Homer Untuk SIP dan RTP Monitoring/Troubleshoot

Membaca log pada saat troubleshoot VoIP berbasis SIP itu penting, tapi masih juga banyak yang malas melakukan hal tersebut. Bisa dimaklumi karena memang membaca log SIP itu beneran ribet, walaupun sebenarnya cukup dengan merunut Call-ID problem langsung bisa ketahuan. Jika di sebuah lingkungan dengan jumlah panggilan sedikit, hal ini tidak menjadi masalah, karena jumlah log SIP tidak begitu banyak dan bisa langsung teridentifikasi permasalahannya. Tapi jika dalam lingkungan call yang berjumlah banyak, misal di sebuah VoIP provider, membaca log akan menjadi sangat merepotkan. Sering kali kita harus meminta pelanggan untuk melakukan test call lagi hanya demi mendapatkan log. Sedangkan sebagai pelanggan, ogah banget kan disuruh ini itu hanya karena si provider tidak punya catatan log pada saat problem terjadi.

Log SIP itu benar-benar chatty. Banyak banget. Dalam satu kali sesi bisa sampai dengan ratusan baris. Jadi kalo ada problem 1 jam sebelumnya, pada saat kita check log, sudah terdapat ribuan baris log menumpuk dari panggilan yang lain. Untuk mempermudah melakukan troubleshoot ini, kita bisa memanfaatkan tool lain seperti Homer SIP Capture.

Cara Kerja

Homer terdiri dari Capture Server dan Capture agent. Capture server merupakan server sipcapture berbasis Kamailo / OpenSIPS yang menerima kiriman HEP, IPIP ataupun raw packet dari HEP agent/Capture agent. Beberapa software telephony sudah memiliki implementasi capture agent seperti FreeSWITCH (versi 1.6.8 ke atas), Asterisk (versi 13 ke atas), Kamailio dan OpenSIPS. Lalu untuk perangkat lain yang tidak memiliki implementasi capture agent, tetap bisa memanfaatkannya dengan cara memasang sebuah server (berbasis Linux) dengan capture agent, lalu salah satu interface nya tersambung ke  port mirror perangkat SIP lain. Semua paket SIP yangt tertangkap capture agent akan dikirimkan ke Capture Server untuk kemudian disimpan dan dianalisa jika terjadi problem.

Berikut ini gambaran topologi dari yang saya embat dari https://github.com/sipcapture/homer :

Capture Server:

 

Capture agent:

Instalasi/Setup

Lalu berikutnya mari kita setup Capture Server terlebih dahulu:

  • Paling enak menurut saya kalau Capture Server jalan di Debian 8 Jessie 64 bit. Jadi silahkan disiapkan. Server distro lain harusnya tidak masalah, tapi pas saya install di Centos 7, saya stuck di MySQL. Walaupun problemnya sebenarnya jelas, tapi sayanya yang malas troubleshoot karena dikejar waktu.
  • Ada 4 cara install Homer 5, ini yang bisa dilihat di sini, tapi cara yang paling saya sukai adalah cara pertama, yaitu menggunakan install script. Jalankan step di bawah ini:
root~# cd /usr/src
root~# wget https://cdn.rawgit.com/sipcapture/homer-installer/master/homer_installer.sh
root~# chmod +x homer_installer.sh
root~# ./homer_installer.sh
  • Pada saat proses instalasi, kita akan ditanyakan nama database, user dan password user database untuk akses database Homer. Nama database saya pilih default, yaitu homer, dan passwordnya tentu saja saya isikan berbeda. Script di atas akan menginstall Kamailio dengan module sipcapture.so, jika penasaran bagaimana cara penggunaannya silahkan lihat di kamailio.cfg. Selain itu script ini juga akan menambahkan direktori web di /var/www/html/homer. Web tersebut langsung bisa diakses dengan username admin dan password : test1234. Sangat disarankan untuk segera mengganti password ini begitu login. Jika instalasi berhasil secara keseluruhan, akan nampak informasi seperti berikut:
*************************************************************
    ,;;;;,
   ;;;;;;;;.  Congratulations! HOMER has been installed!
 ;;;;;;;;;;;;
 ;;;; ;; ;;;; <--------------- INVITE --------------- 
 ;;;; ;; ;;;; --------------- 200 OK --------------->
 ;;;; .. ;;;;
 ;;;;    ;;;; Your system should be now ready to rock!
 ;;;; ;; ;;;; Please verify/complete the configuration
 ,;;; ;; ;;;; files generated by the installer below.
 ;;;;;;;;;;;;
  :;;;;;;;;;  THIS SCRIPT IS PROVIDED AS-IS, USE AT
   ;;;;;;;;   YOUR *OWN* RISK, REVIEW LICENSE &amp; DOCS

*************************************************************

* Verify configuration for HOMER-API:
 '/var/www/html/homer/api/configuration.php'
 '/var/www/html/homer/api/preferences.php'

* Verify capture settings for Homer/Kamailio:
 '/etc/kamailio/kamailio.cfg'

* Start/stop Homer SIP Capture:
 '/sbin/kamctl start|stop'

* Access HOMER UI:
 http://1.2.3.4
 [default: admin/test1234]

* Send HEP/EEP Encapsulated Packets:
 hep://1.2.3.4:9060

**************************************************************

IMPORTANT: Do not forget to send Homer node some traffic! 😉
 For our capture agents, visit http://github.com/sipcapture
 For more help and information visit: http://sipcapture.org

**************************************************************
 Installer Log saved to: /tmp/homer_installer.sh.6095.log

Selanjutnya adalah bagaimana setup Capture agent. Kebetulan yang akan dimonitor adalah server FreeSWITCH v1.6.19. Ada dua cara untuk melakukannya, yang pertama dengan mengaktifkan capture agent bawaan dari FreeSWITCH. Caranya:

  • Tambahkan ip address Homer di sofia.conf.xml (misal: 1.2.3.4 port 9060) dengan menambahkan baris berikut di global_settings:
<param name="capture-server" value="udp:1.2.3.4:9060"/>
  • Lalu buka sip profiles yang hendak dimonitor. Dalam instalasi FreeSWITCH biasanya sudah ada default sip profile, misal, internal.xml, tambahkan baris berikut
<param name="sip-capture" value="no"/>
  • Setelah perubahan di atas disimpan, reload sip profile dari fs_cli dengan perintah:
freeswitch@localhost> sofia profile internal restart
  • Aktifkan HEP agent melalui fs_cli dengan perintah:
freeswitch@localhost> sofia profile internal capture on

 

Cara kedua adalah dengan menginstall Captagent di server yang sama dengan FreeSWITCH. Langkahnya adalah sebagai berikut:

  • Karena FreeSWITCH saya berjalan di atas Centos 7, maka perlu ditambahkan package berikut:

yum -y install json-c-devel expat-devel libpcap-devel flex-devel automake libtool bison libuv-devel flex

  • Clone captagent  dan install:
cd /usr/src
git clone https://github.com/sipcapture/captagent.git captagent
cd captagent
./build.sh
./configure
make && make install
  • Setelah selesai menjalankan script di atas, lokasi default konfigurasi berada di /usr/local/captagent/etc/captagent. File pertama yang perlu diedit adalah file protocol_sip.xml. Edit bagian enable=”false” menjadi enable=”true”
<profile name="proto_sip" description="PROTO SIP" enable="true" serial="2014010402">
  • Kemudian edit file transport_hep.xml untuk diaktifkan dan dicantumkan alamat ip server Homer/Capture Server seperti berikut:
<profile name="hepsocket" description="Transport HEP" enable="true" serial="2014010402">
            <settings>
                <param name="version" value="3"/>
                <param name="capture-host" value="1.2.3.4"/>
                <param name="capture-port" value="9060"/>
  • Untuk memudahkan startup captagent di Centos 7, salin file startup dan jalakan perintah berikut ini :
root~# cp /usr/src/captagent/init/el/7/captagent.service /usr/lib/systemd/system/captagent.service
root~# cp /usr/src/captagent/init/el/captagent.sysconfig /etc/sysconfig/captagent
root~# systemctl enable captagent
root~# systemctl start captagent
  • Login ke web Homer dan lakukan test call melalui server FreeSWITCH tersebut, tunggu beberapa saat, maka kita bisa mendapatkan log sepert berikut:

Banyak sekali yang bisa diexplore dari hasil log ini yang tidak bisa dibahas semua dalam satu postingan. Nanti kapan-kapan saya posting lagi cara memanfaatkan Homer lebih jauh. Setidaknya dari hasil log di atas saya bisa melakukan troubleshoot dengan merunut Call-id tanpa harus melototin file log dalam mode text:

Jika hendak mencari sebuah panggilan gagal, saya tinggal click reply code panggilan dari Leg A ke Leg B di jam yang disebutkan pada saat terjadi problem, misal, pada tanggal 11 November 2017 pukul 8.45 – 8.50 pelanggan anu mengalami gagal ke nomer tertentu. Saya bisa mengisi kolom search :

Lalu hasilnya ternyata ada log seperti ini:

Hanya perlu click pada kolom CallID di atas saya mendapatkan detail sesi.

Banyak sekali yang bisa dieksplore di sini, dan saya masih belom mendapatkan semuanya. Untuk lebih detail bagaimana memanfaatkan

Kelebihan Setup CaptAgent Server Tersendiri

Seperti yang telah dibahas di atas, agent bisa diaktifkan di aplikasi SIP yang sudah support seperti FreeSWITCH ver 1.6.8 ke atas, Asterisk versi 13 ke atas, Kamailio dan OpenSIPS.

Lalu bagaimana jika perangkat SIP yang tidak support sipcapture/Captagent seperti AudiCode, Sonus, atau bahkan Asterisk versi 11 ke bawah?

Gampang. Install Captagent di server tersendiri dengan minimal dua interface. Satu interface tanpa ip address dengan mode promiscuous  digunakan untuk menerima raw packet dari port mirror perangkat SIP yang sedang dimonitoring. Switch tentunya harus manageable. Lalu interface satunya lagi digunakan untuk mengirim paket HEP/EEP ke server Homer. Topologi nya kira-kira seperti ini (gambar saya ambil dari https://github.com/sipcapture/captagent):

HomerFlow

 

Links

 

 

Codec G729 Di FreeSWITCH Dengan mod_bcg729

Akhir-akhir ini jadi kudet karena banyak hal yang harus dikerjakan, termasuk kudet dalam berita bahwa pemilik lisensi G729 memasukkan codec ini ke Royalty Free license per tanggal 1 Januari 2017. Artinya kedepan akan banyak pengembang library untuk codec ini supaya bisa digunakan di platform opensource telephony. Salah satunya yang sudah dipakai di kantor adalah mod_bcg729 (yang merupakan modifikasi dari mod_fsg729, hanya saja semua code dari Intel dimodifikasi dan dibuang). Codec diambil dari http://www.linphone.org/eng/documentation/dev/bcg729.html, jadi pastikan pada saat instalasi mod_bcg729 berikut ini, mesin dalam kedaan tersambung ke internet, karena pada saat proses instalasi akan mendowload source bcg729.

Berikut ini adalah cara instalasi codec G729 di SBC FreeSWITCH:

  1. Pastikan FreeSWITCH bisa terkoneksi dengan internet. Login ke FreeSWITCH lalu masuk ke direktori /usr/src
  2. Jalankan perintah: git clone https://github.com/xadhoom/mod_bcg729.git
  3. Masuk ke direktori /usr/src/mod_bcg729 lalu edit file Makefile, tambahkan direktori include di baris FS_INCLUDES  dan direktori modules di baris FS_MODULES. Contoh di server yang saya tangani:
    ################################
    ### FreeSwitch headers files found in libfreeswitch-dev ###
    FS_INCLUDES=/usr/include
    FS_MODULES=/usr/lib64/freeswitch/mod
    ################################
  4. Save hasil editan tersebut lalu jalankan perintah: make
  5. Jika tidak ada error, lanjutkan dengan perintah: make install
  6. Edit file  autoload_configs/modules.conf.xml, edit baris mod_g729 menjadi mod_bcg729. Lalu save.
  7. Reload FreeSWITCH
  8. Pastikan codec tersebut sudah diload otomatis oleh FreeSWITCH dengan menjalankan perintah : show codec di dalam fs_cli yang akan muncul baris seperti:
    codec,G.729,mod_bcg729
  9. Jika belum juga muncul, bisa lakukan load manual di dalam fs_cli dengan perintah: load mod_bcg729
  10. Test panggilan dengan memaksa SIP client menggunakan hanya codec G729, jika berhasil maka SDP pada SIP INVITE dan 200 OK akan tampak seperti
    INVITE SDP:
    ...
    a=rtpmap:18 G729/8000
    a=fmtp:18 annexb=no
    a=rtpmap:101 telephone-event/8000
    ...
    200 OK SDP:
    ...
    m=audio 31910 RTP/AVP 18 101
    a=rtpmap:18 G729/8000
    a=fmtp:18 annexb=no
    a=rtpmap:101 telephone-event/8000
    ...

[Troubleshoot] SIP/2.0 422 Session Interval Too Small dari FreeSWITCH

Di perangkat FreeSWITCH yang kami deploy, dapat error seperti ini:

SIP/2.0 422 Session Interval Too Small

menyebabkan call langsung terputus. Belum kedapatan trigger dari mana tapi akhirnya kami workaround dengan menambahkan config di bawah ini ke dalam sip profile:

<param name="session-timeout" value="1800"/>
<param name="enable-timer" value="true"/>
<param name="minimum-session-expires" value="120"/>

Lalu reload dengan cli:

freeswitch> sofia profile <namaprofile> restart

 

Codec dan kapasitas bandwidth

 

“CODEC anu itu butuh bw-nya brapa sih?”

Sering banget dapet pertanyaan ini. Dan kebetulan sekali ada thread di forum ASTERISK.ID yang menanyakan hal sama.

(Terima kasih mas Asoka!)

Jadi, jika ada codec yang di tabel disebutkan bw nya 64kbps, itu kalo jalan di jalur “bersih” seperti E1, DS0, dan teman-temannya. Ketika masuk ke ranah Internet Protocol (IP), akan ada penambahan header IP dan UDP yang mengakitbatkan konsumsi bw jadi bengkak sedikit, menjadi kurang lebih 85 – 87 kbps an.

Itu baru satu arah. Kalo ngobrol di telpon pastinya dua arah, jadi harus dikalikan dua, kira-kira menjadi 170 – 174kbps an per call. Untuk lebih lengkapnya bisa dibaca di:

https://www.voip-info.org/wiki/view/Bandwidth+consumption

Dan berikut tabel untuk mudah jadi pengingat (terutama untuk saya sendiri):

Codec BitRate NEB (kbps) Conversation (2 ways) (kbps)
G.711 64 kbps 87.2 174.40
G.729 8 kbps 31.2 62.40
G.723.1 6.4 kbps 21.9 43.80
G.723.1 5.3 kbps 20.8 41.60
G.726 32 kbps 55.2 110.40
G.726 24 kbps 47.2 94.40
G.728 16 kbps 31.5 63.00
iLBC 15 kbps 27.7 55.40

*NEB: Normal Ethernet Bandwidth

Sekedar Menengok Blog

“BLOG mu kok sudah ndak update lagi?”, demikian tanya seorang teman kepada saya. Wah iya ya? Sudah lama ya?

Sejak postingan terakhir, pada bulan Januari yang lalu, banyak hal yang sedang saya jalani, antara lain, akhirnya saya bekerja di sebuah perusahaan telekomunikasi dengan ijin jenis Jaringan Tetap Lokal Berbasis Circuit Switch.

Yap! Akhirnya mimpi saya terwujud untuk bekerja di sebuah perusahaan penyelenggara layanan PSTN, bahkan saya mendapat kesempatan untuk mengembangkan layanan berbasis ITKP juga.

Di tempat yang baru ini, saya jadi “bodoh” lagi, dan harus belajar banyak hal. Saya menjadi murid lagi. Belajar dari kolega-kolega yang sudah puluhan tahun bermain dengan jaringan SS7/C7. Belajar peraturan-peraturan pemerintah yang berhubungan dengan layanan ini sehingga tidak harus kejar-kejaran dengan pihak berwajib seperti yang pernah saya alami beberapa tahun yang lalu, :))))).

Dalam waktu dekat jika tidak ada halangan, saya janji berbagi mengenai bagaimana VoIP berperan besar di sini.

Untuk sementara saya idle sampai beberapa waktu ke depan.

I will surely blog a lot more.