Mengamankan Issabel dengan Fail2ban

Keperluan menginstall IP PBX dengan ip address public sepertinya memang sudah tidak bisa dihindari lagi demi mengurangi carbon footprint *halah*. Beberapa waktu yang lalu saya pernah menulis bagaimana saya mengamankan server Elastix dengan IPTABLES ketika harus dipasang dengan ip address public di sini. Cuma caranya kurang elegan karena masih mengubah port default SIP, dan firewallnya bisa dibilang statis (tidak bisa otomatis block/unblock ip address perpetrator). Padahal kalau melihat appliance yang ada di pasaran, seperti Yeastar IP PBX, Grandstream IP PBX, Sangoma IP PBX, dll (terutama yang Asterisk based), mereka sudah menerapkan Fail2ban sebagai default pengamanan dan dengan pede bisa membuka port 5060 di network public.

Fail2ban di Issabel, yang notabene sudah jalan di atas Centos 7, menggunakan tool Firewalld (bukan IPTABLES, walaupun masih disertakan juga sebagai backward compat).  Tapi saya masih kebawa ngubah port default layanan lain ke port berbeda (misal SSH jadi port 8022, http jadi port 8080, https jadi port 8443, dst), sekedar menambahkan “onion layer” ke layer pengamanan.

“Cara Kerja Fail2ban Gimana sih?”

