-->

..:: seize the day ::..

May 15, 2008

Asterisk (Bagian 1)

Filed under: IT stuff

Tahun 2007 lalu saya sempat ngebangun VOIP system dengan Asterisk untuk sebuah instansi di Jakarta. VOIP tersebut menghubungkan 2 lokasi di Jakarta, dan masing-masing 1 lokasi di Padang dan di Banda Aceh. Ada beberapa pengalaman menarik yang ingin saya share yang mungkin bisa membantu teman-teman yang ingin mengimplementasikan Asterisk.

Sudah banyak dokumen dan wiki di internet yang bisa membantu anda untuk konfigurasi Asterisk dengan baik, bahkan salah satu teman kita, Onno WP,  sering keliling Indonesia bahkan mancanegara hanya untuk "mengiklankan" penggunaan Asterisk. Tulisan ini hanya sebagai pelengkap saja, kalau lebih detailnya silakan lihat ke site yang khusus membahas Asterisk (he..he..he….saya jadi inget ceritanya Yono dan Anto waktu jemput Onno di London waktu Onno liburan sekolah dari Canada, itu knalpot sampe copot saking beratnya anda bertiga he…he..he… udah berapa tahun ya itu peristiwa, we’re all getting old bro. Bos Yono kayaknya udah anteng ngejagain keamanan negara sekarang, Bos Anto sekarang udah jadi guardiannya AstroTV ngejagain Measat biar nggak dihack sama kita-kita wakakakakakkk. Sorry To’ just kiddin’. Saya terus aja ngoprek Linux)……Pak CA dan Bang Edmon saya jangan dikenain pasal ITE ya……..

Ok cukup untuk nostalgianya. Lebih baik saya cerita aja pengalaman praktis dan cerita-cerita implementasinya.

Untuk implemetensi Asterisk saya menggunakan Dell server PESC1430, Digium card TDM04B, PSTN line, Musitel 160 GSM modem dan Grandstream GXP2000 sip phone. Implementasinya sendiri cukup complicated tapi sebenarnya nggak susah koq. Jadi nanti di setiap server ada dua ip, satu buah masuk dalam vlan data dan yang lainnya untuk vlan voice. Terus semua percakapan akan terekam di disk, sebenarnya ini fasilitas dari Asterisk yang dengan cron secara periodik kita simpan ke sebuah direktori.

Sistemnya saya buat fault-tolerant dalam arti satu server sebagai server Asterisk nominal dan yang lain sebagai stand-by back-up yang akan mengambil alih semua service di server nominal jika server tersebut mati. Untuk hal ini saya menggunakan vrrpd yang cukup sederhana untuk diimplementasikan.

Kenapa pakai Asterisk? Sistem ini ditempatkan ke dalam sebuah crisis center yang harus menerima dan juga memberikan panggilan telpon. Jadi kalau pakai telepon PSTN tentunya akan banyak biaya yang dikeluarkan untuk koneksi PSTN antar crisis center. Tapi kita nggak ngebuat koneksi dari Asterisk server ke SIP gateway untuk koneksi dengan menggunakan internet ke PSTN, soalnya saya belum yakin kalau hal ini legal di Indonesia, walaupun bisa saja kita konek ke SIP gateway di luar negeri yang gratisan. ‘Ntar kita kena pasal ITE lagi. Jadi kalau dari sistem ini mau melakukan panggilan ke GSM, CDMA atau PSTN tetap aja harus lewat saluran yang legal, lewat PSTN atau lewat GSM.

PABX server / Asterisk server
Untuk PABX server saya menggunakan Dell PESC1430, lebih dari cukup speknya, cuman berat banget nih server nggak tahu yang berat apanya he..he…he…… konfigurasinya:

  • Pentium D processor
  • RAM 512 mb
  • 2 ethernet card 10/100
  • 80 GB SAS harddisk
  • 3 digium card TDM04B
                                                      

Setiap digium card memiliki 4 FXO port untuk koneksi ke line telpon PSTN atau ke FXS port di modem GSM.

Pada kedua server ini saya install Centos 4.2. Versinya agak tua memang. Tapi kita nge-remaster CDnya dan dipaketin sama Asterisk dan vrrpd sekitar bulan Februari 2007. Walaupun proses instalasinya baru mulai di bulan Juni 2007. Foto diatas adalah untuk Aceh site yang kita kerjakan sekitar bulan Oktober 2007. Tadinya mau pakai openSUSE tapi usernya nggak biasa pakai, jadi kita akomodir keinginan user untuk pakai Centos.

