Medwinz's Notes
posted at
Asterisk 1.6.1 on openSUSE 11.1 (Part 4)
medwinz note:
I got a bunch of email from Indonesian gentle readers about this topic, so I decide to write in Bahasa Indonesia for the Part 4. But don't worry google translate is there. Happy reading :-)
Pertama-tama terima kasih atas antusiasme rekan-rekan yang sudah nge-japri dan memberi komentar. Saya mohon maaf karena bagian ke-4 ini agak telat, namanya kuli harus tour of duty dan ngejar setoran :-)
Pada part 3 saya telah memberikan contoh extensions.conf, saya perlu menyertakan beberapa contoh file konfigurasi lain yang dibutuhkan agar penjelasan extension.conf bisa dimengerti. File-file tersebut adalah:
/etc/asterisk/chan_dahdi.conf
/etc/asterisk/sip.conf
/etc/asterisk/iax.conf
/etc/asterisk/meetme.conf
/etc/asterisk/voicemail.conf
Contoh chan_dahdi.conf:
;
; dahdi_channels.conf configuration of digium card
;
; Configuration file
[channels]
language=en
context=internal-fxo
signalling=fxs_ks
rxwink=300
cidstart=polarity ; jangan ada line yang ngutang akan mengacaukan DTMF dan cid signalling
answeronpolarityswitch=no
hanguponpolarityswitch=no
;cidstart=ring ; ini test saja
pulsedial=no
;useincomingcalleridondahditransfer=yes
cidsignalling=dtmf
busydetect=yes
busycount=6
usecallerid=yes
callerid=asreceived
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=800
rxgain=3.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=no
faxdetect=no
group=1
disallow=all
allow=all
echocanceller=mg2,1-12
channel => 1-12
Contoh sip.conf:
[general]
port = 5060
bindaddr = 10.8.1.120
disallow=all
allow=all
allow=ulaw
allow=gsm
context=internal-sip
[9001]
type=friend
host=dynamic
dtmfmode=rfc2833
language = en
context=recordings
nat=no
username=YGTELEPH01
userid=9001
callerid=YGTELEPH01 <9001>
mailbox=9001
allow=all
qualify=yes
[9002]
type=friend
host=dynamic
dtmfmode=rfc2833
language = en
context=internal-sip
nat=no
username=YGTELEPH02
userid=9002
callerid=YGTELEPH02 <9002>
mailbox=9002
allow=all
qualify=yes
;tambahkan sesuai extension yang anda miliki
[9031]
type=peer
insecure=very
disallow=all
allow=ulaw
allow=alaw
allow=gsm
context=internal-sip
host=10.8.1.31
username=GS8
permit=10.8.1.31/255.255.255.255
qualify=yes
canreinvite=no
call-limit=4
dtmfmode=rfc2833
nat=no
[9032]
type=peer
insecure=very
disallow=all
allow=ulaw
allow=alaw
allow=gsm
context=internal-sip
host=10.8.1.32
username=GS8
permit=10.8.1.32/55.255.255.255
qualify=yes
canreinvite=no
call-limit=4
dtmfmode=rfc2833
nat=no
Contoh iax.conf:
; Inter-Asterisk eXchange driver definition
;
; This configuration is re-read at reload
; or with the CLI command
; reload chan_iax2.so
;
; General settings, like port number to bind to, and
; an option address (the default is to bind to all
; local addresses).
;
[general]
bindport=4569
bindaddr=10.8.1.120
delayreject=yes
language=en
bandwidth=high
disallow=all
allow=ulaw
allow=alaw
allow=gsm
jittertargetextra=40
jitterbuffer=yes
dropcount=3
maxjitterbuffer=300
minjitterbuffer=300
minexcessbuffer=200
mailboxdetail=yes
autokill=yes
register => ncpabxsv:0000@10.1.1.120:4569
register => dppabxsv:0000@10.7.1.120:4569
register => jbpabxsv:0000@10.9.1.120:4569
tos=0x10
[guest]
type=user
context=default
callerid="Guest IAX User"
;
; Trust Caller*ID Coming from iaxtel.com
;
[iaxtel]
type=user
context=default
auth=rsa
inkeys=iaxtel
;
; Trust Caller*ID Coming from iax.fwdnet.net
;
[iaxfwd]
type=user
context=default
auth=rsa
inkeys=freeworlddialup
[ncpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.1.1.120
qualify=yes
requirecalltoken=no
[dppabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.7.1.120
qualify=yes
requirecalltoken=no
[ygpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.8.1.120
qualify=yes
requirecalltoken=no
[jbpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.9.1.120
qualify=yes
requirecalltoken=no
Contoh meetme.conf:
[rooms]
;#include meetme_additional.conf
conf => 5000
conf => 6000
conf => 7000
Contoh voicemail.conf:
;
; Voicemail Configuration
;
;
; NOTE: Asterisk has to edit this file to change a user's password. This does
; not currently work with the "#include" directive for Asterisk
; configuration files, nor when using realtime static configuration.
; Do not use them with this configuration file.
;
[general]
format=wav
serveremail=asterisk
fromstring=Asterisk PABX
sendvoicemail=yes
language=en
operator=no
envelope=yes
attach=yes
maxmsg=20
maxsecs=180
minsecs=6
maxgreet=60
skipms=3000
maxsilence=5
silencethreshold=128
maxlogins=3
emailbody=Anda mempunyai pesan baru
emaildateformat=%A, %d %B %Y at %H:%M:%S
mailcmd=/usr/sbin/sendmail -t
sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
; VoiceMailMain() [option 5 from mailbox's advanced menu].
; If set to 'no', option 5 will not be listed.
[default]
; isikan sebanyak extension yang anda miliki
9001 => 9001,medwinz,,,attach=no
9002 => 9002,medwinz,,,attach=no
[zonemessages]
yogyakarta=Asia/Jakarta|'vm-received' Q 'digits/at' R
Desain yang saya buat ini secara sederhana digambarkan dalam diagram dibawah
Ip phones mempunyai extension 9001 sampai dengan 9027. GSM gateway diperlakukan sebagai sip extension dengan nomer extension 9031 dan 9032. Lihat file sip.conf. Bagaimana membuat agar sebuah ip phone mempunyai nomor extensi? Ini tergantung dari ip phone yang anda gunakan, untuk langkah awal anda dapat menset sebuah dhcp untuk kemudian setiap ip-phone akan mengambil sebuah ip. Biasanya didalam sebuah ip-phone sudah ditanam sebuah webserver yang dapat diakses dari browser untuk selanjutnya kita beri nomor extensi. Proses ini sering dinamakan provision. Favorit saya untuk mem-provisi ip-phone adalah dengan menset sebuah ftp server yang kemudian setiap ip-phone akan mendownload konfigurasi dari ftp server tersebut. Lebih lengkapnya silakan baca manual ip-phone anda.
Sekarang mari kita mulai membahas file extensions.conf. Yang penting diketahui bahwa dialplan itu terdiri dari beberapa context. Context ditandai dengan [...], misalnya [incoming], [internal-fxo], [internal-sip] dsb. Context ini saling berhubungan antara extensions.conf dengan file-file yang lain. Context akan mengatur perlakuan terhadap suatu incoming atau outgoing call oleh asterisk. Asterisk mengenal beberapa standard extensi yaitu:
i : invalid
s : start
h : hangup
t : timeout
T : absolute timeout
a : asterisk extension
o : operator
Yang biasanya sering digunakan adalah:
s : start : apa yang harus dilakukan oleh asterisk kalau ada incoming call
i : invalid entry : apa yang dilakukan kalau entry yang dimasukkan salah
t : time out : apa yang dilakukan kalau timeout sudah lewat
Sekarang coba kita perhatikan syntax extensions.conf berikut:
[internal-fxo]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Background(en/autoattendant)
exten => s,4,WaitExten(2)
Maka artinya kurang lebih adalah untuk context internal-fxo kalau ada telepon yang masuk maka yang harus dilakukan oleh asterisk adalah:
dijawab (diangkat) --> s,1,Answer
tunggu selama 1 detik --> s,2,Wait(1)
jalankan di latar belakang file /var/lib/asterisk/sound/en/autoattendant.gsm --> s,3,Background(en/autoattendant)
tunggu input keypad selama 2 detik --> s,4,WaitExten(2)
Mudahkan? ;)
Asterisk mempunyai beberapa aplikasi yang bisa dipanggil melalui extensions.conf yang saya gunakan di sini adalah VoiceMail yaitu aplikasi untuk meninggalkan pesan jika telepon tidak diangkat atau sibuk, meetme untuk melakukan conference call (percakapan dengan peserta lebih dari 2 orang), dan Monitor untuk merekam suatu percakapan ke dalam file. Mari kita lihat contoh extensions.conf:
[internal-fxo]
............
exten => 5000,1,MeetMe(5000)
exten => 6000,1,MeetMe(6000)
exten => 7000,1,MeetMe(7000)
Perhatikan juga contoh meetme.conf:
[rooms]
;#include meetme_additional.conf
conf => 5000
conf => 6000
conf => 7000
Kita telah mendefinisikan 3 ruangan untuk melakukan konferensi yaitu extensi 5000, 6000, dan 7000. Kemudian pada context [internal-fxo] di extensions.conf kita definisikan bahwa user yang mengakses extensi 5000, 6000 dan 7000 akan masuk ke ruangan konferensi. Mudahkan ;). Perlu diketahui bahwa ruangan konferensi ini tidak hanya bisa diakses oleh extensi lokal tetapi juga dari telepon di tempat lain, baik voip, GSM, atau PSTN. Misalnya kita ingin mengajak rekan kita yang kebetulan sedang diluar kantor untuk ikut meeting, maka kita dapat menghubungi handphonenya dan selanjutnya kita transfer ke 5000, 6000 atau 7000.
VoiceMail cukup mudah untuk dikonfigurasi jika kita menginginkannya. Ada beberapa flag yang digunakan untuk mengatur VoiceMail yaitu:
s : jika diberikan akan membuat pesan "Please leave your message after the tone. When done, hang up, or press the pound key" tidak dimainkan
u: jika diberikan akan memutar pesan "The person at extension ... 1234 ... is unavailable"
b: jika diberikan akan memutar pesan "The person at extension ... 1234 ... is busy"
Kita dapat mengkombinasikan flag tersebut misalnya:
su : pesan unavailable akan diputar tetapi pesan instruksi tidak
sb : pesan busy akan diputar tetapi pesan instruksi tidak
u : pesan unavailable akan diputar dilanjutkan dengan pesan instruksi
b : pesan busy akan diputar dilanjutkan dengan pesan instruksi
Pada context [incoming] di extensions.conf saya mendefinisikan:
exten => _XXXX,1,Answer
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(${EXTEN}@default,b)
exten => _XXXX,104,Hangup
Maksudnya kurang lebih adalahkalau ada yang men-dial extensi XXXX (sesuai dengan yg telah didefinisikan di sip.conf) misalya 9001 maka:
jawab
dial extension selama 20 detik (ini ditentukan pada context [globals] RINGDELAY => 20), kalau sudah lewat 20 detik maka
putar pesan unavailable dilanjutkan dengan instruksi untuk menyimpan pesan.
hangup
jika nada sibuk, putar pesan sibuk dilanjutkan dengan instruksi untuk menyimpan pesan
hangup
Pesan yang masuk akan disimpan pada /var/spool/asterisk/voicemail/context/boxnumber/INBOX. Misalnya dalam kasus di atas maka :
context = default, sesuai exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
boxnumber adalah mailbox untuk nomer extensi tertentu, misalnya untuk extensi 9001 kebetulan saya set mailbox=9001 sama dengan nomor extensinya. Lihat file sip.conf di atas.
maka jika penelpon menelpon 9001 dan meninggalkan voicemail maka lokasi penyimpanannya pada /var/spool/asterisk/voicemail/default/9001/INBOX
Kita bisa menyimpan semua percakapan yang terjadi melalui asterisk dengan memanfaatkan aplikasi Monitor. Tentu saja untuk mengkonfigurasinya anda harus menanyakan policy mengenai hal ini kepada pemilik jaringan/asterisk di mana anda memasangnya. Karena hal ini berhubungan dengan privacy. Ada beberapa hal yang sebaiknya diperhatikan dalam mensetup Monitor, standar styntax adalah sebagai berikut: Monitor(ext,basename,flags). Penjelasan sederhananya adalah sebagai berikut:
ext : format sound file, defaultnya adalah .wav
basename : dalam contoh saya menggunakan Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S, ini akan mengakibatkan file disimpan dengan nama misalnya Call-8001-02125558785-20091222-161031.wav dimana 8001 adalah nomer extensi, 02125558785 adalah nomer yang dituju, 20091222 adalah tanggal-bulan-tahun, 161031 adalah jam-menit-detik. Demikian juga kalau incoming call, kalau anda berlangganan CID maka asterisk bisa membaca asterisk yang masuk, tetapi sekiranya anda tidak berlangganan CID maka incoming call akan disimpan dengan nama misalnya Call- -8019-20091222-122545.wav
m : adalah flag yang bila digunakan maka asterisk akan memanggil program diluar asterisk untuk mengkombinasikan dua buah sound file, in dan out, ke dalam sebuah file. Program yang dipanggil adalah sox. Kadang-kadang sox tidak bisa mengenali dan menggabungkan format sound (alaw) akibatnya seringkali kita menemukan untuk sebuah percakapan masih terdapat dua buah file, in dan out. Misalnya : Call-8019-723964-20091222-151827-in.wav dan Call-8019-723964-20091222-151827-out.wav
Untuk mengaktifkan Monitor tidaklah sulit, sebagai contoh perhatikan lagi file extensions.conf:
[internal-fxo]
.......
exten => _XXXX,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(su${EXTEN})
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(sb${EXTEN})
exten => _XXXX,104,Hangup()
Maksud dari baris ini:
untuk extensi xxxx, rekam percakapan dengan format Call-no.extensi-tanggal-jam
dial extensi xxxx dan dering selama 20 detik (masih ingat ya, yang diatas)
kalau lewat 20 detik maka aktifkan voicemail
kala nada sibuk aktifkan voicemail
hangup
Hmm... banyak juga ya. Mudah-mudahan tidak memusingkan. Masih ada beberapa hal di dalam extensions.conf yang akan saya jelaskan misalnya bagaimana mengkoneksi asterisk server di lokasi lain, bagaimana merekam pesan (recording untuk greeting), dan terutama pengaturan context yang berkaitan dengan channel dahdi dan sip.conf. Ada baiknya kita sudahi dulu, silakan diendapkan dan dibawa mimpi :-). Kita lanjutkan di tulisan berikutnya.
Stay tuned and have a lot of fun :-) 9002>9001>
I got a bunch of email from Indonesian gentle readers about this topic, so I decide to write in Bahasa Indonesia for the Part 4. But don't worry google translate is there. Happy reading :-)
Pertama-tama terima kasih atas antusiasme rekan-rekan yang sudah nge-japri dan memberi komentar. Saya mohon maaf karena bagian ke-4 ini agak telat, namanya kuli harus tour of duty dan ngejar setoran :-)
Pada part 3 saya telah memberikan contoh extensions.conf, saya perlu menyertakan beberapa contoh file konfigurasi lain yang dibutuhkan agar penjelasan extension.conf bisa dimengerti. File-file tersebut adalah:
/etc/asterisk/chan_dahdi.conf
/etc/asterisk/sip.conf
/etc/asterisk/iax.conf
/etc/asterisk/meetme.conf
/etc/asterisk/voicemail.conf
Contoh chan_dahdi.conf:
;
; dahdi_channels.conf configuration of digium card
;
; Configuration file
[channels]
language=en
context=internal-fxo
signalling=fxs_ks
rxwink=300
cidstart=polarity ; jangan ada line yang ngutang akan mengacaukan DTMF dan cid signalling
answeronpolarityswitch=no
hanguponpolarityswitch=no
;cidstart=ring ; ini test saja
pulsedial=no
;useincomingcalleridondahditransfer=yes
cidsignalling=dtmf
busydetect=yes
busycount=6
usecallerid=yes
callerid=asreceived
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=800
rxgain=3.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=no
faxdetect=no
group=1
disallow=all
allow=all
echocanceller=mg2,1-12
channel => 1-12
Contoh sip.conf:
[general]
port = 5060
bindaddr = 10.8.1.120
disallow=all
allow=all
allow=ulaw
allow=gsm
context=internal-sip
[9001]
type=friend
host=dynamic
dtmfmode=rfc2833
language = en
context=recordings
nat=no
username=YGTELEPH01
userid=9001
callerid=YGTELEPH01 <9001>
mailbox=9001
allow=all
qualify=yes
[9002]
type=friend
host=dynamic
dtmfmode=rfc2833
language = en
context=internal-sip
nat=no
username=YGTELEPH02
userid=9002
callerid=YGTELEPH02 <9002>
mailbox=9002
allow=all
qualify=yes
;tambahkan sesuai extension yang anda miliki
[9031]
type=peer
insecure=very
disallow=all
allow=ulaw
allow=alaw
allow=gsm
context=internal-sip
host=10.8.1.31
username=GS8
permit=10.8.1.31/255.255.255.255
qualify=yes
canreinvite=no
call-limit=4
dtmfmode=rfc2833
nat=no
[9032]
type=peer
insecure=very
disallow=all
allow=ulaw
allow=alaw
allow=gsm
context=internal-sip
host=10.8.1.32
username=GS8
permit=10.8.1.32/55.255.255.255
qualify=yes
canreinvite=no
call-limit=4
dtmfmode=rfc2833
nat=no
Contoh iax.conf:
; Inter-Asterisk eXchange driver definition
;
; This configuration is re-read at reload
; or with the CLI command
; reload chan_iax2.so
;
; General settings, like port number to bind to, and
; an option address (the default is to bind to all
; local addresses).
;
[general]
bindport=4569
bindaddr=10.8.1.120
delayreject=yes
language=en
bandwidth=high
disallow=all
allow=ulaw
allow=alaw
allow=gsm
jittertargetextra=40
jitterbuffer=yes
dropcount=3
maxjitterbuffer=300
minjitterbuffer=300
minexcessbuffer=200
mailboxdetail=yes
autokill=yes
register => ncpabxsv:0000@10.1.1.120:4569
register => dppabxsv:0000@10.7.1.120:4569
register => jbpabxsv:0000@10.9.1.120:4569
tos=0x10
[guest]
type=user
context=default
callerid="Guest IAX User"
;
; Trust Caller*ID Coming from iaxtel.com
;
[iaxtel]
type=user
context=default
auth=rsa
inkeys=iaxtel
;
; Trust Caller*ID Coming from iax.fwdnet.net
;
[iaxfwd]
type=user
context=default
auth=rsa
inkeys=freeworlddialup
[ncpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.1.1.120
qualify=yes
requirecalltoken=no
[dppabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.7.1.120
qualify=yes
requirecalltoken=no
[ygpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.8.1.120
qualify=yes
requirecalltoken=no
[jbpabxsv]
type=friend
auth=md5
secret=0000
context=local
host=dynamic
defaultip=10.9.1.120
qualify=yes
requirecalltoken=no
Contoh meetme.conf:
[rooms]
;#include meetme_additional.conf
conf => 5000
conf => 6000
conf => 7000
Contoh voicemail.conf:
;
; Voicemail Configuration
;
;
; NOTE: Asterisk has to edit this file to change a user's password. This does
; not currently work with the "#include
; configuration files, nor when using realtime static configuration.
; Do not use them with this configuration file.
;
[general]
format=wav
serveremail=asterisk
fromstring=Asterisk PABX
sendvoicemail=yes
language=en
operator=no
envelope=yes
attach=yes
maxmsg=20
maxsecs=180
minsecs=6
maxgreet=60
skipms=3000
maxsilence=5
silencethreshold=128
maxlogins=3
emailbody=Anda mempunyai pesan baru
emaildateformat=%A, %d %B %Y at %H:%M:%S
mailcmd=/usr/sbin/sendmail -t
sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
; VoiceMailMain() [option 5 from mailbox's advanced menu].
; If set to 'no', option 5 will not be listed.
[default]
; isikan sebanyak extension yang anda miliki
9001 => 9001,medwinz,,,attach=no
9002 => 9002,medwinz,,,attach=no
[zonemessages]
yogyakarta=Asia/Jakarta|'vm-received' Q 'digits/at' R
Desain yang saya buat ini secara sederhana digambarkan dalam diagram dibawah
Ip phones mempunyai extension 9001 sampai dengan 9027. GSM gateway diperlakukan sebagai sip extension dengan nomer extension 9031 dan 9032. Lihat file sip.conf. Bagaimana membuat agar sebuah ip phone mempunyai nomor extensi? Ini tergantung dari ip phone yang anda gunakan, untuk langkah awal anda dapat menset sebuah dhcp untuk kemudian setiap ip-phone akan mengambil sebuah ip. Biasanya didalam sebuah ip-phone sudah ditanam sebuah webserver yang dapat diakses dari browser untuk selanjutnya kita beri nomor extensi. Proses ini sering dinamakan provision. Favorit saya untuk mem-provisi ip-phone adalah dengan menset sebuah ftp server yang kemudian setiap ip-phone akan mendownload konfigurasi dari ftp server tersebut. Lebih lengkapnya silakan baca manual ip-phone anda. Sekarang mari kita mulai membahas file extensions.conf. Yang penting diketahui bahwa dialplan itu terdiri dari beberapa context. Context ditandai dengan [...], misalnya [incoming], [internal-fxo], [internal-sip] dsb. Context ini saling berhubungan antara extensions.conf dengan file-file yang lain. Context akan mengatur perlakuan terhadap suatu incoming atau outgoing call oleh asterisk. Asterisk mengenal beberapa standard extensi yaitu:
i : invalid
s : start
h : hangup
t : timeout
T : absolute timeout
a : asterisk extension
o : operator
Yang biasanya sering digunakan adalah:
s : start : apa yang harus dilakukan oleh asterisk kalau ada incoming call
i : invalid entry : apa yang dilakukan kalau entry yang dimasukkan salah
t : time out : apa yang dilakukan kalau timeout sudah lewat
Sekarang coba kita perhatikan syntax extensions.conf berikut:
[internal-fxo]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Background(en/autoattendant)
exten => s,4,WaitExten(2)
Maka artinya kurang lebih adalah untuk context internal-fxo kalau ada telepon yang masuk maka yang harus dilakukan oleh asterisk adalah:
dijawab (diangkat) --> s,1,Answer
tunggu selama 1 detik --> s,2,Wait(1)
jalankan di latar belakang file /var/lib/asterisk/sound/en/autoattendant.gsm --> s,3,Background(en/autoattendant)
tunggu input keypad selama 2 detik --> s,4,WaitExten(2)
Mudahkan? ;)
Asterisk mempunyai beberapa aplikasi yang bisa dipanggil melalui extensions.conf yang saya gunakan di sini adalah VoiceMail yaitu aplikasi untuk meninggalkan pesan jika telepon tidak diangkat atau sibuk, meetme untuk melakukan conference call (percakapan dengan peserta lebih dari 2 orang), dan Monitor untuk merekam suatu percakapan ke dalam file. Mari kita lihat contoh extensions.conf:
[internal-fxo]
............
exten => 5000,1,MeetMe(5000)
exten => 6000,1,MeetMe(6000)
exten => 7000,1,MeetMe(7000)
Perhatikan juga contoh meetme.conf:
[rooms]
;#include meetme_additional.conf
conf => 5000
conf => 6000
conf => 7000
Kita telah mendefinisikan 3 ruangan untuk melakukan konferensi yaitu extensi 5000, 6000, dan 7000. Kemudian pada context [internal-fxo] di extensions.conf kita definisikan bahwa user yang mengakses extensi 5000, 6000 dan 7000 akan masuk ke ruangan konferensi. Mudahkan ;). Perlu diketahui bahwa ruangan konferensi ini tidak hanya bisa diakses oleh extensi lokal tetapi juga dari telepon di tempat lain, baik voip, GSM, atau PSTN. Misalnya kita ingin mengajak rekan kita yang kebetulan sedang diluar kantor untuk ikut meeting, maka kita dapat menghubungi handphonenya dan selanjutnya kita transfer ke 5000, 6000 atau 7000.
VoiceMail cukup mudah untuk dikonfigurasi jika kita menginginkannya. Ada beberapa flag yang digunakan untuk mengatur VoiceMail yaitu:
s : jika diberikan akan membuat pesan "Please leave your message after the tone. When done, hang up, or press the pound key" tidak dimainkan
u: jika diberikan akan memutar pesan "The person at extension ... 1234 ... is unavailable"
b: jika diberikan akan memutar pesan "The person at extension ... 1234 ... is busy"
Kita dapat mengkombinasikan flag tersebut misalnya:
su : pesan unavailable akan diputar tetapi pesan instruksi tidak
sb : pesan busy akan diputar tetapi pesan instruksi tidak
u : pesan unavailable akan diputar dilanjutkan dengan pesan instruksi
b : pesan busy akan diputar dilanjutkan dengan pesan instruksi
Pada context [incoming] di extensions.conf saya mendefinisikan:
exten => _XXXX,1,Answer
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(${EXTEN}@default,b)
exten => _XXXX,104,Hangup
Maksudnya kurang lebih adalahkalau ada yang men-dial extensi XXXX (sesuai dengan yg telah didefinisikan di sip.conf) misalya 9001 maka:
jawab
dial extension selama 20 detik (ini ditentukan pada context [globals] RINGDELAY => 20), kalau sudah lewat 20 detik maka
putar pesan unavailable dilanjutkan dengan instruksi untuk menyimpan pesan.
hangup
jika nada sibuk, putar pesan sibuk dilanjutkan dengan instruksi untuk menyimpan pesan
hangup
Pesan yang masuk akan disimpan pada /var/spool/asterisk/voicemail/context/boxnumber/INBOX. Misalnya dalam kasus di atas maka :
context = default, sesuai exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
boxnumber adalah mailbox untuk nomer extensi tertentu, misalnya untuk extensi 9001 kebetulan saya set mailbox=9001 sama dengan nomor extensinya. Lihat file sip.conf di atas.
maka jika penelpon menelpon 9001 dan meninggalkan voicemail maka lokasi penyimpanannya pada /var/spool/asterisk/voicemail/default/9001/INBOX
Kita bisa menyimpan semua percakapan yang terjadi melalui asterisk dengan memanfaatkan aplikasi Monitor. Tentu saja untuk mengkonfigurasinya anda harus menanyakan policy mengenai hal ini kepada pemilik jaringan/asterisk di mana anda memasangnya. Karena hal ini berhubungan dengan privacy. Ada beberapa hal yang sebaiknya diperhatikan dalam mensetup Monitor, standar styntax adalah sebagai berikut: Monitor(ext,basename,flags). Penjelasan sederhananya adalah sebagai berikut:
ext : format sound file, defaultnya adalah .wav
basename : dalam contoh saya menggunakan Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S, ini akan mengakibatkan file disimpan dengan nama misalnya Call-8001-02125558785-20091222-161031.wav dimana 8001 adalah nomer extensi, 02125558785 adalah nomer yang dituju, 20091222 adalah tanggal-bulan-tahun, 161031 adalah jam-menit-detik. Demikian juga kalau incoming call, kalau anda berlangganan CID maka asterisk bisa membaca asterisk yang masuk, tetapi sekiranya anda tidak berlangganan CID maka incoming call akan disimpan dengan nama misalnya Call- -8019-20091222-122545.wav
m : adalah flag yang bila digunakan maka asterisk akan memanggil program diluar asterisk untuk mengkombinasikan dua buah sound file, in dan out, ke dalam sebuah file. Program yang dipanggil adalah sox. Kadang-kadang sox tidak bisa mengenali dan menggabungkan format sound (alaw) akibatnya seringkali kita menemukan untuk sebuah percakapan masih terdapat dua buah file, in dan out. Misalnya : Call-8019-723964-20091222-151827-in.wav dan Call-8019-723964-20091222-151827-out.wav
Untuk mengaktifkan Monitor tidaklah sulit, sebagai contoh perhatikan lagi file extensions.conf:
[internal-fxo]
.......
exten => _XXXX,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(su${EXTEN})
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(sb${EXTEN})
exten => _XXXX,104,Hangup()
Maksud dari baris ini:
untuk extensi xxxx, rekam percakapan dengan format Call-no.extensi-tanggal-jam
dial extensi xxxx dan dering selama 20 detik (masih ingat ya, yang diatas)
kalau lewat 20 detik maka aktifkan voicemail
kala nada sibuk aktifkan voicemail
hangup
Hmm... banyak juga ya. Mudah-mudahan tidak memusingkan. Masih ada beberapa hal di dalam extensions.conf yang akan saya jelaskan misalnya bagaimana mengkoneksi asterisk server di lokasi lain, bagaimana merekam pesan (recording untuk greeting), dan terutama pengaturan context yang berkaitan dengan channel dahdi dan sip.conf. Ada baiknya kita sudahi dulu, silakan diendapkan dan dibawa mimpi :-). Kita lanjutkan di tulisan berikutnya.
Stay tuned and have a lot of fun :-)
Medwinz's Notes
posted at
Asterisk 1.6.1 on openSUSE 11.1 (Part 3)
To enable asterisk to communicate with PSTN lines we should have either a VOIP-PSTN gateway or FXO card. I will not explain about VOIP-PSTN gateway, there are some service providers out there who provides this service for their customers. In my work I use Digium TDM 410P with 4 FXO port per card. There are some alternatives in the market like Sangoma, Rhino, etc, the important is we should make sure that it works with Asterisk either with dahdi driver or zaptel/zapata driver. Also if possible select the card that already has hardware echo-canceler. Echo is a problem in voip communication, and if you have card with no echo-canceler than your server CPU will busy do the job.
Just remember that Digium cards are no longer use zapata driver, and some changes has been made to the configuration file name and location, /etc/zaptel.conf become /etc/dahdi/system.conf and /etc/asterisk/zapata.conf become /etc/asterisk/chan_dahdi.conf
In the client site you can use any SIP client hardwares or softwares. Ekiga and Emphaty are the good choice for you who prefer GTK libraries and KCall and KPhone are for you who prefer Qt libraries. IP phone hardware now widely available in the market from cheap to high price, you can select any brand as long as it compatibles with Asterisk. In this project I choose Polycom IP-330, I also used Grandstream and Aastra in other implementation. In this implementation the owner also ask me to use Polycom KIRK Wireless Server 600V3 with Polycom DECT Handset 3040.
Now the time for the dialplan, extensions.conf, which is the core of asterisk implementation, as an example let me introduce you with my configuration. It is a good habit to always backup default asterisk configuration, and start the new configuration from the scratch.
My extensions.conf is:
; extensions.conf - the Asterisk dial plan
; Created by M. Edwin Z for xxxxxxxxxxxxxxxx
; medwinz@gmail.com
;
; Static extension configuration file, used by
; the pbx_config module. This is where you configure all your
; inbound and outbound calls in Asterisk.
;
; This configuration file is reloaded
; - With the "dialplan reload" command in the CLI
; - With the "reload" command (that reloads everything) in the CLI
;
[general]
static=yes
writeprotect=yes
[globals]
RINGDELAY => 20
DYNAMIC_FEATURES => automon
[incoming]
exten => s,1,Answer
exten => s,2,Background(en/greeting-indonesia)
exten => s,3,Hangup()
exten => h,1,Hangup()
exten => 9999,1,VoiceMailMain()
exten => asterisk,1,VoicemailMain()
exten => 5000,1,Set(CHANNEL(language)=en) ; conference 1
exten => 5000,2,Meetme(5000)
exten => 5000,3,Hangup
exten => 6000,1,Set(CHANNEL(language)=en) ; conference 2
exten => 6000,2,Meetme(6000)
exten => 6000,3,Hangup
exten => 7000,1,Set(CHANNEL(language)=en) ; conference 3
exten => 7000,2,Meetme(7000)
exten => 7000,3,Hangup
exten => _XXXX,1,Answer
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(${EXTEN}@default,b)
exten => _XXXX,104,Hangup
[internal-fxo]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Background(en/autoattendant)
exten => s,4,WaitExten(2)
exten => 5000,1,MeetMe(5000)
exten => 6000,1,MeetMe(6000)
exten => 7000,1,MeetMe(7000)
exten => _XXXX,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(su${EXTEN})
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(sb${EXTEN})
exten => _XXXX,104,Hangup()
exten => h,1,Hangup()
exten => t,1,Monitor(wav,Call-${CALLERID(num)}-9019-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => t,2,Dial(SIP/9019&SIP/9006&SIP/9007&SIP/9001&SIP/9002&SIP/9015,${RINGDELAY},t)
exten => t,3,Hangup
exten => t,305,Dial(SIP/9001&SIP/9002&SIP/9003&SIP/9004&SIP/9005&SIP/9006&SIP/9007&SIP/9008&SIP/9009&SIP/9010&SIP/9011&SIP/9016&SIP/9017&SIP/9018&SIP/9019)
exten => t,306,Hangup
include => incoming
[internal-fxs]
include => incoming
[internal-sip]
exten => _1.,1,Dial(IAX2/ygpabxsv:0000@10.1.1.120/${EXTEN:1}@local)
exten => _1.,2,Hangup()
exten => _2.,1,Dial(IAX2/ygpabxsv:0000@10.7.1.120/${EXTEN:1}@local)
exten => _2.,2,Hangup()
;;GSM call to Telkomsel/HALO
exten => _000811.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000811.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000811.,3,Hangup
;;GSM call to Telkomsel/Simpati
exten => _000812.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000812.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000812.,3,Hangup
;;GSM call to Telkomsel/Simpati
exten => _000813.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000813.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000813.,3,Hangup
;GSM call to Telkomsel/As
exten => _000852.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000852.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000852.,3,Hangup
;;GSM call to Telkomsel/As
exten => _000853.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000853.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000853.,3,Hangup
;;GSM call to Indosat
exten => _000814.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000814.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000814.,3,Hangup
;;GSM call to Indosat
exten => _000815.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000815.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000815.,3,Hangup
;;GSM call to Indosat
exten => _000816.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000816.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000816.,3,Hangup
;;GSM call to Indosat
exten => _000855.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000855.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000855.,3,Hangup
;;GSM call to Indosat
exten => _000856.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000856.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000856.,3,Hangup
;;GSM call to Indosat
exten => _000857.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000857.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000857.,3,Hangup
;;GSM call to Indosat
exten => _000858.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000858.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000858.,3,Hangup
;;GSM call to XL
exten => _000817.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000817.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000817.,3,Hangup
;;GSM call to XL
exten => _000818.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000818.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000818.,3,Hangup
;;GSM call to XL
exten => _000819.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000819.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000819.,3,Hangup
;;GSM call to XL
exten => _000859.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000859.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000859.,3,Hangup
;GSM call to XL
exten => _000878.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000878.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000878.,3,Hangup
;GSM call to 3
exten => _000898.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000898.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000898.,3,Hangup
;GSM call to 3
exten => _000899.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000899.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000899.,3,Hangup
;;GSM call to Axis
; exten => _000831.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
; exten => _000831.,2,Dial(SIP/9032/${EXTEN:1})
; exten => _000831.,3,Hangup
;;GSM call to Axis
; exten => _000838.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
;exten => _000838.,2,Dial(SIP/9032/${EXTEN:1})
;exten => _000838.,3,Hangup
include => global
include => incoming
[global]
exten => _0.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:1}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _0.,2,Dial(DAHDI/g1/${EXTEN:1})
exten => _0.,3,Hangup
exten => _0.,103,Playback(en/tt-allbusy)
exten => _0.,104,Hangup
[recordings]
exten => 500,1,Answer
exten => 500,2,Playback(en/silakanrekamgreeting)
exten => 500,3,Record(en/mymessage:gsm)
exten => 500,4,Playback(en/pesananda)
exten => 500,5,Playback(en/mymessage)
exten => 500,6,Playback(en/tekan1)
exten => 500,7,WaitExten(3)
exten => t,1,Playback(en/maafmohonulangi)
exten => t,2,Goto(500,5)
exten => i,1,Playback(en/pesanandasalah)
exten => i,2,Goto(500,5)
exten => 1,1,System(/bin/mv /var/lib/asterisk/sounds/en/mymessage.gsm /var/lib/asterisk/sounds/en/autoattendant.gsm)
exten => 1,2,Playback(en/terimakasih)
exten => 1,3,Playback(en/tekan3)
exten => 2,1,Goto(500,1)
exten => 3,1,Goto(500,1)
exten => 4,1,Hangup
include => internal-sip
[local]
;
; Master context for local, toll-free, and iaxtel calls only
;
ignorepat => 9
include => default
include => parkedcalls
include => internal-sip
[default]
include => internal-sip
I know it seems make pain in your head, so now take a cup of coffee, read the above configuration carefully until it comes up into your dream :-) . I will explain everything in the next post.
Have a lot of fun.
Just remember that Digium cards are no longer use zapata driver, and some changes has been made to the configuration file name and location, /etc/zaptel.conf become /etc/dahdi/system.conf and /etc/asterisk/zapata.conf become /etc/asterisk/chan_dahdi.conf
In the client site you can use any SIP client hardwares or softwares. Ekiga and Emphaty are the good choice for you who prefer GTK libraries and KCall and KPhone are for you who prefer Qt libraries. IP phone hardware now widely available in the market from cheap to high price, you can select any brand as long as it compatibles with Asterisk. In this project I choose Polycom IP-330, I also used Grandstream and Aastra in other implementation. In this implementation the owner also ask me to use Polycom KIRK Wireless Server 600V3 with Polycom DECT Handset 3040.
Now the time for the dialplan, extensions.conf, which is the core of asterisk implementation, as an example let me introduce you with my configuration. It is a good habit to always backup default asterisk configuration, and start the new configuration from the scratch.
My extensions.conf is:
; extensions.conf - the Asterisk dial plan
; Created by M. Edwin Z for xxxxxxxxxxxxxxxx
; medwinz@gmail.com
;
; Static extension configuration file, used by
; the pbx_config module. This is where you configure all your
; inbound and outbound calls in Asterisk.
;
; This configuration file is reloaded
; - With the "dialplan reload" command in the CLI
; - With the "reload" command (that reloads everything) in the CLI
;
[general]
static=yes
writeprotect=yes
[globals]
RINGDELAY => 20
DYNAMIC_FEATURES => automon
[incoming]
exten => s,1,Answer
exten => s,2,Background(en/greeting-indonesia)
exten => s,3,Hangup()
exten => h,1,Hangup()
exten => 9999,1,VoiceMailMain()
exten => asterisk,1,VoicemailMain()
exten => 5000,1,Set(CHANNEL(language)=en) ; conference 1
exten => 5000,2,Meetme(5000)
exten => 5000,3,Hangup
exten => 6000,1,Set(CHANNEL(language)=en) ; conference 2
exten => 6000,2,Meetme(6000)
exten => 6000,3,Hangup
exten => 7000,1,Set(CHANNEL(language)=en) ; conference 3
exten => 7000,2,Meetme(7000)
exten => 7000,3,Hangup
exten => _XXXX,1,Answer
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(${EXTEN}@default,u)
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(${EXTEN}@default,b)
exten => _XXXX,104,Hangup
[internal-fxo]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Background(en/autoattendant)
exten => s,4,WaitExten(2)
exten => 5000,1,MeetMe(5000)
exten => 6000,1,MeetMe(6000)
exten => 7000,1,MeetMe(7000)
exten => _XXXX,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _XXXX,2,Dial(SIP/${EXTEN},${RINGDELAY},t)
exten => _XXXX,3,Voicemail(su${EXTEN})
exten => _XXXX,4,Hangup()
exten => _XXXX,103,Voicemail(sb${EXTEN})
exten => _XXXX,104,Hangup()
exten => h,1,Hangup()
exten => t,1,Monitor(wav,Call-${CALLERID(num)}-9019-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => t,2,Dial(SIP/9019&SIP/9006&SIP/9007&SIP/9001&SIP/9002&SIP/9015,${RINGDELAY},t)
exten => t,3,Hangup
exten => t,305,Dial(SIP/9001&SIP/9002&SIP/9003&SIP/9004&SIP/9005&SIP/9006&SIP/9007&SIP/9008&SIP/9009&SIP/9010&SIP/9011&SIP/9016&SIP/9017&SIP/9018&SIP/9019)
exten => t,306,Hangup
include => incoming
[internal-fxs]
include => incoming
[internal-sip]
exten => _1.,1,Dial(IAX2/ygpabxsv:0000@10.1.1.120/${EXTEN:1}@local)
exten => _1.,2,Hangup()
exten => _2.,1,Dial(IAX2/ygpabxsv:0000@10.7.1.120/${EXTEN:1}@local)
exten => _2.,2,Hangup()
;;GSM call to Telkomsel/HALO
exten => _000811.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000811.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000811.,3,Hangup
;;GSM call to Telkomsel/Simpati
exten => _000812.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000812.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000812.,3,Hangup
;;GSM call to Telkomsel/Simpati
exten => _000813.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000813.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000813.,3,Hangup
;GSM call to Telkomsel/As
exten => _000852.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000852.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000852.,3,Hangup
;;GSM call to Telkomsel/As
exten => _000853.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000853.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000853.,3,Hangup
;;GSM call to Indosat
exten => _000814.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000814.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000814.,3,Hangup
;;GSM call to Indosat
exten => _000815.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000815.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000815.,3,Hangup
;;GSM call to Indosat
exten => _000816.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000816.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000816.,3,Hangup
;;GSM call to Indosat
exten => _000855.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000855.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000855.,3,Hangup
;;GSM call to Indosat
exten => _000856.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000856.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000856.,3,Hangup
;;GSM call to Indosat
exten => _000857.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000857.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000857.,3,Hangup
;;GSM call to Indosat
exten => _000858.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000858.,2,Dial(SIP/9031/${EXTEN:1})
exten => _000858.,3,Hangup
;;GSM call to XL
exten => _000817.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000817.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000817.,3,Hangup
;;GSM call to XL
exten => _000818.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000818.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000818.,3,Hangup
;;GSM call to XL
exten => _000819.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000819.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000819.,3,Hangup
;;GSM call to XL
exten => _000859.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000859.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000859.,3,Hangup
;GSM call to XL
exten => _000878.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000878.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000878.,3,Hangup
;GSM call to 3
exten => _000898.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000898.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000898.,3,Hangup
;GSM call to 3
exten => _000899.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _000899.,2,Dial(SIP/9032/${EXTEN:1})
exten => _000899.,3,Hangup
;;GSM call to Axis
; exten => _000831.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
; exten => _000831.,2,Dial(SIP/9032/${EXTEN:1})
; exten => _000831.,3,Hangup
;;GSM call to Axis
; exten => _000838.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:2}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
;exten => _000838.,2,Dial(SIP/9032/${EXTEN:1})
;exten => _000838.,3,Hangup
include => global
include => incoming
[global]
exten => _0.,1,Monitor(wav,Call-${CALLERID(num)}-${EXTEN:1}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},m)
exten => _0.,2,Dial(DAHDI/g1/${EXTEN:1})
exten => _0.,3,Hangup
exten => _0.,103,Playback(en/tt-allbusy)
exten => _0.,104,Hangup
[recordings]
exten => 500,1,Answer
exten => 500,2,Playback(en/silakanrekamgreeting)
exten => 500,3,Record(en/mymessage:gsm)
exten => 500,4,Playback(en/pesananda)
exten => 500,5,Playback(en/mymessage)
exten => 500,6,Playback(en/tekan1)
exten => 500,7,WaitExten(3)
exten => t,1,Playback(en/maafmohonulangi)
exten => t,2,Goto(500,5)
exten => i,1,Playback(en/pesanandasalah)
exten => i,2,Goto(500,5)
exten => 1,1,System(/bin/mv /var/lib/asterisk/sounds/en/mymessage.gsm /var/lib/asterisk/sounds/en/autoattendant.gsm)
exten => 1,2,Playback(en/terimakasih)
exten => 1,3,Playback(en/tekan3)
exten => 2,1,Goto(500,1)
exten => 3,1,Goto(500,1)
exten => 4,1,Hangup
include => internal-sip
[local]
;
; Master context for local, toll-free, and iaxtel calls only
;
ignorepat => 9
include => default
include => parkedcalls
include => internal-sip
[default]
include => internal-sip
I know it seems make pain in your head, so now take a cup of coffee, read the above configuration carefully until it comes up into your dream :-) . I will explain everything in the next post.
Have a lot of fun.
Medwinz's Notes
posted at
Asterisk 1.6.1 on openSUSE 11.1 (Part 2)
In this second part I will explain step-by-step configuration to use our appliance to build an Asterisk PABX server. Without further ado, here is the list:
Install the Digium card on the PCI slot
Install our appliance. You can also use any linux distribution, download asterisk from its website and install it.
It is always useful to update your installation to update repository, to make sure that all the security update is up to date.
Download the latest dahdi from trunk and install it. Don't forget you should connected to internet to run this command as root
“cd dahdi-linux”
“make”
and follow the instructions on the screen.
If all the installation successful, then you will have :
/etc/dahdi/
/etc/asterisk/
/var/lib/asterisk/
/var/spool/asterisk/
/etc/init.d/dahdi
/etc/init.d/asterisk161
/usr/sbin/asterisk
/usr/sbin/dahdi_genconf (and several dahdi-tools files)
Connect the telephone line(s) to your digium. Make sure that all the telephone lines are functioning before you connect it (please pay your bill if you don't to that yet, otherwise the announcement in the telephone lines will screw up your asterisk :-)).
As root run “/usr/sbin/dahdi_genconf”. This command will generate the automatic configuration for digium card in file /etc/dahdi/system.conf. In my server it contains:
# Autogenerated by /usr/sbin/dahdi_genconf on Tue Nov 17 18:38:30 2009
# If you edit this file and execute /usr/sbin/dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCTDM/0 "Wildcard TDM410P Board 1" (MASTER)
fxsks=1
echocanceller=mg2,1
fxsks=2
echocanceller=mg2,2
fxsks=3
echocanceller=mg2,3
fxsks=4
echocanceller=mg2,4
# Span 2: WCTDM/1 "Wildcard TDM410P Board 2"
fxsks=5
echocanceller=mg2,5
fxsks=6
echocanceller=mg2,6
fxsks=7
echocanceller=mg2,7
fxsks=8
echocanceller=mg2,8
# Span 3: WCTDM/2 "Wildcard TDM410P Board 3"
fxsks=9
echocanceller=mg2,9
fxsks=10
echocanceller=mg2,10
fxsks=11
echocanceller=mg2,11
fxsks=12
echocanceller=mg2,12
# Global data
loadzone = nl
defaultzone = nl
Actually default loadzone and defaultzone is “us” but I change it to “nl” which is according to ITU is close to Indonesia signaling system. Please check ITU Operational Bulletin No. 781 – 1.II.2003. At least busy tone, congestion tone, and dial tone are running in the same frequency and cadence. If you want you can also rebuild asterisk so that it already contain the frequency and cadence for your country.
Besides /etc/dahdi/system.conf, dahdi_genconf will also automatically configure the file /etc/asterisk/dahdi-channels.conf. In my installation the content of the file is:
; Autogenerated by /usr/sbin/dahdi_genconf on Tue Nov 17 18:38:30 2009
; If you edit this file and execute /usr/sbin/dahdi_genconf again,
; your manual changes will be LOST.
; Dahdi Channels Configurations (chan_dahdi.conf)
;
; This is not intended to be a complete chan_dahdi.conf. Rather, it is intended
; to be #include-d by /etc/chan_dahdi.conf that will include the global settings
;
; Span 1: WCTDM/0 "Wildcard TDM410P Board 1" (MASTER)
;;; line="1 WCTDM/0/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/0/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/0/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
callerid=
group=
context=default
;;; line="4 WCTDM/0/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 4
callerid=
group=
context=default
; Span 2: WCTDM/1 "Wildcard TDM410P Board 2"
;;; line="5 WCTDM/1/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 5
callerid=
group=
context=default
;;; line="6 WCTDM/1/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 6
callerid=
group=
context=default
;;; line="7 WCTDM/1/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 7
callerid=
group=
context=default
;;; line="8 WCTDM/1/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 8
callerid=
group=
context=default
; Span 3: WCTDM/2 "Wildcard TDM410P Board 3"
;;; line="9 WCTDM/2/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 9
callerid=
group=
context=default
;;; line="10 WCTDM/2/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 10
callerid=
group=
context=default
;;; line="11 WCTDM/2/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 11
callerid=
group=
context=default
;;; line="12 WCTDM/2/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 12
callerid=
group=
context=default
The core of the asterisk configuration is dialplan. Dialplan manage how asterisk handle all the incoming and outgoing call. It can consist of 3 lines but also can reach tenth or hundreds lines, depends on how the complexity of our configuration. We can also use macro feature on asterisk. Dialplan is placed on /etc/asterisk/extensions.conf. My extensions.conf manage how the incoming call should be handled, how to make outgoing call to PSTN, GSM line and sip extensions, how to make conference call, how to connect to other asterisk server using IAX2 protocol, use the monitor application to record the conversation and how to make greeting. I will explain our extensions.conf in more detail in the next post together with sip.conf, iax.conf, meetme.conf and voicemail.conf.
Stay tuned and have a lot of fun :-)
Install the Digium card on the PCI slot
Install our appliance. You can also use any linux distribution, download asterisk from its website and install it.
It is always useful to update your installation to update repository, to make sure that all the security update is up to date.
Download the latest dahdi from trunk and install it. Don't forget you should connected to internet to run this command as root
“cd dahdi-linux”
“make”
and follow the instructions on the screen.
If all the installation successful, then you will have :
/etc/dahdi/
/etc/asterisk/
/var/lib/asterisk/
/var/spool/asterisk/
/etc/init.d/dahdi
/etc/init.d/asterisk161
/usr/sbin/asterisk
/usr/sbin/dahdi_genconf (and several dahdi-tools files)
Connect the telephone line(s) to your digium. Make sure that all the telephone lines are functioning before you connect it (please pay your bill if you don't to that yet, otherwise the announcement in the telephone lines will screw up your asterisk :-)).
As root run “/usr/sbin/dahdi_genconf”. This command will generate the automatic configuration for digium card in file /etc/dahdi/system.conf. In my server it contains:
# Autogenerated by /usr/sbin/dahdi_genconf on Tue Nov 17 18:38:30 2009
# If you edit this file and execute /usr/sbin/dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCTDM/0 "Wildcard TDM410P Board 1" (MASTER)
fxsks=1
echocanceller=mg2,1
fxsks=2
echocanceller=mg2,2
fxsks=3
echocanceller=mg2,3
fxsks=4
echocanceller=mg2,4
# Span 2: WCTDM/1 "Wildcard TDM410P Board 2"
fxsks=5
echocanceller=mg2,5
fxsks=6
echocanceller=mg2,6
fxsks=7
echocanceller=mg2,7
fxsks=8
echocanceller=mg2,8
# Span 3: WCTDM/2 "Wildcard TDM410P Board 3"
fxsks=9
echocanceller=mg2,9
fxsks=10
echocanceller=mg2,10
fxsks=11
echocanceller=mg2,11
fxsks=12
echocanceller=mg2,12
# Global data
loadzone = nl
defaultzone = nl
Actually default loadzone and defaultzone is “us” but I change it to “nl” which is according to ITU is close to Indonesia signaling system. Please check ITU Operational Bulletin No. 781 – 1.II.2003. At least busy tone, congestion tone, and dial tone are running in the same frequency and cadence. If you want you can also rebuild asterisk so that it already contain the frequency and cadence for your country.
Besides /etc/dahdi/system.conf, dahdi_genconf will also automatically configure the file /etc/asterisk/dahdi-channels.conf. In my installation the content of the file is:
; Autogenerated by /usr/sbin/dahdi_genconf on Tue Nov 17 18:38:30 2009
; If you edit this file and execute /usr/sbin/dahdi_genconf again,
; your manual changes will be LOST.
; Dahdi Channels Configurations (chan_dahdi.conf)
;
; This is not intended to be a complete chan_dahdi.conf. Rather, it is intended
; to be #include-d by /etc/chan_dahdi.conf that will include the global settings
;
; Span 1: WCTDM/0 "Wildcard TDM410P Board 1" (MASTER)
;;; line="1 WCTDM/0/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default
;;; line="2 WCTDM/0/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default
;;; line="3 WCTDM/0/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
callerid=
group=
context=default
;;; line="4 WCTDM/0/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 4
callerid=
group=
context=default
; Span 2: WCTDM/1 "Wildcard TDM410P Board 2"
;;; line="5 WCTDM/1/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 5
callerid=
group=
context=default
;;; line="6 WCTDM/1/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 6
callerid=
group=
context=default
;;; line="7 WCTDM/1/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 7
callerid=
group=
context=default
;;; line="8 WCTDM/1/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 8
callerid=
group=
context=default
; Span 3: WCTDM/2 "Wildcard TDM410P Board 3"
;;; line="9 WCTDM/2/0"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 9
callerid=
group=
context=default
;;; line="10 WCTDM/2/1"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 10
callerid=
group=
context=default
;;; line="11 WCTDM/2/2"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 11
callerid=
group=
context=default
;;; line="12 WCTDM/2/3"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 12
callerid=
group=
context=default
The core of the asterisk configuration is dialplan. Dialplan manage how asterisk handle all the incoming and outgoing call. It can consist of 3 lines but also can reach tenth or hundreds lines, depends on how the complexity of our configuration. We can also use macro feature on asterisk. Dialplan is placed on /etc/asterisk/extensions.conf. My extensions.conf manage how the incoming call should be handled, how to make outgoing call to PSTN, GSM line and sip extensions, how to make conference call, how to connect to other asterisk server using IAX2 protocol, use the monitor application to record the conversation and how to make greeting. I will explain our extensions.conf in more detail in the next post together with sip.conf, iax.conf, meetme.conf and voicemail.conf.
Stay tuned and have a lot of fun :-)
Medwinz's Notes
posted at
Asterisk 1.6.1 on openSUSE 11.1 (Part 1)
In several articles from this one, I will share some of my experience in preparing emergency operation center for disaster management in Indonesia. One of the software we implement in this project is Asterisk. I use Asterisk 1.6.1.5 from openSUSE repository. Actually I built a custom 64 bit appliance using KDE 4.3 from factory repositories through SUSE Studio and took Asterisk from openSUSE Build Service repositories. Well, it was a couple years ago (by the time I submit this post), but I believe it still useful for anyone learning Asterisk :-) I also used DAHDI (Digium Asterisk Hardware Device Interface), but during the implementation I have a problem with Indonesia PSTN telephone signaling so I should download dahdi trunk version from digium subversion server to make the digium card works.
Here are the hardware I use:
In this project, Asterisk will be use to setup the voip communication between this site in Denpasar/Bali with the headquarter (HQ) in Jakarta as well as with other regional center in Java and Sumatera. Also Asterisk will act as traditional PBX to connect this site to PSTN lines as well as to GSM/CDMA lines. Every conversation through the PABX will be recorded by monitor application in Asterisk.
Before we go any further lets discuss a logical design about our setup. There is one HQ and several remote site including this one in Bali. This site is special because it's also act as second node beside HQ that can receive and transmit voip traffic to other center. The setup of every site is similar like the diagram below.
All the digium card provide 12 lines of PSTN, in this case we only use 10 lines. We then use RJ 12 coupler so that every line goes to 2 PBX server, PABXSV1 and PABXSV2. The PABXSV2 will become the backup asterisk in case the PABXSV1 is downed. We can use vrrpd or heartbeat (with DRBD) to control the service so that PABXSV2 can take over all the service from PABXSV1. More on this later.
I use stock asterisk and dahdi from OBS. While the asterisk is ok, dahdi in the OBS is not sufficient for Indonesia telephone lines (at least at the time I made the appliance). The root cause of the problem is that Indonesia PSTN line provided by Telkom is already equipped with the CID (caller identifier) but the service is not open to the end customer until the customer pay the service charge. But actually the CID is there and asterisk knows it but cannot open it. So it can answer the ring but if another call comes, suddenly it get confuse how to handle it and hangup the line. Off course we should make a good configuration not just downloading the trunk version.
I should thanks some good people who currently help me maintain the server, I should mentioned here:
Pak Wayan Sudana, Ketua KPLI Bali
Mas Adhi Wus, linuxer dari Denpasar
Mas Yan Arief (dkk), openSUSE user dari Yogyakarta
In the next post I will explain some configuration that I used, till then keep safe and have a lot of fun.
Here are the hardware I use:
- 2 HP tower based server with 8 GB memory (it is overkill actually, but the owner insist it) running in high availability. See the pictures here and here.
- 10 PSTN lines
- 3 Digium TDM 410P cards (with 4 FXO ports per card and hardware echo canceler) per server
- several RJ12 coupler
- RJ 12 cables
- 2 Zed-3 GS8 GSM gateway, each with 2 GSM modules
- Several Polycom IP-330 with PoE
- Polycom KIRK Wireless Server 600V3
In this project, Asterisk will be use to setup the voip communication between this site in Denpasar/Bali with the headquarter (HQ) in Jakarta as well as with other regional center in Java and Sumatera. Also Asterisk will act as traditional PBX to connect this site to PSTN lines as well as to GSM/CDMA lines. Every conversation through the PABX will be recorded by monitor application in Asterisk.
Before we go any further lets discuss a logical design about our setup. There is one HQ and several remote site including this one in Bali. This site is special because it's also act as second node beside HQ that can receive and transmit voip traffic to other center. The setup of every site is similar like the diagram below.
All the digium card provide 12 lines of PSTN, in this case we only use 10 lines. We then use RJ 12 coupler so that every line goes to 2 PBX server, PABXSV1 and PABXSV2. The PABXSV2 will become the backup asterisk in case the PABXSV1 is downed. We can use vrrpd or heartbeat (with DRBD) to control the service so that PABXSV2 can take over all the service from PABXSV1. More on this later.
I use stock asterisk and dahdi from OBS. While the asterisk is ok, dahdi in the OBS is not sufficient for Indonesia telephone lines (at least at the time I made the appliance). The root cause of the problem is that Indonesia PSTN line provided by Telkom is already equipped with the CID (caller identifier) but the service is not open to the end customer until the customer pay the service charge. But actually the CID is there and asterisk knows it but cannot open it. So it can answer the ring but if another call comes, suddenly it get confuse how to handle it and hangup the line. Off course we should make a good configuration not just downloading the trunk version.
I should thanks some good people who currently help me maintain the server, I should mentioned here:
Pak Wayan Sudana, Ketua KPLI Bali
Mas Adhi Wus, linuxer dari Denpasar
Mas Yan Arief (dkk), openSUSE user dari Yogyakarta
In the next post I will explain some configuration that I used, till then keep safe and have a lot of fun.
Medwinz's Notes
posted at
Ini Adalah Sebuah Proses
Setelah sekian lama tidak menulis, saya beranikan untuk menulis lagi walau kali ini mungkin tulisan saya terkesan berkeluh kesah :-) Saya memang menghindari menulis di blog ini selama beberapa waktu, terakhir sekitar bulan Maret 2011 saat openSUSE 11.4 dirilis. Sekarang 12.1 sudah rilis ya kemarin. Kudos to all. Ya memang ada beberapa perubahan mendasar seperti systemd, silakan dibaca-baca dulu dari sumber-sumber di internet apa sih systemd itu (just search in google, o iya thanks to Lennart Poettering and Kay Sievers for the breakthrough and brave move!).
Back to the laptop eh.. subyek ... whatever it is, saya tidak menulis karena saya takut suasana pekerjaan saya mempengaruhi tulisan saya. Iya kali ini pekerjaan saya menguras emosi dan logika saya he..he...he... Sebagai seorang "opensource believer" yang dapat kerjaan untuk menyebarkannya di kalangan pendidikan dasar dan menengah ternyata membuat saya hampir putus asa. Hanya kesadaran bahwa apa yang saya lakukan ini mungkin bisa dinilai Tuhan sebagai amal jariah agar anak-anak dan adik-adik kita menjadi generasi yang lebih baik dari generasi saya yang membuat saya tetap bertahan. Dan mungkin juga karena saya seorang pemimpi that just want to make my dream come true :-)
Saya bolak-balik Jakarta dan tempat kerja saya, about 600 km several times in a month. Seringkali saya menemukan hal-hal yang tidak sesuai dengan hati kecil saya. Dalam satu acara, seorang pendidik mempresentasikan hasil kerjanya yang penuh dengan "right to copy" tanpa memperhatikan aspek legalitas suatu karya. Saya katakan mohon jika mengutip pekerjaan orang lain pelajari dulu lisensinya, proprietary, gpl, Creative Commons Attribution-Share Alike atau apa? Kita sering menyalahkan orang melakukan korupsi atau menghakimi orang yang mencuri, tetapi kita membiasakan diri melakukannya dan memberi contoh kepada anak didik mengenai pencurian hak cipta. What a mess :-( Mengapa berlaku jujur menjadi suatu hal yang sulit dilakukan?
Saya juga agak kecewa ketika membaca adanya pelajaran yang kurikulumnya disusun oleh Kementerian Pendidikan dan menyebutkan penggunaan software proprietary dengan gamblang. Kenapa kita selalu terjebak dengan hal-hal yang membuat hidup ini seperti tidak ada pilihan. Berikanlah kebebasan atas pilihan-pilhan dalam hidup ini, niscaya orang akan bertanggungjawab terhadap pilihan yang mereka lakukan. Ketika tahun 2009 saya ditawari pekerjaan ini sebenarnya pada saat yang sama ada satu tawaran dari sebuah perusahaan high-tech multinasional bermarkas di Eropa pada saya yang kalau dilihat dari sisi finansial berkali lipat besarnya. Saat itu saya menolaknya dengan pertimbangan kapan lagi saya bisa menyumbangkan sesuatu bagi perkembangan opensource sekaligus memberikan sumbangsih bagi kemajuan pendidikan di Indonesia. Tetapi sekarang saya kadang merasa mungkin pilihan saya waktu itu salah, saya agak frustasi dengan kondisi implementasi, kemampuan dan kemauan guru untuk menggunakan opensource, serta yang paling berat adalah kurikulum yang terasa tidak pro opensource. Saya merasa tidak akan berhasil.
Saat ini saya belum menyerah, bulan-bulan ke depan ini akan menjadi bulan-bulan yang sibuk. Kita akan melanjutkan implementasi di lebih dari 200 sekolah, menyempurnakan pusat data dan memperbaiki kondisi koneksi ke pusat data. Semangat harus dikumpulkan, logika dan emosi harus dijaga ketahanannya, hampir setiap hari saya jogging untuik mengimbangi this turbulence condition. Tidak mudah mencapai suatu tujuan, ini adalah sebuah proses.
Back to the laptop eh.. subyek ... whatever it is, saya tidak menulis karena saya takut suasana pekerjaan saya mempengaruhi tulisan saya. Iya kali ini pekerjaan saya menguras emosi dan logika saya he..he...he... Sebagai seorang "opensource believer" yang dapat kerjaan untuk menyebarkannya di kalangan pendidikan dasar dan menengah ternyata membuat saya hampir putus asa. Hanya kesadaran bahwa apa yang saya lakukan ini mungkin bisa dinilai Tuhan sebagai amal jariah agar anak-anak dan adik-adik kita menjadi generasi yang lebih baik dari generasi saya yang membuat saya tetap bertahan. Dan mungkin juga karena saya seorang pemimpi that just want to make my dream come true :-)
Saya bolak-balik Jakarta dan tempat kerja saya, about 600 km several times in a month. Seringkali saya menemukan hal-hal yang tidak sesuai dengan hati kecil saya. Dalam satu acara, seorang pendidik mempresentasikan hasil kerjanya yang penuh dengan "right to copy" tanpa memperhatikan aspek legalitas suatu karya. Saya katakan mohon jika mengutip pekerjaan orang lain pelajari dulu lisensinya, proprietary, gpl, Creative Commons Attribution-Share Alike atau apa? Kita sering menyalahkan orang melakukan korupsi atau menghakimi orang yang mencuri, tetapi kita membiasakan diri melakukannya dan memberi contoh kepada anak didik mengenai pencurian hak cipta. What a mess :-( Mengapa berlaku jujur menjadi suatu hal yang sulit dilakukan?
Saya juga agak kecewa ketika membaca adanya pelajaran yang kurikulumnya disusun oleh Kementerian Pendidikan dan menyebutkan penggunaan software proprietary dengan gamblang. Kenapa kita selalu terjebak dengan hal-hal yang membuat hidup ini seperti tidak ada pilihan. Berikanlah kebebasan atas pilihan-pilhan dalam hidup ini, niscaya orang akan bertanggungjawab terhadap pilihan yang mereka lakukan. Ketika tahun 2009 saya ditawari pekerjaan ini sebenarnya pada saat yang sama ada satu tawaran dari sebuah perusahaan high-tech multinasional bermarkas di Eropa pada saya yang kalau dilihat dari sisi finansial berkali lipat besarnya. Saat itu saya menolaknya dengan pertimbangan kapan lagi saya bisa menyumbangkan sesuatu bagi perkembangan opensource sekaligus memberikan sumbangsih bagi kemajuan pendidikan di Indonesia. Tetapi sekarang saya kadang merasa mungkin pilihan saya waktu itu salah, saya agak frustasi dengan kondisi implementasi, kemampuan dan kemauan guru untuk menggunakan opensource, serta yang paling berat adalah kurikulum yang terasa tidak pro opensource. Saya merasa tidak akan berhasil.
Saat ini saya belum menyerah, bulan-bulan ke depan ini akan menjadi bulan-bulan yang sibuk. Kita akan melanjutkan implementasi di lebih dari 200 sekolah, menyempurnakan pusat data dan memperbaiki kondisi koneksi ke pusat data. Semangat harus dikumpulkan, logika dan emosi harus dijaga ketahanannya, hampir setiap hari saya jogging untuik mengimbangi this turbulence condition. Tidak mudah mencapai suatu tujuan, ini adalah sebuah proses.
Medwinz's Notes
posted at
Proyek Penerjemahan Dokumentasi openSUSE
Mengingat pengguna openSUSE di Indonesia yang semakin lama semakin banyak jumlahnya, Andi Sugandi, Ketua openSUSE-Indonesia, dan saya terlibat dalam suatu diskusi kecil melalui email dan twitter untuk coba mengangkat kemungkinan menterjemahkan dokumentasi openSUSE ke dalam Bahasa Indonesia. Secara infrastruktur pihak openSUSE, melalui Frank Sundermeyer sebagai dokumenter openSUSE juga sudah menyediakan fasilitas svn untuk proyek ini dalam server svn mereka.
Tentu saja saya membutukan banyak bantuan dan kontribusi dari rekan-reakan sekalian. Jadi sekiranya anda menguasai Bahasa Inggris setidaknya pasif, ada keinginan untuk berkontribusi, punya waktu, dan komitmen memajukan openSUSE di Indonesia, maka anda bisa bergabung ke dalam tim ini. Mengenai hal teknis, bagaimana cara penerjemahannya, bagaimana pembagian kerjanya, tools apa yang dipakai nanti akan kita jelaskan melalui online meeting melalui IRC dan tulisan di blog setelah ada rekan-rekan yang tertarik terlibat. Anda tidak perlu punya pengalaman lain selain hal yang disebutkan di atas untuk dapat bergabung ke dalam proyek ini. Tentu saja kalau anda pengguna openSUSE dan biasa menggunakan emacs, vim atau jedit tentu akan menjadi nilai lebih.
Perlu ditegaskan di sini tidak ada imbalan materi apapun yang akan anda perloleh dalam proyek ini, jadi anda akan bekerja berdasarkan kesadaran bahwa anda membagikan kebahagiaan menggunakan openSUSE kepada orang lain. Tentu saja kami akan memberikan kredit dan menuliskan nama anda dalam tim penerjemah pada dokumen yang dibuat.
Jika berminat segera daftarkan diri anda melalui email ke andisugandi@opensuse.org dan cc ke medwin@opensuse.org, dengan subyek : tim penerjemah dokumentasi openSUSE dan mencantumkan nama, umur, lokasi/tempat tinggal, YM, irc nick/cloack, twitter,
Kami tunggu partisipasi anda semua.
Have a lot of fun
Tentu saja saya membutukan banyak bantuan dan kontribusi dari rekan-reakan sekalian. Jadi sekiranya anda menguasai Bahasa Inggris setidaknya pasif, ada keinginan untuk berkontribusi, punya waktu, dan komitmen memajukan openSUSE di Indonesia, maka anda bisa bergabung ke dalam tim ini. Mengenai hal teknis, bagaimana cara penerjemahannya, bagaimana pembagian kerjanya, tools apa yang dipakai nanti akan kita jelaskan melalui online meeting melalui IRC dan tulisan di blog setelah ada rekan-rekan yang tertarik terlibat. Anda tidak perlu punya pengalaman lain selain hal yang disebutkan di atas untuk dapat bergabung ke dalam proyek ini. Tentu saja kalau anda pengguna openSUSE dan biasa menggunakan emacs, vim atau jedit tentu akan menjadi nilai lebih.
Perlu ditegaskan di sini tidak ada imbalan materi apapun yang akan anda perloleh dalam proyek ini, jadi anda akan bekerja berdasarkan kesadaran bahwa anda membagikan kebahagiaan menggunakan openSUSE kepada orang lain. Tentu saja kami akan memberikan kredit dan menuliskan nama anda dalam tim penerjemah pada dokumen yang dibuat.
Jika berminat segera daftarkan diri anda melalui email ke andisugandi@opensuse.org dan cc ke medwin@opensuse.org, dengan subyek : tim penerjemah dokumentasi openSUSE dan mencantumkan nama, umur, lokasi/tempat tinggal, YM, irc nick/cloack, twitter,
Kami tunggu partisipasi anda semua.
Have a lot of fun
Medwinz's Notes
posted at
Bandwidth Shaper Script di openSUSE
# Tulisan ini digunakan sebagai bahan dasar saja untuk memahami
# Dibuat sudah lama sekali dan mungkin ada yang deprecated
# Use at your own risk
Seorang rekan menanyakan kenapa mengkonfigurasi openSuSE koq susah sekali. Katanya untuk ngejalanin script sederhana membuat default route aja musti ngebuat script yang njlimet. He…he..he….
Dia bilang kalau di RedHat dan turunannya seperti Fedora dan Centos khan ada rc.local, terus kalau di openSUSE padanannya apa?
OK. Sebetulnya masalah ini sudah pernah saya bahas diblog saya yang dulu dan dibeberapa email saya tapi tak mengapa saya ulang lagi di sini dan saya tambahkan beberapa hal yang saya anggap relevan karena kebetulan ada juga yang nanya tentang load balancing trafik internet ke dua gateway dan implementasi htb (hierarchical tocken bucket) untuk traffic shaping.
Jadi saya akan menjelaskan implementasi load balancing, traffic shaping dan rc.local di openSuSE sekaligus, mumpung lagi ada kesempatan nulis.
LOAD BALANCING TRAFIK INTERNET
Di tempat saya koneksi internet terhubung ke dua ISP, LC 128 kbps ke ISP-A dan ADSL ke ISP-B. Singkat cerita saya menggunakan sebuah server dengan 3 ethernet card
eth0 ip address 202.158.xx.yyy netmask 255.255.255.240 gw 202.158.xx.yyy
eth1 ip address 10.0.50.5 netmask 255.255.255.248 gw 10.0.50.1
eth2 ip address 192.168.117.171 netmask 255.255.255.0 gw 192.168.117.171
Untuk load balancing trafik ini saya mengacu pada dokumen LARTC (Linux Advanced Routing & Traffic Control) How To yang disusun oleh Bert Hubert (thanks Om Bert). Syarat untuk load balancing adalah sudah terinstallnya paket iproute2, yang sudah terinstall saat saya menginstall openSUSE 10.3.
Selanjutnya
# pertama hapus semua default route dari ip route
#
ip route del default
ip route del 10.0.50.0/29
ip route del 202.158.xx.zzz/28
ip route del 169.254.0.0/16
# tambah ip route yang masuk akal
#
ip route add 10.0.50.0/29 dev eth1 proto kernel scope link src 10.0.50.5
ip route add 202.158.xx.zzz/28 dev eth0 proto kernel scope link src 202.158.xx.xxx
# tambah juga load balancing default route (ip router anda)
# weight menandakan mana yang lebih anda pilih, 2 > 1
ip route add default scope global \
nexthop via 202.158.xx.yyy dev eth0 weight 1 \
nexthop via 10.0.50.1 dev eth1 weight 2
# tambah table policy routing
#
ip route add via 202.158.xx.yyy dev eth0 src 202.158.xx.xxx table ISP-A
ip route add via 10.0.50.1 dev eth1 src 10.0.50.5 table ISP-B
# ini musti ditest sometimes we need this
ip route add 192.168.117.0/24 dev eth4 table ISP-A
ip route add 10.0.50.0/29 dev eth1 table ISP-A
ip route add 127.0.0.0/8 dev lo table ISP-A
ip route add 192.168.117.0/24 dev eth4 table ISP-B
ip route add 202.158.xx.yyy/28 dev eth0 table ISP-B
ip route add 127.0.0.0/8 dev lo table ISP-B
# jangan lupa setup dua ip rule agar sistem menggunakan policy routing diatas
#
ip rule add from 202.158.xx.xxx table ISP-A
ip rule add from 10.0.50.5 table ISP-B
# setting IP masquerade
#
iptables -t nat -A POSTROUTING -s 192.168.117.0/24 -d 0/0 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.117.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
perlu diingat bahwa balancing disini tidak sempurna, karena route based, dan routes di-cache. Jadi route ke site yang sering dikunjungi akan selalu melaui provider yang sama.
Contoh di server ini kalau saya traceroute www.detik.com akan selalu lewat ISP-A dan traceroute www.republika.co.id akan selalu melalui ISP-B.
TRAFFIC SHAPING
Tujuan traffic shaping di sini adalah (tentu saja anda bisa melakukan shaping dengan tujuan lain he..he…he..):
- menjaga low latency untuk interactive trafic, jangan sampai upload atau download mengganggu ssh.
- menjaga agar browsing berjalan pada reasonable speeds sementara melalukan up atau downloading.
- menjaga agar upload tidak mengganggu download dan sebaliknya.
- menandakan port atau host yang sering memakan traffic sebagai low priority.
Ada banyak sumber di intenet misalnya tulisan ini dan favorit saya adalah sekali lagi om Bert dengan dokumen LARTC. Jangan lupa baca pre-requisites untuk menjalankan HTB dan pastikan kernel anda mendukungnya.
Implementasi di tempat saya sederhana saja seperti di bawah:
untuk eth0 dan eth1:
DOWNLINK=96 # untuk eth0, untuk eth1 –> DOWNLINK=288
UPLINK=80 # untuk eth0, untuk eth1 –> UPLINK=20
DEV=eth0 # ganti dengan eth1 untuk eth1
# low priority OUTGOING traffic - you can leave this blank if you want
# low priority source netmasks
NOPRIOHOSTSRC=
# low priority destination netmasks
NOPRIOHOSTDST=
# low priority source ports
NOPRIOPORTSRC=
# low priority destination ports
NOPRIOPORTDST=
if [ "$1" = "status" ]
then
tc -s qdisc ls dev $DEV
tc -s class ls dev $DEV
exit
fi
# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
if [ "$1" = "stop" ]
then
exit
fi
###### uplink
# install root HTB, point default traffic to 1:20:
tc qdisc add dev $DEV root handle 1: htb default 20
# shape everything at $UPLINK speed - this prevents huge queues in your
# DSL modem which destroy latency:
tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k
# high prio class 1:10:
tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit \
burst 6k prio 1
# bulk & default class 1:20 - gets slightly less traffic,
# and a lower priority:
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[9*$UPLINK/10]kbit \
burst 6k prio 2
tc class add dev $DEV parent 1:1 classid 1:30 htb rate $[8*$UPLINK/10]kbit \
burst 6k prio 2
# all get Stochastic Fairness:
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10
# TOS Minimum Delay (ssh, NOT scp) in 1:10:
tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
match ip tos 0x10 0xff flowid 1:10
# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
match ip protocol 1 0xff flowid 1:10
# To speed up downloads while an upload is going on, put ACK packets in
# the interactive class:
tc filter add dev $DEV parent 1: protocol ip prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:10
# rest is ‘non-interactive’ ie ‘bulk’ and ends up in 1:20
# some traffic however suffers a worse fate
for a in $NOPRIOPORTDST
do
tc filter add dev $DEV parent 1: protocol ip prio 14 u32 \
match ip dport $a 0xffff flowid 1:30
done
for a in $NOPRIOPORTSRC
do
tc filter add dev $DEV parent 1: protocol ip prio 15 u32 \
match ip sport $a 0xffff flowid 1:30
done
for a in $NOPRIOHOSTSRC
do
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
match ip src $a flowid 1:30
done
for a in $NOPRIOHOSTDST
do
tc filter add dev $DEV parent 1: protocol ip prio 17 u32 \
match ip dst $a flowid 1:30
done
# rest is ‘non-interactive’ ie ‘bulk’ and ends up in 1:20
tc filter add dev $DEV parent 1: protocol ip prio 18 u32 \
match ip dst 0.0.0.0/0 flowid 1:20
########## downlink #############
# slow downloads down to somewhat less than the real speed to prevent
# queuing at our ISP. Tune to see how high you can set it.
# ISPs tend to have *huge* queues to make sure big downloads are fast
#
# attach ingress policer:
tc qdisc add dev $DEV handle ffff: ingress
# filter *everything* to it (0.0.0.0/0), drop everything that’s
# coming in too fast:
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
Script ini bekerja cukup baik pada ADSL tapi harus dicoba-coba sampai didapat nilai optimum untuk nilai di DOWNLINK dan UPLINK. Masalah umum ADSL adalah kecepatan upload yang jauh dibawah kecepatan download, dan karena sifat TCP/IP yang terus mengirim paket sampai akhirnya tidak ada tempat lagi untuk paket, biasanya modem akan hang. Dengan kecepatan dowload yang kencang biasanya user terus mendownload beberapa sites sekaligus sehingga akumulasi upload menjadi besar. Bila traffic upload ini mencapai modem ADSL maka modem akan hang.
Karena itu harus diatur agar traffic upload kita kontrol dan tidak mencapai modem ADSL hal ini dilakukan dengan menurunkan nilai UPLOAD sampai nilai optimum. Hal ini tercapai jika network latency mencapai nilai terendah dan network tidak putus. Lebih jauh silakan baca pada dokumen LARTC Om Bert di atas.
rc.local di openSUSE
Tidak ada rc.local di openSUSE (he..he…he…)
Kalau kita lihat di RedHat (dan cloningnya) rc.local dijalankan setelah semua service selesai dijalankan di run level 5. Ini gak ada padanannya di openSUSE.
User biasanya mengira boot.local di /etc/init.d adalah padanan dari rc.local. Ini adalah perkiraan yang salah karena boot.local akan jalan paling awal sebelum service-service yang lain dijalankan. Sehingga seringkali user membuat script iptables dan disisipkan pada boot.local kemudian komplain karena scriptnya tidak jalan. Ini terjadi karena script iptables dipanggil sebelum service network dikonfigurasi di run level 3 sehingga sudah pasti tidak akan berfungsi.
Di openSUSE kita harus mengetahui pada saat mana script kita harus jalan apa saja syarat yang dibutuhkan, walaupun umumnya akan jalan di run level 3 dan 5. Misalnya kita ingin menjalankan script load balancing di atas, maka sebelum script ini jalan service network harus sudah jalan dulu.
Untuk dasar dari script tersebut kita dapat menggunakan file /etc/init.d/skeleton sebagai dasar, walaupun tidak tertutup kemungkinan menggunakan script lain seperti yang akan saya contohkan.
Script untuk traffic shapper:
#!/bin/sh
#
#
# /etc/init.d/bwshaper_eth0
#
### BEGIN INIT INFO
# Provides: bwshaper_eth0
# Required-Start: $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Custom shapping using htb for eth0 to ISP-A
# Description: decreased the upload traffic on eth0 to ISP-A by doing queuing using htb,
# script by medwin@gmail.com
### END INIT INFO
#
test -s /etc/rc.status && . /etc/rc.status && rc_reset
case "$1" in
start )
## letakkan script and di sini
rc_status -v
;;
stop)
# ok kita test
;;
esac
rc_exit
# end of script
Script di atas hanya satu contoh sederhana saja. Perhatikan bagian:
### BEGIN INIT INFObagian ini akan dipelajari oleh insserv untuk menjalankan script anda pada run level berapa.
# Provides: bwshaper_eth0 —> ini nama service anda
# Required-Start: $network —> ini adalah service yang harus jalan sebelum script anda di jalankan
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5 —> ini run level script anda bekerja
# Default-Stop: 0 1 2 6
# Short-Description: Custom shapping using htb for eth0 to ISP-A
# Description: decreased the upload traffic on eth0 to ISP-A by doing queuing using htb, script by medwin@gmail.com
### END INIT INFO
Copy script anda di /etc/init.d
Untuk memasukkan service anda ke service maka daftarkan dengan perintah
> insserv (nama service)
kemudian check dengan
> chkconfig –list
untuk mengetahui kalau service anda sudah masuk ke daftar service di run level tertentu.
Anda juga bisa berkreasi dengan membuat script service yang bisa dijalankan dan diberhentikan seperti misalnya dengan menyisipkan
case "$1" in
start)
echo -n "Starting bandwidth shaping on eth0: "
start
echo "done"
;;
stop)
echo -n "Stopping bandwidth shaping on eth0: "
stop
echo "done"
;;
restart)
echo -n "Restarting bandwidth shaping on eth0: "
restart
echo "done"
;;
status)
echo "Bandwidth shaping status for $IF:"
show
echo ""
;;
*)
pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|status}"
;;
pada script anda. Kemudian melakukan symbolic link file tersebut ke /usr/sbin atau /sbin, misalnya dengan nama rcbwshaper_eth0
> ln-s /etc/init.d/bwshaper_eth0 /usr/sbin/rcbwshaper_eth0
sehingga anda bisa memanggilnya dengan perintah
> rcbwshaper_eth0 {start|stop|restart|status}
OK selamat mencoba.
Till then keep safe and stop global warming.
Medwinz's Notes
posted at
Traffic Shaping - Bagian 3
Bagian ini adalah bagian terakhir dari penjelasan traffic shaping. Kita
akan mendiskusikan sedikit mengenai ingress qdisc. Traffic shaping yang
kita bicarakan pada dua tulisan sebelumnya merupakan implementasi egress
qdisc, dimana kita men-shape traffic yang meninggalkan eth1 (trafik
upload). Untuk trafik yang menuju eth1 (trafik incoming) kita menerapkan
ingress qdisc (lihat diagram dari jengelh
untuk mendapatkan gambaran mengenai ingress dan egress). Untuk trafik
incoming kita tidak dapat melakukan shaping, tetapi yang kita lakukan
adalah membuat policy, implementasi di tc adalah police. Yang akan kita
lakukan adalah membuat policy untuk melambatkan trafik yang masuk agar
tidak terjadi kongesti di server kita.
Perhatikan bagian:
Dalam script di atas ada juga hal baru yang ditemui yaitu police dan burst. Police merupakan filter yang membatasi rate bandwidth sampai kecepatan tertentu. Burst atau buffer adalah ukuran dari bucket (HTB = hierarchical tocken bucket, atau kadang-kadang disebut juga TBF = tocken bucket filter) dalam byte (1 byte = 8 bit), sebagai patokan untuk kecepatan 10mbit/s dibutuhkan setidaknya ukuran buffer 10 kbyte.
Lalu kita jalankan perintah:
Perhatikan bagian:
# attach ingress policer;
# ngelambatin download sedikit
tc qdisc add dev eth1 handle ffff: ingress
# lambatin semua paket yang datang terlalu cepat
tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
Arti dari baris tc qdisc add dev eth1 handle ffff: ingress
adalah meng-attach ingress qdisc pada eth 1 dengan nama handle ffff: .
Hal ini sama halnya dengan ketika mengattach egress qdisc dan membuat
root class untuk trafik upload, hanya ingress qdisc berfungsi untuk
klasifikasi trafik download.
Selanjutnya pada baris berikutnya ada u32
classifier, yang merupakan salah satu filter classifier yang sangat
powerful dalam implementasi tc. u32 akan memfilter paket berdasarkan
field dari paket ip (source ip address) yang dianalisa adalah 32 bit
header dari paket. Apabila ada kondisi yang sesuai (match) dengan selector
maka suatu tindakan (action) akan dilakukan. u32 selector berisi
definisi yang akan ditemui pada suatu paket yang sedang diproses berupa
informasi bit mana yang harus match di dalam header paket. Metode
sederhana ini ternyata sangat powerful.
Dalam script di atas ada juga hal baru yang ditemui yaitu police dan burst. Police merupakan filter yang membatasi rate bandwidth sampai kecepatan tertentu. Burst atau buffer adalah ukuran dari bucket (HTB = hierarchical tocken bucket, atau kadang-kadang disebut juga TBF = tocken bucket filter) dalam byte (1 byte = 8 bit), sebagai patokan untuk kecepatan 10mbit/s dibutuhkan setidaknya ukuran buffer 10 kbyte.
Maksud dari baris
tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
adalah membuat class ingress dari class
ffff: untuk protokol ip dengan prioritas 50 dengan source ip dari
internet dengan membatasi kecepatan paket sebesar kecepatan DOWNLINK
kbit/s dengan buffer sebesar 10 kbytes, paket yang kecepatannya lebih
dari DOWNLINK akan di drop.
Beberapa Contoh Lain
Kombinasi iptables, ip, tc dapat digunakan untuk beberapa hal lain yang sangat menarik, di bawah ini beberapa contohnya.
Anda mempunyai beberapa koneksi internet
ke beberapa ISP. Anda menginginkan agar trafik smtp melalui jalur salah
satu ISP saja. Anda dapat mengkombinasi iptables dengan ip. Buat
perintah untuk script iptables seperti dibawah ini
# iptables -A PREROUTING -i eth0 -t mangle -p tcp –dport 25 \
-j MARK –set-mark 1
# echo 201 mail.out >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table mail.out
# ip rule ls
0: from all lookup local
32764: from all fwmark 1 lookup mail.out
32766: from all lookup main
32767: from all lookup default
Lalu kita jalankan perintah:
#/sbin/ip route add default via 202.172.43.171 dev eth0 table mail.out
Maka semua email trafik akan melalui eth0 di mesin router kita menuju ISP tertentu.
Contoh lain adalah untuk selector u32
classifier, misalnya kita ingin agar trafik ICMP masuk ke qdisc tertentu
kita dapat membuat misalnya:
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip protocol 1 0xFF flowid 10:100
Mudah-mudahan penjelasan singkat ini bisa
dipahami, dan jangan takut untuk mencoba-coba sendiri. Apa yang saya
coba share di sini memang masih kurang lengkap tapi setidaknya bisa
menjadi awal bagi anda yang tertarik network dan quality of service di
linux.
Have a lot of fun.
Medwinz's Notes
posted at
Traffic Shaping - Bagian 2
Pada bagian ini kita akan mendiskusikan bagaimana mengklasifikasikan
paket dan kemudian melakukan penandaan paket (packet marking)
berdasarkan TOS field paket di linux kernel. Jadi kita akan menyerahkan
klasifikasi paket untuk dilakukan oleh iptables selanjutnya HTB akan
melakukan queueing berdasarkan penandaan oleh iptables. Secara singkat
TOS (Type of Service, kudu dimengerti oleh pengguna linux yang berminat
pada networking dan Quality of Service) merupakan bagian dari paket yang
menentukan prioritas dari paket. TOS terdiri dari 8 bit (octet), bit 0,
1, 2 adalah precedence, bit 3, 4, 5, 6 adalah TOS, dan bit 7 adalah bit
MBZ (Must Be Zero).
Secara default nilai dari TOS bits adalah sebagai berikut:
Secara default nilai dari TOS bits adalah sebagai berikut:
- 1000 (binary) 8 (decimal) Minimize delay (md)
- 0100 (binary) 4 (decimal) Maximize throughput (mt)
- 0010 (binary) 2 (decimal) Maximize reliability (mr)
- 0001 (binary) 1 (decimal) Minimize monetary cost (mmc)
- 0000 (binary) 0 (decimal) Normal service
Dengan iptables kita dapat melakukan
penandaan paket (packet marking) berdasarkan TOS bits dan inilah yang
akan kita lakukan dengan script yang kita buat. Header dari paket akan
dibongkar (mangle) oleh iptables dan disisipi tanda (mark) sesuai
keinginan kita. (Thanks to Rusty Russel, Harald Welte, Patrick
McHardy etc to make iptables as a nice userland for linux communites.
Sekitar 2 tahun lalu Tahun 2006 kebetulan saya pernah kerja bareng dengan salah
satu kontributor iptables/netfilter Fabrice Marie,
dia salah satu pembuat howto nya netfilter, orangnya sangat down to
earth, ramah dan mau berbagi ilmu. Saat itu saya gak tahu kalau dia
salah satu kontributornya……..)
Pada script yang saya berikan (pada tulisan sebelumnya) perhatikan bagian
tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15
Pada tulisan sebelumnya
kita sudah membuat 6 class htb qdisc tetapi belum melakukan klasifikasi
paket, sehingga seluruh paket upload dari network kita akan melalui
class 1:15 (kita mendefinisikan tc qdisc add dev eth1 root handle 1: htb
default 15). Sekarang kita harus mengklasifikasikan paket agar paket
tertentu akan masuk kedalam class htb qdisc tertentu pula. Script di
atas adalah filter yang akan membagi paket kedalam class tertentu
berdasarkan klasifikasi paket oleh iptables. Penggunaan iptables sangat
dianjurkan karena sangat fleksibel, menghitung paket untuk setiap rule
dengan cepat, dan juga dengan adanya RETURN target paket tidak perlu
menjelajah ke semua rule.
Perintah yang dilakukan pada script di
atas adalah memberitahu kernel bahwa paket dengan nilai spesifik FWMARK
(handle x fw) harus masuk ke class tertentu (classid x:xy).
Bagi anda yang belum memahami cara kerja iptables silakan download howtonya di sini, atau setidaknya pahami diagram dari Jan Engelhardt (jengelh adalah pengguna openSUSE, dia salah satu kontributor di openSUSE Build Service).
Misalkan ip lokal anda 192.168.0.0/24 dan
ip public anda 202.170.1.2, maka jalankan NAT dengan iptables (untuk
pengguna SuSEfirewall tidak perlu menjalankan perintah iptables ini,
tetapi ikuti langkah untuk SuSEfirewall di paragraf berikutnya. Saya
pengguna SuSEfirewall juga).
Untuk pengguna SuSEfirewall, buka file /etc/sysconfig/SuSEfirewall2 dan lengkapi bagian di bawah ini:
- ech0 1 > /proc/sys/net/ipv4/ip_forward
- iptables – t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j SNAT –to-source 202.170.1.2
FW_DEV_EXT=’eth1′ ——> sesuaikan dengan eth ip publikKemudian mulailah menambahkan rule untuk PREROUTING chain pada tabel mangle:
FW_DEV_INT=’eth2′ ——> sesuaikan dengan eth ip lokal
FW_ROUTE=”yes”
FW_MASQUERADE=”yes”
FW_MASQ_DEV=”zone:ext”
FW_MASQ_NETS=”192.168.0.0/24″
FW_CUSTOMRULES=”/etc/sysconfig/scripts/SuSEfirewall2-custom”
iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 0×1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j MARK –set-mark 0×1
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j RETURN
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j MARK –set-mark 0×5
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j RETURN
iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j MARK –set-mark 0×6
iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 22 -j MARK –set-mark 0×1
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 22 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j MARK –set-mark 0×1
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j RETURN
iptables -t mangle -I PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j MARK –set-mark 0×1
iptables -t mangle -I PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 587 -j MARK –set-mark 0×5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 587 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 993 -j MARK –set-mark 0×5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 993 -j RETURN
iptables -t mangle -A PREROUTING -j MARK –set-mark 0×6
Maksud dari script di atas adalah:
- menandai traffic ICMP dengan FWMARK 0×1
- -j RETURN untuk trafik ICMP dimana ICMP tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS minimize delay sebagai FWMARK 0×1
- -j RETURN untuk trafik TOS minimize delay, dimana trafik TOS minimize delay tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS minimize cost sebagai FWMARK 0×5
- -j RETURN untuk trafik TOS minimize cost, dimana trafik TOS minimize cost tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS maximize throughput sebagai FWMARK 0×6
- -j RETURN untuk trafik TOS maximize throughput, dimana trafik TOS maximize throughput tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang berasal dari port SSH dengan FWMARK 0×1
- -j RETURN untuk trafik yang berasal dari port SSH dimana trafik yang berasal dari port SSH tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port SSH dengan FWMARK 0×1
- -j RETURN untuk trafik yang menuju port SSH dimana trafik yang menuju port SSH tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang memiliki SYN flag dengan FWMARK 0×1
- -j RETURN untuk trafik yang memilik SYN flag dimana trafik yang memiliki SYN flag tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port 587 dengan FWMARK 0×5
- -j RETURN untuk trafik yang menuju port 587 dimana trafik yang menuju port 587 tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port 993 dengan FWMARK 0×5
- -j RETURN untuk trafik yang menuju port 993 dimana trafik yang menuju port 993 tidak akan masuk ke rule lain dibawahnya
- trafik yang tidak termasuk dalam klasifikasi sebelumnya akan ditandai dengan FWMARK 0×6 dan akan masuk ke class 1:15
Kemudian lakukan hal yang sama untuk
OUTPUT chain. Ulangi script tabel mangle untuk PREROUTING, dan ganti
semua kata PREROUTING dengan OUTPUT. Kegunaannya adalah agar semua
trafik yang dihasilkan secara lokal di server tempat script ini terletak
juga akan diklasifikasi. Tetapi bagian paling akhir dari script diganti
dengan: iptables -t mangle -A OUTPUT -j MARK –set-mark 0×3. Hal ini
membuat lokal trafik akan mempunyai prioritas lebih tinggi dan akan
masuk ke class 1:12.
Masukan script OUTPUT chain dan
PREROUTING chain dalam iptables script yang selama ini anda gunakan.
Untuk pengguna SuSEfirewall, edit file
/etc/sysconfig/scripts/SuSEfirewall2-custom, dan masukkan script
tersebut pada bagian before antispoofing seperti dibawah ini
Jalankan script yang saya berikan dan restart SuSEfirewall atau iptables, dan coba jalankan perintah :fw_custom_before_antispoofing(){iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 0×1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
…….. dan seterusnya
iptables -t mangle -A PREROUTING -j MARK –set-mark 0×6
iptables -t mangle -A OUTPUT -p icmp -j MARK –set-mark 0×1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
…….. dan seterusnya
iptables -t mangle -A OUTPUT -j MARK –set-mark 0×3
true
}
tc -s class show dev eth1
Sekarang perhatikan bahwa jumlah paket akan meningkat di setiap class.
Jika ada class yang kosong berarti anda musti mengatur ulang priority
atau FWMARK yang diberikan, karena hal ini berbeda disetiap network
tergantung dari karakteristik pengunaan network oleh user. Selain itu
sekiranya ada class yang penuh terus, maka perlu ditambahkan queuing
dicipline lain supaya pembagian bandwidth lebih fair. Hal ini dilakukan
dengan sfq (stochastic fairness queueing). Pada contoh script saya
tambahkan class sebagai berikut:
tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10
Maksudnya adalah menambahkan queueing
disc sfq pada class 1:12 (dan seterusnya) dengan nama handle 120 (dan
seterusnya) dengan hashing dilakukan setiap 10 detik. SFQ akan mengatur
bandwidth dibagi secara fair untuk setiap paket trafik. Untuk kasus di
tempat anda mungkin berbeda tetapi script ini dapat dijadikan dasar
untuk anda mengkonfigurasi di network anda.
Mudah-mudahan penjelasan singkat ini bisa dimengerti. Pada tulisan berikutnya akan saya jelaskan bagian script yang lain.
Medwinz's Notes
posted at
Traffic Shaping - Bagian 1
Pertanyaan paling mendasar adalah mengapa perlu pengaturan trafik atau traffic shaping?
- Anda pakai speedy office di rumah anda untuk 3 komputer. Anda tidak butuh traffic shapping.
- Anda pakai fastnet 384 kbps di rumah untuk 3 komputer. Anda tidak butuh traffic shapping.
- Kalau user anda sedikit dan bandwidth anda besar, katakan user anda 100, bandwidth anda 8 Mbps symmetris, anda sepertinya gak butuh traffic shaping (debatable juga sih apalagi kalau dipakai voip atau video conference).
- Kalau user anda hanya 1 sampai 5 orang bisa dikatakan anda tidak perlu traffic shaping, karena bandwidth anda masih memadai untuk melayani user anda. Tapi bagaimana kalau user anda lebih dari 15 orang dan masing-masing melakukan koneksi remote ssh, selain tentunya browsing dan download. Bisa dikatakan anda akan mengalami masalah, kalau anda tidak men-shape trafik upload dan membuat policy untuk downlink anda. Saya mengalaminya sendiri dengan sekitar 60 user yang haus bandwidth.
- Menjaga low latency untuk trafik interaktif. Artinya proses download dan upload harus tidak mengganggu SSH, telnet dan sejenisnya. Hal ini yang paling penting. Dengan latency 200ms cukup membuat bekerja dengan SSH sangat tidak nyaman.
- Menjaga agar user dapat tetap membrowse internet dengan kecepatan yang nyaman sementara melakukan proses upload atau download.
- Memastikan bahwa proses upload tidak mengorbankan proses download dan sebaliknya. Perlu dipahami bahwa adanya queue yang besar di device seperti modem ADSL atau kabel modem akan membuat upload, download dan trafik interaktif akan saling bertanding satu sama lain.
Di bawah ini adalah script yang dapat digunakan untuk melakukan traffic shaping di
openSUSE (well, juga untuk distribusi linux lain). Sekarang saya akan
menjelaskan apa maksud dari script tersebut. Ketika dulu pertama kali
mempelajari tc, ip, dan HTB saya menyadari bahwa hal inilah yang paling
susah.
#!/bin/sh
#
#
# /etc/init.d/mebwshaper_eth1
#
### BEGIN INIT INFO
# Provides: mebwshaper_eth1
# Required-Start: $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Custom bandwidth shaping by medwinz@gmail.com
# Description: Custom bandwidth shaping by medwinz@gmail.com
### END INIT INFO
#
test -s /etc/rc.status && . /etc/rc.status && rc_reset
case "$1" in
start )
# script bandwidth shaping for openSUSE by medwinz@gmail.com
# silakan dicopy atau diubah-ubah
#
echo -n "Starting bandwidth shaping HTB qdiscs in eth1"
DOWNLINK=968
UPLINK=110
# hapus existing downlink and uplink qdiscs, umpetin errors
tc qdisc del dev eth1 root 2> /dev/null > /dev/null
sleep 2
tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
sleep 1
# ngebuat qdisc
tc qdisc add dev eth1 root handle 1: htb default 15
tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10
tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15
# attach ingress policer;
# ngelambatin download sedikit
tc qdisc add dev eth1 handle ffff: ingress
# lambatin semua paket yang datang terlalu cepat
tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
rc_status -v
;;
stop)
# hapus existing downlink and uplink qdiscs, umpetin errors
echo -n "Delete all HTB qdiscs on eth1"
tc qdisc del dev eth1 root 2> /dev/null > /dev/null
sleep 3
tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
sleep 2
rc_status -v
;;
restart)
## Berhentiin service dan tanpa perduli dia jalan atau nggak
## Start lagi.
$0 stop
$0 start
# inget status dan tenang aja
rc_status
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
rc_exit
DOWNLINK=968
Ini adalah kecepatan download. ISP
mengatakan 1024 kbps, tapi saya kecilkan menjadi sekitar 94% saja. Hal
ini perlu agar tidak terjadi kongesti.
UPLINK=110
Demikian pula dengan upload. ISP menyatakan sebesar 128 kbps, tapi hanya 86% yang saya alokasikan.
Anda harus mencari dengan trial and error
sampai didapatkan angka maksimum untuk DOWNLINK dan UPLINK dimana
traffic tidak menyebabkan kongesti pada sambungan ADSL anda. Perlu untuk
diketahui bahwa ISP menerapkan queueing pada banyak sekali server
mereka, kita tidak dapat mengkontrol queueing di sisi ISP. Karena itu
tujuan utama dari traffic shapping ini adalah memindahkan queueing pada
server kita agar kita bisa mengaturnya. Sehingga traffic yang mencapai
ISP tidak di queuing lagi oleh ISP (idealnya seperti itu). Pada setting
di tempat saya, saya menggunakan angka UPLINK 110 kbit/s. Angka ini
adalah angka maksimum sebelum latency mulai meningkat (walaupun Speedy
mengatakan uploadnya 128 kbit/s) yang disebabkan mulai penuhnya buffer
pada router atau modem (whatever..) antara server saya dengan remote
host.
tc qdisc del dev eth1 root 2> /dev/null > /dev/null
sleep 2
sleep 2
Baris di atas merupakan perintah tc untuk
menghapus semua root qdisc downlink yang mungkin ada sebelumnya di
device eth1, selanjutnya menunggu selama 2 detik.
tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
sleep 1
sleep 1
Baris ini merupakan perintah tc untuk
menghapus semua ingress qdisc uplink yang mungkin ada sebelumnya di
device eth1, selanjutnya menunggu selama 1 detik. Baris-baris berikutnya
adalah inti dari script ini yaitu membuat beberapa qdisc baru untuk
mengatur trafik upload,
tc qdisc add dev eth1 root handle 1: htb default 15
tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
Hal di atas adalah membuat beberapa qdisc
dimana trafik akan diklasifikasikan. ada 6 htb qdisc yang dibuat dengan
prioritas tertinggi pada class 1:10 dan terendah pada class 1:15.
Secara default semua trafik akan masuk ke class 1:15 ( tc qdisc add dev
eth1 root handle 1: htb default 15). Maksud dari baris-baris di atas
adalah membagi root class 1: upload menjadi 6 class 1:10, 1:11, 1:12,
1:13, 1:14 dan 1:15 dengan rate minimal masing-masing 36 kbit, 36 kbit, 9
kbit, 9 kbit, 11 kbit dan 9 kbit. Setiap class dapat menggunakan
bandwidth yang tidak terpakai oleh class lainnya. Class dengan priority
yang lebih tinggi (prio 1 prioritasnya lebih tinggi dari prio 3) akan
mendapatkan alokasi bandwidth lebih dulu.
classid 1:10 htb rate 36kbit ceil 36kbit prio 0
classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1Ini adalah class dengan prioritas tertinggi. Paket dalam class ini akan memiliki delay terkecil dan akan mendapatkan excess bandwidth pertama kali, sehingga saya membatasinya sampai angka 36 kbit/s. Paket yang akan dikirimkan melalui class ini adalah paket yang membutuhkan delay yang kecil, seperti trafik interaktif yaitu: ssh, telnet, dns, irc, dan paket dengan SYN flag.
Kelas ini adalah kelas pertama dimana sebagian besar trafik (bulk traffic) akan diletakkan. Trafik di sini sebagian besar adalah web trafik dari lokal web server (web server di mesin lokal) serta trafik web keluar: source port 80 dan destination port 80.classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
Dalam kelas ini saya letakkan trafik dengan nilai bit TOS Maximize-Throughput dan trafik lain yang berasal dari proses lokal (trafik yang sumbernya dari server) ke internet. Class ini hanya akan berisi trafik yang di-route melalui server (tempat script ini di jalankan).classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
Class ini diperuntukkan bagi trafik untuk mesin-mesin yang di- NAT, yang membutuhkan prioritas bagi trafik bulk-nya.
classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3Class ini untuk trafik email (SMTP, POP3, IMAP, dll) serta paket dengan nilai bit TOS Minimize-Cost.
Class terakhir ini adalah class default dimana bulk traffic dari mesin-mesin yang di NAT akan dimasukkan. Trafik yang masuk di sini seperti kazaa, edonkey, dan yang sejenisnya.Penjelasan singkat ini silakan dicerna dulu. Dibaca, dimengerti dan dibawa mimpi. Saya akan lanjutkan pada tulisan berikutnya bagaimana menghubungkan script ini dengan iptables.