Fail2ban membaca file log layanan (ssh, http, https, Asterisk, FreeSWITCH, dst) untuk dibandingkan dengan regex yang ada di direktori ~fail2ban/filter.d/*.conf. Misal di Issabel ini, saya sudah menginstruksikan Fail2ban membaca file /var/log/asterisk/full (file log utama Asterisk) di ~fail2ban/jail.conf seperti di bawah ini:

...
[asterisk]

port = 5060,5061
action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
%(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"]
logpath = /var/log/asterisk/full
maxretry = 3
...

Nilai default maxretry di setting ini 10. Sengaja saya turunkan menjadi 3.

Fail2ban akan membaca file /var/log/asterisk/full (defaultnya /var/log/asterisk/messages) untuk dicocokkan dengan regex yang ada di dalam file ~fail2ban/filter.d/asterisk.conf . Silahkan check sendiri, isinya agak panjang jadi ndak saya paste di sini. Yang perlu diperhatikan adalah keyword  . Regex akan mengeluarkan variable yang disimpan di  untuk kemudian dijadikan parameter blocking di Firewalld, lalu meyimpan record tersebut di database SQLite. Kalau mau tau di mana lokasi databasenya jalankan saja perintah:

[root@issabel ~]# fail2ban-client get dbfile
Current database file is:
`- /var/lib/fail2ban/fail2ban.sqlite3

Kalo ngerti SQLite, silahkan dilihat2 isi dari database tersebut, sementara ndak saya bahas di sini cara ngeliatnya pake SQLite.

“Kenapa catatan ip address yang diblokir harus disimpan? “

Kadang-kadang kan memang kejadiannya ndak sengaja. Misal ada user yang pada saat setting endpoint salah dalam mengisikan password. Jadi ada baiknya diberikan kesempatan. Untuk jumlah berapa kali boleh diberikan kesempatan tergantung Sysadminnya segalak apa. Jadi Fail2ban secara default akan memberikan kesempatan 5x autentikasi, lalu diblokir selama 3 menit, kemudian dibuka blokirnya. Jika terjadi lagi salah autentikasi 5x, akan dilakukan blokir selama 3 menit lagi. Block/unblock ini akan dihitung oleh Fail2ban. Jika sudah sampai 10x, maka ip address client akan diblokir permanen. Ini sebabnya dibutuhkan database untuk mencatat.

Untuk server dengan ip address public, biasanya saya menurunkan jumlah toleransi dari 5x percobaan autentikasi yang diperbolehkan menjadi 3x saja. Lalu blocking/unblocking yang defaultnya dari 10 menjadi 3. Lumayan saving resource karena saat server hadap ke jaringan public, jumlah percobaan akan berlipat puluhan kali, bahkan sampai ribuan kali lebih banyak jika dibandingkan dengan jaringan internal kantor, misalnya.

Walhasil baru sebentar sudah panen hama:

[root@issabel fail2ban]# fail2ban-client status asterisk
Status for the jail: asterisk
|- Filter
| |- Currently failed: 2
| |- Total failed: 227890
| `- File list: /var/log/asterisk/full
`- Actions
|- Currently banned: 5
|- Total banned: 31
`- Banned IP list: 46.29.162.24 185.22.152.78 46.29.162.11 185.22.152.88 62.210.143.116

Untuk menjalankan Fail2ban default install, yang perlu diubah hanya lokasi file log di Asterisk seperti yang sudah saya cantumkan di atas. Selain itu matikan layanan IPTABLES, dan aktifkan Firewalld.

[root@issabel ~]# systemctl stop iptables
[root@issabel ~]# systemctl disable iptables
[root@issabel ~]# systemctl enable firewalld
[root@issabel ~]# systemctl start firewalld

Lalu tambahkan layanan Issabel/Asterisk untuk SIP di Firewalld:

[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/tcp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/udp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port=10000-20000/udp
[root@issabel ~]# firewall-cmd --reload

Dan pastikan level logging di Asterisk di dalam file logger_logfiles_additional.conf ada baris:

full => debug,error,notice,verbose(3),warning

Jika ingin mengubah verbosity, maka perlu dipikirkan juga perubahan regex yang mungkin terjadi di dalam file ~fail2ban/filter.d/asterisk.conf.

Dan terakhir aktifkan Fail2ban:

[root@issabel ~]# systemctl enable fail2ban
[root@issabel ~]# systemctl start fail2ban

Selamat mencoba dan selamat menyambut tahun baru 2018!

Links

 

Trunk Antar IP PBX Di Belakang NAT

Berawal dari keinginan untuk menyambungkan dua buah IP PBX Elastix, yang satu menggunakan ip address public, sedangkan yang lain berada di NAT. Untuk menjadikannya full-mesh, idealnya masing-masing bisa “melihat” ip address satu sama lain (bisa ping dari kedua arah). Tapi dalam kondisi ini, hanya IP PBX yang berada di bawah NAT lah yang bisa ping ke IP PBX dengan ip address public, sementara IP PBX dengan ip address public tidak bisa melakukan ping ke IP PBX yang berada di bawah NAT (ribet banget bahasanya ya).

Karena hanya IP PBX Kantor A  yang bisa melakukan ping ke IP PBX Kantor B, maka IP PBX Kantor A yang harus registrasi ke IP PBX Kantor B. Setelah terjadi registrasi, masing-masing IP PBX akan bisa melempar panggilan melalui ip address yang tercatat di registrasi tersebut. Caranya adalah sebagai berikut:

Konfigurasi IP PBX Kantor B

Dengan asumsi, ip address private IP PBX kantor A adalah 10.0.10.10 dengan nat ip public 1.1.1.1, dan ip address public IP PBX kantor B : 2.2.2.2.

Karena IP PBX Kantor B menggunakan ip address public, maka IP PBX ini yang akan menerima registrasi. Tambahkan informasi user untuk IP PBX Kantor A di iax_custom.conf (untuk menambahkan baris berikut, sebaiknya melalui webGUI, sepert yang pernah saya bahas di postingan https://www.otakudang.org/?p=356 ):

[KantorA]
username=KantorA
secret=KantorA
context=from-internal
host=dynamic
type=friend
port=4569
qualify=yes
permit=0.0.0.0/0.0.0.0
requirecalltoken=no

Lalu tambahkan trunk IAX2 dari webUI, dengan keterangan sebagai berikut:

Trunk Name: TrunkToKantorA
Peer Detail
host=dynamic
type=peer
nat=yes
qualify=yes
insecure=port,invite
context=from-internal

Konfigurasi IP PBX Kantor A

Di mesin IP PBX kantor A tambahkan trunk IAX2 dari webUI dan isikan sebagai berikut:

Trunk Name: KantorA
host=2.2.2.2
username=KantorA
secret=KantorA
type=friend
nat=yes
context=from-internal
qualify=yes
port=4569

Dan di bagian Register String isikan:

KantorA:KantorA@2.2.2.2:4569

Jangan lupa selalu klik Submit Changes dan Apply Changes baik di IP PBX kantor A dan kantor B.

Pastikan bahwa IP PBX kantor A sudah registrasi ke kantor B dengan melihat console Asterisk masing-masing  (asterisk -vr) dengan perintah: iax2 show peers

Jika berhasil, seharusnya akan tampil seperti :

IP PBX Kantor A

KantorA*CLI> iax2 show peers
 Name/Username       Host                Mask               Port      Status
 KantorA             2.2.2.2     (S)     255.255.255.255    4569      OK (6 ms)
 1 iax2 peers [1 online, 0 offline, 0 unmonitored]


IP PBX Kantor B :

 KantorB*CLI> iax2 show peers
 Name/Username       Host                Mask               Port      Status
 KantorA             1.1.1.1     (S)     255.255.255.255    4569      OK (10 ms)
 1 iax2 peers [1 online, 0 offline, 0 unmonitored]

 

Dari kantor B, IP PBX kantor A akan muncul dengan ip address router NAT-nya. Jika masing-masing server sudah bisa melihat ip address host tujuan, tinggal kita tambahkan saja OutBound Route nya. Sudah tau kan caranya?

Selamat mencoba!

[Tips] Dialplan Untuk Pak Boss

Latar Belakang

Ceritanya, di sebuah instansi, terdapat 5 orang direktur yang masing-masing memiliki sekretaris sendiri. Para direktur ini tidak mau nomer bisa didial langsung dari IVR maupun dari ekstensi selain ekstensi masing-masing sekretarisnya. Jika ada yang mendial nomer ekstensi salah satu direktur, jika bukan dari ekstensi sekretarisnya, maka panggilan akan terlebih dahulu diarahkan ke nomer ekstensi sekretarisnya, baru kemudian bisa ditransfer ke nomer direktur tersebut.

Caranya?

Berikut ini adalah cara yang sudah saya coba di distro Asterisk. Di dalam distro tersebut, secara default semua ekstensi masuk ke context from-internal. Untuk nomer ekstensi sekretaris dan direktur, saya masukkan semua sebagai context tersebut. Selain itu, saya buatkan context khusus supaya tidak bisa melakukan panggilan langsung ke nomer ekstensi direktur. Sebelumnya saya pernah membuat script untuk memblokir panggilan keluar dengan nama context from-internal-restricted yang bisa dibaca di https://www.otakudang.org/?p=300 . Kali ini saya akan mengembangkan context tersebut untuk memblokir panggilan langsung ke ekstensi tertentu dan membelokkan ke ekstensi lain.

Dalam contoh ini, nomer ekstensi direktur (misal) 6666 dan nomer sekretaris adalah (misal) 6015. Edit context from-internal-restricted (yang sudah include dengan script restricted.sh) menjadi seperti berikut:

[from-internal-restricted]
 #exec /var/lib/asterisk/bin/restricted.sh
 exten => 6666,1,NoOp()
 same => n,GotoIf($[${CALLERID(num)} = 6015]?dial1:dial2)
 same => n(dial1),Dial(SIP/6666)
 same => n,Hangup()
 same => n(dial2),Dial(SIP/6105)
 same => n,Hangup()

Arti dari dialplan di atas adalah, jika caller id penelpon adalah 6015 (nomer ekstensi sekretaris), maka rule dial1 yang akan dieksekusi, yaitu mendial SIP/6666 nomer ekstensi direktur). Jika nomer penelpon bukan nomer ekstensi sekretaris (6015), maka rule dial2 yang akan dieksekusi, yaitu mendial SIP/6015 (nomer ekstensi sekretaris).

Selamat mencoba!

Menyambungkan Panggilan Dengan cmd Originate()

Jadi intinya ada request begini:

Operator diminta menyambungkan sebuah ekstensi ke nomer PSTN/GSM. Hanya saja, pada saat penyambungan panggilan, si operator tidak perlu harus menunggu sampe panggilan ke PSTN/GSM tersambung dulu lalu transfer call ke ekstensi. Maunya dial, nomer PSTN/GSM, lalu dial ekstensi yang melakukan request, setelah itu operator mengerjakan yang lain lagi.

Saya ngebayangin akan ada dua input, yaitu nomer PSTN/GSM, lalu nomer ekstensi, yang didial sekaligus. Untuk membedakan mana yang nomer PSTN/GSM dan mana nomer ekstensi, perlu dibuat delimiter, dalam hal ini saya memilih dua buah tanda pagar. Jadi jika ingin melakukan dial dengan hasil di atas, cukup dengan (misal): 08123456789##2002.

Karena kebetulan yang panjang digitnya tetap adalah nomer ekstensi (4 digit), ditambah delimiter dua tanda pagar, sementara nomer PSTN/GSM panjangnya bisa berbeda-beda, maka perlu dibagi seperti di dialplan berikut, lalu masing-masing nomer PSTN/GSM dan nomer ekstensi dimasukkan ke variabel terpisah, untuk bisa dijadikan input perintah Originate().

[stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″]exten =>_XXXXX.##ZXXX,1,NoOp()
same => n,Set(Tujuan=${EXTEN::-6})
same => n,Set(Ekstensi=${EXTEN:-4:4})
same => n,Originate(DAHDI/g0/${Tujuan},exten,from-internal,${Ekstensi},1)
same => n,Hangup()[/stextbox]

di baris Set(Tujuan=${EXTEN::-6}) jika diterapkan ke 08123456789##2002, akan menghilangkan 6 karakter terakhir, yang sisanya adalah nomer PSTN/GSM 08123456789 (karakter ##2002 dihilangkan), lalu dimasukkan ke variale Tujuan.

Set(Ekstensi=${EXTEN:-4:4}) jika diterapkan ke 08123456789##2002, akan menghitung 4 digit dari belakang, dan menghilangkan selain 4 digit tersebut. Selanjutnya 4 digit ini dimasukkan ke variabel Extensi.

Setelah mendapatkan dua variable Tujuan dan Ekstensi, kita bisa menjalankan perintah Originate() di baris:

same =>n,Originate(DAHDI/g0/${Tujuan},exten,from-internal,${Ekstensi},1)

perintah tersebut jika dinterpolasi akan seperti:

same =>n,Originate(DAHDI/g0/08123456789,exten,from-internal,2002,1)

Untuk contoh manipulasi variable bisa dibaca di:

https://wiki.asterisk.org/wiki/display/AST/Manipulating+Variables+Basics

Tips

Untuk membuat dialplan seperti di atas, ada baiknya jika dibuat context khusus, karena dialplan tersebut sangat rentan fraud jika kita tidak berhati-hati. Misal, kita bisa memasukkan dialplan tersebut ke dalam context yang hanya bisa diakses oleh ekstensi khusus operator, atau bisa dengan menambahkan auth password dialplan.

Berikut ini cuplikan dari buku Asterisk™ : The Definitive Guide mengenai contoh digit manipulation:

More Advanced Digit Manipulation
The ${EXTEN} variable properly has the syntax ${EXTEN:x:y}, where x is the starting
position and y is the number of digits to return. Given the following dial string:
94169671111
we can extract the following digit strings using the ${EXTEN:x:y} construct:
• ${EXTEN:1:3} would contain 416
• ${EXTEN:4:7} would contain 9671111
• ${EXTEN:-4:4} would start four digits from the end and return four digits, giving
us 1111
• ${EXTEN:2:-4} would start two digits in and exclude the last four digits, giving us
16967
• ${EXTEN:-6:-4} would start six digits from the end and exclude the last four digits,
giving us 67
• ${EXTEN:1} would give us everything after the first digit, or 4169671111 (if the
number of digits to return is left blank, it will return the entire remaining string)

This is a very powerful construct, but most of these variations are not very common in
normal use. For the most part, you will be using ${EXTEN} (or perhaps ${EXTEN:1} if
you need to strip off an external access code, such as a prepended 9).

Menambahkan IP Phone CISCO 3911 Ke Elastix IP PBX

Latar belakangnya adalah, seorang teman membeli ip phone Cisco 3911 dengan harga murah di toko online, dengan harapan bisa dipasang di kantor dan tersambung dengan IP PBX Asterisk based. Sayangnya, ip phone tersebut sebenarnya IPT untuk Cisco Unified Communication versi 6 atau 5. Halaman web ui ip phone tersebut hanya mencantumkan status network dan tidak ada entry untuk memasukkan informasi user/password maupun alamat registrar.

0900aecd806a2b07_null_null_null_08_02_07-1

Berikut ini cara menambahkan ekstensi 8047 ke Elastix yang memiliki ip address 172.16.1.16:

  • install tftp-server, tftp dan xinetd di Elastix jika belum ada. Tapi selama ini di instalasi Elastix otomatis sudah menyertakan tftpserver dan xinetd.
  • Upload file BOOT3951.0-0-0-9.zzDSP3951.0-0-0-2.zzSIP3951.8-1-4a.loadsSIP3951.8-1-4a.zz, dan XMLDefault.cnf.xml ke direktori /tftpboot.
  • Edit file sipdefault.cnf di baris berikut lalu upload ke direktori /tftpboot.

 [stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

proxy1_address: 172.16.1.16

outbound_proxy: 172.16.1.16 ;

…[/stextbox]

  • Edit file SEP<macaddress>.cnf.xml di baris berikut dan juga upload ke /tftpboot. Karena mac address ip phone Cisco 3911 adalah 001AA11B512A, maka nama filenya adalah SEP001AA11B512A.cnf.xml.

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

<device xsi:type=”axl:XIPPhone” ctiid=”1566023366″>
<deviceProtocol>SIP</deviceProtocol>

<devicePool>
<dateTimeSetting>
<dateTemplate>D-M-YA</dateTemplate>
<timeZone>Arabian Standard Time</timeZone>
<ntps>
<ntp>
<name>172.16.1.16</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>

<callManagerGroup>
<members>
<member priority=”0″>
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>172.16.1.16</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</devicePool>

<sipProfile>
<sipProxies>
<backupProxy></backupProxy>
<backupProxyPort></backupProxyPort>
<emergencyProxy></emergencyProxy>
<emergencyProxyPort></emergencyProxyPort>
<outboundProxy></outboundProxy>
<outboundProxyPort></outboundProxyPort>
<registerWithProxy>true</registerWithProxy>
</sipProxies>

<sipCallFeatures>
<cnfJoinEnabled>true</cnfJoinEnabled>
<callForwardURI>x-cisco-serviceuri-cfwdall</callForwardURI>
<callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
<callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
<callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
<meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
<abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
<rfc2543Hold>false</rfc2543Hold>
<callHoldRingback>2</callHoldRingback>
<localCfwdEnable>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
</sipCallFeatures>

<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>3600</timerRegisterExpires>
<timerRegisterDelta>5</timerRegisterDelta>
<timerKeepAliveExpires>120</timerKeepAliveExpires>
<timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
<timerT1>500</timerT1>
<timerT2>4000</timerT2>
<maxRedirects>70</maxRedirects>
<remotePartyID>false</remotePartyID>
<userInfo>None</userInfo>
</sipStack>

<autoAnswerTimer>1</autoAnswerTimer>
<autoAnswerAltBehavior>false</autoAnswerAltBehavior>
<autoAnswerOverride>true</autoAnswerOverride>
<transferOnhookEnabled>false</transferOnhookEnabled>
<enableVad>false</enableVad>

<stutterMsgWaiting>1</stutterMsgWaiting>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<startMediaPort>16384</startMediaPort>
<stopMediaPort>32766</stopMediaPort>

<sipLines>
<line button=”1″>
<featureID>9</featureID>
<featureLabel>0011</featureLabel>
<proxy>172.16.1.16</proxy>
<port>5060</port>
<name>8047</name>
<displayName>8047</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName></authName>
<AuthUserName></AuthUserName>
<authPassword></authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>0011</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>

</sipLines>

<voipControlPort>5060</voipControlPort>
<dscpForAudio>184</dscpForAudio>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>

</sipProfile>

<webAccess>1</webAccess>

<loadInformation>SIP3951.8-1-4a</loadInformation>

<capfAuthMode>0</capfAuthMode>
<capfList>
<capf>
<phonePort>3804</phonePort>
</capf>
</capfList>

<certHash></certHash>
<encrConfig>false</encrConfig>

</device>

[/stextbox]

  • Set DHCP server dengan opsi 150 dan diarahkan ke server IP PBX untuk tftpserver.
  • Karena IP phone Cisco 3911 tidak bisa menggunakan username dan password, tambahkan ekstensi 8047 langsung ke sip_custom.conf:

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″];Cisco IP PHone 3911
[8047]
deny=0.0.0.0/0.0.0.0
secret=
canreinvite=no
context=from-internal
host=dynamic
type=friend
nat=yes
port=5060
qualify=yes
transport=udp
pickupgroup=
dial=SIP/8047
mailbox=8047@device
permit=0.0.0.0/0.0.0.0[/stextbox]

  • Edit extensions_custom.conf di bawah context [from-internal-custom] tambahkan baris:

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″];cisco 3911
exten => 8047,1,Dial(SIP/8047,30)[/stextbox]

  • Setelah klik Save dan Reload Asterisk, cabut dan nyalakan perangkat ip phone Cisco 3911. Jika berhasil, maka ip phone bisa digunakan untuk menelpon dan juga ditelpon.

photo_2016-11-07_15-59-51

 

Link Download:

Line/Trunk BLF di Grandstream GXP2200/GXP2200EXT & Elastix

Kadang memigrasikan sebuah PBX lama ke Asterisk based IP PBX gampang-gampang susah. Malah yang lebih membuat tidak mudah adalah user yang ingin mempertahankan “kebiasaan” dalam berkomunikasi melalui PBX lama. Salah satunya, yang sedang saya kerjakan adalah request operator untuk memunculkan indikator line/trunk mana yang kosong seperti di telepon keytel lamanya.

panasonic-digital-proprietary-telepon-kx-dt321-7524-765028-1

Sedangkan perangkat penggantinya adalah sebuah ip phone keluaran Grandstream seri GXP2200 + GXP2200EXT yang memiliki tambahan board dengan 20 tombol/lampu BLF (karena layar bisa digeser, bisa memuat 40 tombol cepat ekstensi yang bisa dihubungi).

gxp2200ext2_822f7560f300417004402e44dc5c486a

Akhirnya diputuskan memanfaatkan lampu indikator BLF tersebut untuk keperluan indikator line/trunk. Yang dilakukan adalah sebagai berikut:

Setting Elastix

Dengan asumsi IP PBX yang digunakan adalah Elastix dengan 10 line PSTN , maka edit file extensions_custom.conf melalui web (menu PBX -> Tools -> Asterisk File Editor -> Show Filter) dan tambahkan baris di bawah [from-internal-custom] seperti berikut:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

[from-internal-custom]

exten => LINE01,1,Dial(DAHDI/1)
exten => LINE01,hint,DAHDI/1
exten => LINE02,1,Dial(DAHDI/2)
exten => LINE02,hint,DAHDI/2
exten => LINE03,1,Dial(DAHDI/3)
exten => LINE03,hint,DAHDI/3
exten => LINE04,1,Dial(DAHDI/4)
exten => LINE04,hint,DAHDI/4
exten => LINE05,1,Dial(DAHDI/5)
exten => LINE05,hint,DAHDI/5
exten => LINE06,1,Dial(DAHDI/6)
exten => LINE06,hint,DAHDI/6
exten => LINE07,1,Dial(DAHDI/7)
exten => LINE07,hint,DAHDI/7
exten => LINE08,1,Dial(DAHDI/8)
exten => LINE08,hint,DAHDI/8
exten => LINE09,1,Dial(DAHDI/9)
exten => LINE09,hint,DAHDI/9
exten => LINE10,1,Dial(DAHDI/10)
exten => LINE10,hint,DAHDI/10

[/stextbox]

Klik Save dan Reload Asterisk. Setelah itu, edit sip_custom.conf dari web juga dan tambahkan baris:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″][LINE01]
subscribecontext=from-internal-custom
[LINE02]
subscribecontext=from-internal-custom
[LINE03]
subscribecontext=from-internal-custom
[LINE04]
subscribecontext=from-internal-custom
[LINE05]
subscribecontext=from-internal-custom
[LINE06]
subscribecontext=from-internal-custom
[LINE07]
subscribecontext=from-internal-custom
[LINE08]
subscribecontext=from-internal-custom
[LINE09]
subscribecontext=from-internal-custom
[LINE10]
subscribecontext=from-internal-custom [/stextbox]

Atau kalau mau lebih ringkes:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″][trunk-blf](!)

subscribecontext=from-internal-custom

[LINE01](trunk-blf)

[LINE02](trunk-blf)

[LINE03](trunk-blf)

[LINE04](trunk-blf)

[LINE05](trunk-blf)

[LINE06](trunk-blf)

[LINE07](trunk-blf)

[LINE08](trunk-blf)

[LINE09](trunk-blf)

[LINE10](trunk-blf)[/stextbox]

Klik Save dan Reload Asterisk.

Setting Di Grandstream GXP2200

Login di web manajemen GXP2200, pilih tab Advanced Settings -> MPK EXT1 Settings lalu pilih line MPK 1 sampai dengan 10. Untuk pengisian, misal di MPK nomer 10:

Key ModeBusy Lamp Field (BLF)

Account : <nama akun SIP>

Name: <nama line yang akan muncul di layar> LINE10

UserID: <sesuai setting di sip_custom.conf> LINE10

line-pstn-monitoring

Setting yang sama untuk line 1 – 9 seperti pada gambar. Jika berhasil, maka seluruh line/trunk akan terdeteksi di BLF GXP2200EXT.

photo_2016-11-06_00-11-37

Kalau kita melakukan panggilan keluar, maka line yang digunakan akan berwarna merah:

photo_2016-11-06_00-11-43

Selain itu kita juga bisa memilih hendak menelpon melalui line/trunk yang manapun dengan menekan salah satu tombol BLF line/trunk tersebut. Dan yang lebih lucu lagi, kita bisa menyusun ulang tombol-tombol BLF sesuai permintaan. Misal, LINE01 di baris BLF di atas dimulai dari sebelah kanan, lalu LINE02 di kiri, LINE03 ke kanan dst seperti zigzag. Request dari user, agar supaya semua BLF terkumpul di sebelah kiri semua. Di halaman MPK EXT1 Settings di atas, kita bisa mengurutkan dengan menekan tombol up down dengan mudah.

photo_2016-11-06_00-17-51

Selamat mencoba!

[Tips] Menghilangkan Warning “chan_iax2.c: update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds”

Pernah menemui log seperti ini:

[2016-09-27 11:31:14] NOTICE[2284]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:32:09] NOTICE[2284]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:33:04] NOTICE[2278]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:33:59] NOTICE[2280]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:34:54] NOTICE[2278]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)

contohnya kalau kita memiliki virtual FAX di Asterisk kita dengan IAX2 protocol, biasanya sering muncul log demikian. Sebenarnya ini ndak menimbulkan masalah, tapi cukup untuk memenuhi log, apalagi jika verbosity-nya tinggi. Untuk mengatasi warning tersebut,edit file /etc/iaxmodem/iaxmodem-cfg.ttyIAX1 dan ganti baris:

refresh         300

Menjadi:

refresh         60

Lalu reload iaxmodem dengan perintah:  service iaxmodem restart.

Selamat mencoba.

[tips] CallPickup

Pernah menemui kejadian seperti berikut?

Pada saat jam istirahat, atau beberapa kolega sedang ada rapat/pertemuan bulanan, kita menemui banyak meja kantor yang kosong. Beberapa meja terdapat ip phone yang kadang lupa diset DND (Do Not Disturb), sehingga ketika ada panggilan masuk, telepon akan tetap berdering. Lalu kebetulan kita sedang berada di ruangan yang sama, hanya saja letak pesawat telepon yang berdering agak jauh dari meja kita, sehingga harus berjalan dulu menuju ke meja tersebut untuk mengangkat telepon (bagi kantor yang menganggap semua panggilan masuk cukup penting), untuk sekedar memberitahukan orang yang dituju belum datang atau sedang ada keperluan ke luar.Itu sebabnya diperlukan call pickup. Ada dua jenis call pickup, yaitu call pickup biasa dan direct call pickup.

Call pickup biasa bisa diakses dengan menekan tombol *8 tanpa harus mengetahui nomer ekstensi mana yang sedang berdering, selama nomer ekstensi tersebut berada di dalam satu group call pickup.

Direct call pickup bisa diakses dengan menekan **<nomer ekstensi>, apabila kita sudah tau nomer ekstensi yang sedang berdering, atau jika ada lebih dari satu nomer ekstensi yang berdering saat kantor kosong, dan kita ingin memilih menerima telpon dari salah satu nomer yang berdering. Misal nomer ekstensi lain yang sedang berdering adalah 101, untuk melakukan direct call pickup, cukup menekan **101.

Supaya kita bisa melakukan call pickup, pertama harus ditentukan terlebih dahulu ekstensi-ekstensi mana saja yang boleh dipickup, kemudian jadikan satu group. Hal ini untuk menghindari kejadian bila kita hendak call pickup sebuah nomer ekstensi yang sedang berdering dengan kode *8, tapi tanpa sepengetahuan kita, ternyata telepon di kantor CEO juga sedang berdering, sehingga bisa alih-alih pickup ekstensi yang ada di dekat kita, malah ekstensi CEO yang kita pickup, atau departemen lain.

Masuk ke menu PBX -> PBX Configuration -> Extensions lalu pilih ekstensi yang hendak dijadikan satu group. Pada halaman tersebut di bagian callgroup dan pickupgroup masukkan nomer group, misal 1. Klik Submit setelah itu, lalu ulangi dengan ekstensi lain yang hendak dijadikan satu group. Setelah selesai klik Apply Config.

Pastikan setting berjalan dengan melakukan test.

 

Fax via Elastix

Mesin fax tidak akan hilang dalam waktu dekat. Walaupun sekarang penggunaan email dan document sharing sudah umum dan banyak di mana-mana, tapi fax masih memegang peranan penting di ceruk tertentu. Dunia hukum masih memandang bukti fax jauh lebih kuat dibandingkan email. Jadi, sudah wajar kalau kita yang berkecimpung di dunia VoIP/IP PBX untuk meluangkan waktu belajar setup fax. Berikut ini adalah contoh setup fax yang pernah saya lakukan.

 

SKENARIO

Sebuah perusahaan memiliki 6 line PSTN, 5 diantaranya hunting, dan satu line untuk fax. IP PBX yang mereka gunakan adalah distro Elastix (Asterisk based), dengan perangkat analog card OpenVOX 8 FXO port. Untuk setup Elastix dan deteksi card tidak akan saya bahas di sini karena saya dulu sudah pernah membahas. Asumsinya mesin IP PBX Elastix sudah terinstall dan card analog sudah disetup dengan baik. Outbound dan inbound call juga sudah disetup untuk line hunting. Sedangkan untuk line fax akan saya bahas di bawah.

Penggunaan fax di Elastix di sini dalah untuk mengurangi penggunaan kertas dalam penerimaan dan pengiriman fax. Untuk penerimaan, fax akan diterima sebagai attachment .pdf atau .tiff yang kemudian diforward ke email. Sedangkan untuk pengiriman, fax akan diupload dari webGUI Elastix sebagai attachment .pdf atau .tiff.

Karena pada dasarnya memiliki 6 jalur PSTN, jalur ini bisa dimanfaatkan untuk mengirim fax sekaligus jika sedang tidak digunakan. Header fax bisa disetting untuk tetap seperti terkirim dari nomer fax asli. Sedangkan untuk menerima fax hanya bisa dilakukan dari nomer fax resmi perusahaan yang dicantumkan di web atau di kartu nama.

 

SETUP

Fax Inbound

Seperti yang sudah dibahas sebelumnya, fax diterima dalam bentuk email dan disebarkan ke pihak yang memiliki wewenang menerima fax. Karena email yang menerima fax hanya bisa satu, maka perlu dibuatkan email alias yang didalamnya tidak ada inbox, hanya forward ke beberapa email yang berkepentingan. Misal dalam fax@perusahaan.com yang diforward ke hrd@perusahaan.org, manajemen@perusahaan.org, dst. Lalu selanjutnya:

  • Edit file /etc/asterisk/dahdi-channels.conf. Ubah semua context menjadi from-dahdi. Hal ini supaya kita bisa menambahkan inbound route dengan filter nomer DID. Restart service dengan perintah linux console: amportal stop; service dahdi stop; sleep 10 ; service dahdi start; sleep 5 ; amportal start
  • Untuk line fax, port yang digunakan dalah skenario di atas adalah port FXO nomer 6 dengan nomer (misal) 027411223344. Masuk ke menu webGUI Elastix, pilih PBX -> PBX Configurations -> DAHDI Channel DIDs -> Add Channel. Isikan:

Channel: 6

Description: Fax Line

DID: 027411223344

  • Klik Submit Changes.
  • Pilih menu PBX -> PBX Configurations -> Extensions. Di bagian menu pulldown Device pilih Generic IAX2 Device. Klik Submit.
  • Isikan konfiguratsi eksensi sebagai berikut:

User Extension: 1319

Display Name: Fax Line

secret: r4h4514

Klik Submit.

  • Buat Virtual Fax dengan memilih tab Fax -> New Virtual Fax dan isikan sebagai berikut:

Virtual Fax Name: Fax Line

Associated email: fax@perusahaan.com

 Caller ID Name: PT Perusahaan

Caller ID Number: +6227411223344

Fax Extension (IAX): 1319

Secret (IAX): r4h4514

C0untry Code: 62

Area Code: 274

  • Klik Save.
  • Masuk ke menu Unembedded FreePBX (untuk mengaktifkannya tidak akan saya bahas di sini karena sudah pernah saya posting sebelumnya). Masuk ke menu Application -> Extensions. Pilih extension 1319 lalu pada halam konfigurasi ekstensi tersebut, di opsi Fax beri tanda centang di opsi Enabled.
  • Di opsi Fax Email masukkan alamat email yang sudah disetup untuk menerima fax. Dalam contoh ini fax@perusahaan.com.
  • Di opsi Attachment Format pilih both.
  • Klik Submit lalu klik Apply Config. Tutup halaman Unembbeded FreePBX.
  • Pilih menu PBX -> PBX Configurations -> Inbound Routes -> Add Incoming Route. Isikan sebagai berikut:

Description: Fax

DID Number: 027411223344

Set Destination: Extensions -> Fax Line <1319>

  • Klik Submit lalu klik Apply Config.

Fax Outbound

  • Pilih menu PBX -> PBX Configuration -> Outbound  Routes -> Add Route. Isikan sebagai berikut:

Route Name: FAX Outbound

Dial pattern that will use this Routes: Fax outbound

Trunk Sequence for Matched Routes :

trunk fax

  • Klik Submit Changes lalu klik Apply Config.

Pada contoh di atas, semua trunk dimanfaatkan untuk mengirim fax. Untuk output hasil fax semuanya akan nampak seperti dari nomer fax utama perusahaan karena pada saat setup Virtual Fax, semua Caller ID Number disetup menjadi nomer telepon fax kantor.

TEST KIRIM FAX

  • Masuk ke menu Fax -> Virtual Fax -> Send Fax.
  • Di menu pulldown Fax Device pilih Virtual Fax dengan ekstensi 1319 seperti yang sudah kita buat sebelumnya.
  • Di isian Destination fax numbers isikan nomer fax tujuan. Nomer fax tujuan bisa lebih dari satu dengan dipisahkan tanda koma. Tapi harap diperhatikan jumlah line telpon yang akan digunakan. Tidak seperti email yang bisa mengirim ke beberapa tujuan sekaligus tanpa masalah, line fax harus mendial satu per satu nomer telepon tujuan dan prosesnya cukup panjang. Jadi ada baiknya destinasi tetap satu nomer saja.
  • Untuk muatan fax, kita bisa memilih text saja atau dengan mengupload file dokumen dengan ekstensi .pdf atau .tiff. Jika hanya ingin mengirimkan text, pilih button radio Text Information, lalu isikan pesan pada kotak yang sudah disediakan dan terakhir klik Send. Untuk
  • Untuk upload file dokumen, pilih button radio File Upload. Di bagian Select the files to FAX, klik Choose File untuk browse lokasi file yang hendak diupload. Jika sudah, klik Send.

Selamat mencoba!

Interkoneksi IP PBX Dengan IAX2 Trunk

Sebenarnya ini tema lama, tapi baru kesampaian posting kali ini, karena masih banyak yang menanyakan. Setup ini untuk menghubungkan dua atau lebih site yang menggunakan IP PBX Asterisk (khusus postingan ini saya menggunakan Elastix versi 4.0), sehingga dial antar ekstensi di kedua site bisa dilakukan dengan mudah, yaitu dengan hanya menekan nomer ekstensi langsung. Untuk dua sampai dengan 7 site, cara ini memang masih bisa digunakan. Jumlah trunk yang harus disetup untuk menghasilkan full mesh trunk network bisa didapatkan dengan rumus:

n x (n – 1)

Jadi, jika kita hendak menyambungkan 7 IP PBX sekaligus, maka akan dibutuhkan sebanyak 7 x (7 – 1) = 42 trunk!

Untuk interkoneksi IP PBX dengan jumlah lebih itu, setup menjadi rumit dan disarankan menggunakan DUNDi (Distributed Universal Numbering Discovery). Lain kali kalau ada waktu dan server buat bermain akan saya bahas di sini.

Yang perlu disiapkan adalah sebagai berikut:

  1. Jika kedua site berada di dua network/tempat/kota yang berbeda, sangar disarankan koneksi antar site menggunakan VPN (PPTP, L2TP, OpenVPN, VPLS, MPLS, EoIPdll). Dan apabila sangat terpaksa menggunakan ip address public, letakkan server IP PBX di bawah router/firewall dan lakukan port forward saja (jangan 1:1 Nat!!!). Trunk menggunakan IAX2, port forward menjadi mudah karena hanya dibutuhkan satu port untuk signalling dan media stream, yaitu port TCP/UDP 4569.
  2. Perencanaan penomoran ekstensi. Ini sangat penting karena untuk mempermudah routing panggilan. Jika memiliki dua buah IP PBX yang hendak diinterkoneksi, gunakan kepala ekstensi yang berbeda, misal kantor A menggunakan 4 digit dengan kepala 1 (1001, 1002, 1003, dst), lalu kantor B menggunakan 4 ekstensi dengan kepala 2 (2001, 2002, 2003, dst). Sebagai saran tambahan, jika site mencapai lebih dari 7 dan tetap akan menggunakan interkoneksi cara ini, tambahkan digit ekstensi, misal menjadi 5 atau 6 digit. Kelak akan sangat membantu jika kita hendak menggunakan prefix tambahan (misal untuk trunk ke PSTN/ITSP), atau jumlah site mencapai lebih dari 10 site.
  3. Trunk yang akan digunakan adalah IAX2 jika masing-masing IP PBX adalah Asterisk based. Jika tidak, bisa menggunakan SIP. Alasan menggunakan IAX2 karena hanya menggunakan satu port untuk signalling dan media stream (SIP menggunakan port signalling yang berbeda dengan media stream), sehingga pengaturan di firewall cukup mudah. Selain itu IAX2 memang didesain untuk mengatasi permasalahan NAT.

ASUMSI

  1. Dalam contoh setup ini akan digunakan dua buah IP PBX Elastix untuk dua buah kantor (Kantor A dan Kantor B).
  2. Masing-masing kantor memiliki ekstensi dengan panjang 4 digit dengan awalan berbeda. Kantor A berawalan 1 (1001, 1002, 1003), dan kantor B berawalan 2 (2001, 2002, 2003).
  3. Semua ekstensi dibuat dengan opsi nat=yes atau nat=force_rport,comedia untuk mengantisipasi one way audio.
  4. IP address Elastix kantor A adalah 10.0.1.10, dan untuk Kantor B 10.0.2.20.
  5. Saya menganggap tidak perlu lagi melakukan screenshot untuk lokasi menu WebGUI karena menu-menu di WebGUI Elastix sudah cukup jelas dan mudah diikuti hanya dengan petunjuk tulisan.

SKENARIO

  1. IP PBX kantor A akan merigstrasikan diri ke IP PBX kantor B, sehingga semua ekstensi di Kantor A bisa melakukan panggilan ke ekstensi di Kantor B hanya cukup dengan menekan nomer ekstensi yang dituju (tanpa prefix). Pada gambar skema di bawah, trunk Kantor A menuju Kantor B digambarkan dengan garis penuh warna merah. Sedangkan panggilan dari ekstensi Kantor A ke ekstensi Kantor B digambarkan dengan garis putus-putus warna merah.
  2. IP PBX kantor B akan meregistrasikan diri ke IP PBX kantor A, sehingga semua ekstensi di Kantor B bisa melakukan panggilan ke ekstensi di Kantor A hanya cukup dengan menekan nomer ekstensi yang dituju (tanpa prefix). Pada gambar skema d bawah, trunk kantor B menuju Kantor A digambarkan dengan garis penuh warna biru. Sedangkan panggilan dari ekstensi Kantor B ke ekstensi Kantor A digambarkan dengan garis dengan garis putus-putus warna biru.

IAX2 trunk

SETUP

SETUP KANTOR A

1. Masuk ke menu PBX -> PBX Configuration -> Trunks -> Add IAX2 Trunk. Isikan sebagai berikut:

Trunk Name: RouteToKantorB

PEER Details:

type=peer
host=10.0.2.20
context=from-internal
qualify=yes

Setelah itu klik Submit Changes.

2. Pilih menu PBX -> Tools -> Asterisk File Editor -> Show Filter. Isikan pada filter: iax_custom lalu klik nama file iax_custom.conf. Isikan seperti berikut:

[RouteToKantorB]
deny=0.0.0.0/0.0.0.0
context=from-internal
host=dynamic
type=friend
port=4569
qualify=yes
permit=10.0.2.20/255.255.255.255
requirecalltoken=no
calltokenoptional=0.0.0.0/0.0.0.0

Klik Save dan Reload Asterisk.

3. Pilih menu PBX -> PBX Configuration -> Outbound Routes -> Add Route. Lalu isikan sebagai berikut:

Route Name: ToKantorB

Di bawah opsi Dial Patterns that will use this Route isikan pada kotak match pattern: 2XXX

Lalu di menu drop down Trunk Sequence for Matched Routes pilih  RouteToKantorB, kemudian klik Submit Changes.

4. Terakhir klik Apply Config.

 

SETUP KANTOR B

1. Masuk ke menu PBX -> PBX Configuration -> Trunks -> Add IAX2 Trunk. Isikan sebagai berikut:

Trunk Name: RouteToKantorA

PEER Details:

type=peer
host=10.0.1.10
context=from-internal
qualify=yes

Setelah itu klik Submit Changes.

2. Pilih menu PBX -> Tools -> Asterisk File Editor -> Show Filter. Isikan pada filter: iax_custom lalu klik nama file iax_custom.conf. Isikan seperti berikut:

[RouteToKantorA]
deny=0.0.0.0/0.0.0.0
context=from-internal
host=dynamic
type=friend
port=4569
qualify=yes
permit=10.0.1.10/255.255.255.255
requirecalltoken=no
calltokenoptional=0.0.0.0/0.0.0.0

Klik Save dan Reload Asterisk.

3. Pilih menu PBX -> PBX Configuration -> Outbound Routes -> Add Route. Lalu isikan sebagai berikut:

Route Name: ToKantorA

Di bawah opsi Dial Patterns that will use this Route isikan pada kotak match pattern: 1XXX

Lalu di menu drop down Trunk Sequence for Matched Routes pilih  RouteToKantorA, kemudian klik Submit Changes.

4. Terakhir klik Apply Config.

TEST

  1. Register ekstensi-ekstensi yang diperlukan untuk test seperti pada gambar di atas (1001 dan 1002 untuk IP PBX Kantor A. 2001 dan 2003 untuk IP PBX Kantor B).
  2. Lakukan panggilan dari ekstensi 1002 (x1002) ke ekstensi 2001 (x2001) untuk test trunk dari IP PBX Kantor A ke IP PBX Kantor B.
  3. Lakukan panggilan dari ekstensi 2003 (x2003) ke ekstensi 1001 (x1001) untuk test trunk dari IP PBX Kantor B ke IP PBX Kantor A.
  4. Jika tidak ada kendala, masing-masing ekstensi dari IP PBX yang berbeda seharusnya sudah bisa tersambung dan saling bicara. Jika masih belum bisa, ikuti baik-baik langkah di atas, mungkin ada yang terlewat.

Selamat mencoba!