IP Phone (tepatnya mungkin SIP phone)

Untuk pesawat telepon saya menggunakan Grandstream GXP2000, bukan merek yang terkenal dan jelas kualitasnya agak rendah dibawah merek-merek lain yang pernah saya gunakan. Kalau dipakai agak lama agak panas di telinga. Yang jelas harganya lebih murah. Bisa dikonfigurasi lewat internal webservernya dan mendukung cukup banyak standar codec, cukup lah untuk proyek gratisan he..he..he.. Instalasinya ke jaringan nggak susah koq. Dengan port RJ45 yang mendukung ethernet 100 MB/s, dari pabriknya di set sebagai DHCP. Jadi musti pasang DHCP server dulu untuk ngambil ip address, terus buka webconsole-nya lewat terminal. Terus ganti dengan IP yang kita inginkan.

                                                    
 

PSTN line

Karena menggunakan 3 Digium card, berarti ada 3x4 atau 12 line yang bisa digunakan dalam konfigurasi ini. Jadi kalau dipakai semua berarti harus disediakan 12 telepon line. Kita bisa minta no hunting ke penyedia jasa untuk 12 line ini. Tapi kalau gak punya 12 line ya, minimal ada satu line PSTN. Kalau untuk 1 line PSTN mungkin harus dicari juga tipe Digium yang hanya support 1 line biar nggak boros. Maklum TDM04B yang digunakan ini harganya cukup mahal sekitar USD450-500 perbuahnya.

                                                    

 

GSM Modem

GSM modem di sini sebenarnya sebagai backup kalau-kalau line PSTN mati, jadi desain kita dilengkapi dengan 4 buah modem GSM Musitel yang memiliki masing-masing satu port FXO dan FXS. Dari port FXS Musitel akan dihubungkan ke port FXO digium (no 8 - 12). O iya semua hubungan dari port FXO digium dan port FXO dan FXS musitel menggunakan RJ12.

                                                    
 

Coupler, konektor, RJ12 cable

Coupler digunakan untuk memparalel PSTN line ke kedua server.

                     

Pada tulisan mendatang saya akan jelaskan proses instalasi dan konfigurasi Centos dan Asterisk. 

May 12, 2008

Load Balancing Trafik Internet

Filed under: IT stuff

Mengingat banyaknya teman-teman yang bertanya ke saya tentang hal ini, saya usahakan untuk menjelaskan di sini bagaimana mensetup koneksi internet dengan lebih dari satu koneksi ke gateway server kita. Saya sudah pernah membahas masalah ini pada tulisan saya sebelumnya tapi kelihatannya belum memadai. Saya usahakan membahas sekali lagi di sini.

Konfigurasi gateway kira-kira seperti ini

                         loadbalance-gateway

Misalkan anda mempunyai koneksi internet ke dua provider, katakan CBN dan TelkomSpeedy (ini bukan iklan lho emoticon). Anda berniat untuk membagi bandwidth ke kedua ISP tersebut, anda dapat melakukannya dengan Linux. Pada kasus saya, saya menggunakan openSUSE 10.3 dengan patch kernel dari Julian Anastasov yang dapat didonlod di sini. Tetapi, ada baiknya sebelum anda menginstall patch tersebut anda mengetahui benar apa yang dilakukan. Sebagai langkah awal bacalah dokumen lartc sebagai pengantar yang menurut saya sangat baik.

Ringkasnya patch dari Julian Anastasov akan memungkinkan kernel anda melakukan "dead gateway detection" untuk selanjutnya mengalihkan trafik ke gateway yang lain yang masih berfungsi. Kombinasi implementasi patch ini dengan ip, iproute dan iptables memungkinkan mesin linux kita mampu melakukan load balancing traffic internet melalui multiple gateway. Kalau di baca di sitenya di atas, dia mengembangkan Linux Virtual Server untuk implementasi cluster/fault-tolerant di linux. Dan sebagai side-effectnya kita bisa menggunakan patchnya untuk load balancing traffic. Walaupun untuk project fault-tolerant saya hanya menggunakan vrrpd script yang implementasinya lebih sederhana emoticon. Sorry ya Om.

 

Keterbatasan 

Sebelum melangkah terlalu jauh saya jelaskan di sini, bahwa instalasi load balancing ini "tidak mudah". Saya membutuhkan waktu berhari-hari untuk yakin bahwa server saya tidak mengalami masalah. Menurut Christoph Simon, yang pernah membuat dokumen how-to ada beberapa keterbatasan yaitu

  • setup ini tidak berfungsi untuk pengguna tunggal dengan dua koneksi modem
  • load balancing akan berjalan baik tetapi hanya untuk kasus dimana terjadi koneksi simultan yang banyak dan ke alamat yang berbeda-beda
  • dalam kasus saya, saya menggunakan 1 koneksi leased channel dan 1 koneksi ADSL
  • dalam kasus saya, ADSL yang saya gunakan, karena tidak simetrisnya kecepatan upload dan download, ternyata cukup mengganggu. Sehingga saya harus membatasi upload (yang untungnya bisa di set di susefirewall) dan mengkombinasikannya dengan htb.
  • dalam kasus saya juga, saya harus mengatur ethernet secara manual dengan ethtool sampai didapat angka optimum data transfer. Selanjutnya dapat diotomasi dengan menjalankan script pada saat start-up

Keunggulan

Beberapa hal yang saya amati dapat berjalan dengan baik, tentunya setelah berhasil mengatasi kendala-kendala yang saya sebutkan di atas, setelah mengimplementasi Julian Patch adalah:

  • bekerja dengan baik pada kernel 2.4-2.6
  • bekerja dengan baik untuk kasus 2 sambungan internet (secara teoritis dapat bekerja pada lebih dari satu sampai tidak terbatas)
  • kedua sambungan akan bekerja, ketika salah satu jalur down maka secara otomatis akan beralih ke jalur lain yang masih bekerja
  • jka jalur putus, tidak perlu mengkonfigurasi ulang network
  • berinteraksi dengan baik dengan ip dan iptables

 Langkah Pengerjaan

 1. Patching kernel

Anda harus melakukan patching kernel dengan mendownload dari sini. Pilihlah patch routes-2.X.diff dibagian Linux kernel patches atau anda dapat juga mendonload paket jumbo patch di bagian Jumbo. Pilihlah  yang sesuai dengan kernel anda. Untuk mencheck versi kernel anda ketiklah di prompt uname -r.

Setelah mendownload kernel jalankan perintah /usr/src/linux # patch -p1 < file.diff

Kalau anda juga akan mengimplementasikan htb, ada userspace yang bagus untuk dicoba dan bisa didonload di sini. Jangan lupa baca sedikit dokumentasinya di sini siapa tahu anda perlu mengkonfigurasi ulang kernel anda. Bagaimana mengkonfigurasi ulang kernel tidak akan saya bahas di sini, biasanya telah tersedia dokumentasi untuk setiap distribusi linux.

 2. Setting Netfilter

Saya tidak akan menjelaskan bagaimana mengkonfigurasi iptables dan netfilter di sini. Sudah banyak dokumen di internet menjelaskan hal tersebut dengan sangat baik. Tapi pastikan bahwa iptables anda mendukung stateful firewall, kernel forwarding, ALLOW policy dan dua buah SNAT masing-masing untuk ISP1 dan ISP2.

3. Definisi

Di bawah ini adalah definisi dari singkatan yang digunakan (stolen from Christoph Simon nano.txt):

IFI                     = internal interface
IPI                     = IP address of internal interface
NMI                   = netmask for the internal interface
IFE1, IFE2         = external interfaces
IPE1, IPE2         = external IP address
NWE1, NWE2    = external network address
NME1, NME2     = mask for the external network (number of bits, like in /24)
BRD1, BRD2      = broadcast address for external network
GWE1, GWE2    =   gateway for external interface

4. Script

Script ini (stolen shamelessly from Christoph Simon nano.txt) mengasumsikan bahwa komputer yang digunakan memiliki 3 ethernet card. Satu buah untuk koneksi ke internal network dan dua buah ke dua gateway yang berbeda.

    ip link set IFI up
    ip addr add IPI/NMI brd + dev IFI
    ip rule add prio 50 table main
    ip route del default table main

    ip link set IFE1 up
    ip addr flush dev IFE1
    ip addr add IPE1/NME1 brd BRD1 dev IFE1

    ip link set IFE2 up
    ip addr flush dev IFE2
    ip addr add IPE2/NME2 brd BRD2 dev IFE2

    ip rule add prio 201 from NWE1/NME1 table 201
    ip route add default via GWE1 dev IFE1 src IPE1 proto static table 201
    ip route append prohibit default table 201 metric 1 proto static

    ip rule add prio 202 from NWE2/NME2 table 202
    ip route add default via GWE2 dev IFE2 src IPE2 proto static table 202
    ip route append prohibit default table 202 metric 1 proto static

    ip rule add prio 222 table 222
    ip route add default table 222 proto static \
        nexthop via GWE1 dev IFE1 \
        nexthop via GWE2 dev IFE2

Script ini adalah dasar dari script load balancing yang saya gunakan. Tentu saja anda dapat mengeditnya untuk dipanggil sesuai running config yang anda butuhkan. Bagaimana membuat script jalan di running config tertentu tidak akan saya jelaskan di sini. Ada banyak dokumen di internet yang dapat membantu anda mengedit rc.local atau membuat script tersendiri yang akan diletakkan di /etc/init.d

Dalam kasus saya, saya menggunakan openSUSE 10.3 dan saya buat suatu file bernama megwbalance (or any name you like) di /etc/init.d, chmod 755, chown root:root kemudian isi file sebagai berikut:

    #!/bin/sh
    #
    #
    # /etc/init.d/megwbalance
    #
    ### BEGIN INIT INFO
    # Provides:          megwbalance
    # Required-Start:    $network
    # Should-Start:
    # Required-Stop:
    # Should-Stop:
    # Default-Start:     3 5
    # Default-Stop:      0 1 2 6
    # Short-Description: Custom 2 gateway load balancing for ISP1 and ISP2
    # Description:       Custom 2 gateway load balancing for ISP1 and ISP2
    ### END INIT INFO
    #

    test -s /etc/rc.status && . /etc/rc.status && rc_reset

    case "$1" in
    start )
            # script untuk 2 gateway load balancing for SuSE 10.3 by medwinz@gmail.com
            # free to copy
            #

            echo -n "Starting ME gateway load balancing"

            ip link set IFI up
            ip addr add IPI/NMI brd + dev IFI
            ip rule add prio 50 table main
            ip route del default table main

            ip link set IFE1 up
            ip addr flush dev IFE1
            ip addr add IPE1/NME1 brd BRD1 dev IFE1

            ip link set IFE2 up
            ip addr flush dev IFE2
            ip addr add IPE2/NME2 brd BRD2 dev IFE2

            ip rule add prio 201 from NWE1/NME1 table 201
            ip route add default via GWE1 dev IFE1 src IPE1 proto static table 201
            ip route append prohibit default table 201 metric 1 proto static

            ip rule add prio 202 from NWE2/NME2 table 202
            ip route add default via GWE2 dev IFE2 src IPE2 proto static table 202
            ip route append prohibit default table 202 metric 1 proto static

            ip rule add prio 222 table 222
            ip route add default table 222 proto static \
            nexthop via GWE1 dev IFE1 weight 1\
            nexthop via GWE2 dev IFE2 weight 3

            # setting IP masquerade
            #
            iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth0 -j MASQUERADE
            iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth1 -j MASQUERADE

            # set TOS field agar router gak bingung, supaya ssh dan ftp bisa jalan

            iptables -t mangle -A PREROUTING -j TOS –set-tos 0x00
            iptables -t mangle -A OUTPUT -j TOS –set-tos 0x00

            rc_status -v
            ;;

    stop)
            # delete routing and rule table 201, 202, 222

            echo -n "Stoping ME gateway load balancing and delete routing"

            ip route del NWE1/NME1
            ip route del NWE2/NME2

            ip rule delete table main
            ip rule delete table 201
            ip rule delete table 202
            ip rule delete table 222

            rc_status -v
            ;;

    restart)
            ## Stop the service and regardless of whether it was
            ## running or not, start it again.
            $0 stop
            $0 start

            # Remember status and be quiet
            rc_status
            ;;

    esac
    rc_exit

Save file tersebut, kemudian di openSUSE jalankan pada prompt # insserv /etc/init.d/megwbalance untuk mendaftarkan service tesebut di running level. Selanjutnya reboot server anda. Untuk pengguna distribusi lain silakan jalankan # chkconfig -a levels35 megwbalance start atau yang sejenisnya.

Sekarang fungsi load balancing (termasuk patching kernel untuk dead gateway detection dan reverse path checking) akan dipanggil pada saat boot di run level 3 dan 5.

Selanjutnya anda harus memastikan bahwa ethernet anda berfungsi dengan baik. Biasanya untuk ADSL MTU harus di set ulang, dalam kasus saya eth1 terhubung ke ADSL dan MTU saya set ke 1492. Untuk eth0 dan eth2 yang terhubung ke leased line dan LAN saya set MTU ke 1500 (default). Selain itu dengan ethtool saya set eth0 menjadi 100 MB/s dan half duplex sedangkan eth1 saya batasi kecepatannya ke 10 MB/s dan half duplex. Karena saya menggunakan SuSEfirewall saya dapat menset upload HTB device dengan FW_HTB_TUNE_DEV masing-masing 51200 kbps untuk eth0 dan 63 kbps untuk eth1. Sedangkan untuk eth2 yang terhubung ke LAN saya implementasikan HTB-tools. Anda harus mencari sendiri kombinasi yang tepat untuk network anda. Anda dapat mulai dari kecepatan, duplex dan class HTB yang terkecil dan menaikkannya sedikit demi sedikit sampai didapat kombinasi yang optimum. 

Apa saja yang dilakukan oleh Julian Patch? Di bawah ini saya ambil dari how-to nya Christoph Simon:

  • Dengan patch tersebut, kita dapat menggunakan "proto static" untuk semua routes. Dengan demikian route untuk sebuah link akan tetap tersimpan di kernel walaupun koneksi terputus tetapi kernel akan secara otomatis mengalihkan trafik ke link yang lain. Kita dapat melakukan ping ke gateway untuk mengetahui bahwa sebuah link itu berfungsi atau tidak. Sebenarnya Equal cost multipath telah ada tanpa patch ini tetapi tidak akan bekerja.
  • Kalau sebuah device tetap tersedia walaupun tidak berfungsi, kernel memerlukan suatu cara untuk memutuskan apakah routes ini harus dipilih. Hal ini dinamakan “dead gateway detection'’; hal ini bekerja untuk semua unicast routes (multipath/unipath, input/output) dan disediakan oleh Julian Patch.
  • Sebuah multipart route terdiri dari beberapa route dengan sumber dan tujuan yang sama, tetapi dengan jalan yang berbeda, yang didefinisikan dengan device dan gateway. Dengan Julian patch kernel akan mengetahui bagaimana membedakan route tidak hanya dari sumber dan tujuannya, tetapi juga dari device dan gateway. Juga, setidaknya ketika setiap jalur memiliki device yang berbeda, reverse path checking (rp_filter) akan berfungsi dengan baik.
  • NAT tidak mampu untuk berinteraksi dengan alternative route. Yang harus melakukannya adalah routing. Julian Patch akan membuat routing system  mempersiapkan route bagi sebuah paket individual dari sebuah NAT sistem untuk memilih sebuah route yang tepat (dari beberapa pilihan route).
Semoga sedikit artikel ini berguna bagi yang membacanya.

May 9, 2008

openSUSE 11

Filed under: others

Sebagai salah satu penguna veteran openSUSE, saya menggunakan SuSE sejak versi 6.3, saya merasa excited utk menunggu keluarnya openSUSE 11. Karena itu saya ikutan spreading the news of the new release of openSUSE. Saya tambahkan countdown timer dari Billy Juliani dari openSUSE.org di menu kanan. Saya tidak fanatik openSUSE, saya juga pakai Ubuntu untuk website dan Fedora untuk mail server di beberapa tempat. Tapi laptop tempat saya ngetik ini emang bener diinstall openSUSE 10.3, untuk PC di rumah saya pakai openSUSE 10.2.

Saya juga pakai Micro$oft koq, jangan khawatir. Saya masih menyisakan satu PC di kantor berisi XP SP2. Belum Vista memang, karena PC saya ini mungkin yang tertua di kantor, takut nggak bisa nge-boot kalau diisi Vista.