Yealink T19 E2 dengan OPUS

Yay!! Hari ini dapet kiriman Yalink T19 E2 untuk dicoba dengan codec OPUS dan berjalan baik sejauh ini. Belum tau bagaimana nanti jika sudah dipasang di lapangan. Ada keperluan panggilan melalui jalur data satelit yang sudah tentu latensinya tinggi. G729 tidak dapat mengakomodir komunikasi dengan baik, hingga akhirnya dicoba dengan OPUS dan diterima cukup baik.

Beberapa waktu yang lalu sudah mencoba mengontak beberapa produsen IP phone, rata-rata codec OPUS hanya didukung di perangat hi-end, maklum, butuh prosesor agak kenceng. Entah bagaimana Yealink bisa membuat firmware codec OPUS di perangkat low end seperti kelas T19 ini. Love it!

[Tips] Problem Mengaktifkan Kamailio TLS Dengan LetsEncrypt

Jadi barusan nyoba mengaktifkan TLS di SIP server Kamailio saya dengan LetsEncrypt. Pada intinya instalasi sertifikat dengan certbot-auto cukup mudah. Kali ini tinggal menambahkan konfigurasi di tls.cfg di dalam direktori konfigurasi Kamailio:

[server:default]
method = TLSv1
verify_certificate = no
require_certificate = no
certificate = /etc/letsencrypt/live/domain.tld/fullchain.pem
private_key = /etc/letsencrypt/live/domain.tld/privkey.pem

Lalu di file kamailio.cfg SIP server (ip address 192.168.0.123) edit/tambahkan baris berikut:

enable_tls = yes
listen=192.168.0.123:5061

####### TLS Parameters #########
loadmodule "tls.so"
modparam("tls", "config", "/etc/kamailio/tls.cfg")
modparam("tls", "low_mem_threshold1", 0)

Ketika mencoba reload Kamailio, saya mendapati error seperti berikut:

kamailio[18322]: ERROR: tls [tls_domain.c:529]: load_cert(): TLSs<defaul>: Unable to load certificate file '/etc/letsencrypt/live/domain.tld/fullchain.pem'
kamailio[18322]: ERROR: tls [tls_util.h:42]: tls_err_ret(): load_cert:error:0200100D:system library:fopen:Permission denied
kamailio[18322]: ERROR: tls [tls_util.h:42]: tls_err_ret(): load_cert:error:20074002:BIO routines:FILE_CTRL:system lib
kamailio[18322]: ERROR: tls [tls_util.h:42]: tls_err_ret(): load_cert:error:140DC002:SSL routines:SSL_CTX_use_certificate_chain_file:system lib
kamailio[18322]: ERROR: <core> [core/sr_module.c:923]: init_mod_child(): Error while initializing module tls (/usr/lib64/kamailio/modules/tls.so)

f
Karena ada indikasi error yang disebabkan kepemilikan file cert, perlu diubah hak akses file dengan langkah berikut:

root# chmod go+x /etc/letsencrypt/archive
root# chmod go+x /etc/letsencrypt/live

catatan: gunakan sudo juga bukan login sebagai root.

Setelah itu dicoba kembali reload Kamailio dan masalah sudah tidak muncul lagi. Untuk check ,apakah port sudah listen ke TLS, jalankan:

root# ss -ln | egrep "5061"

Links:

Mencoba ‘firewalld’ Sebagai Pengganti ‘iptables’

Dari awal dulu kenal ipchains trus ganti jadi iptables. Belum sempet mainan sampe ngeh banget, eh sekarang sudah ada firewalld. Karena kebanyakan berkutat dengan distro Centos 7 yang defaultnya menggunakan firewalld, akhirnya mau ndak mau ya harus ngeh juga walaupun sedikit-sedikit. Sebelumnya saya pernah posting soal iptables untuk Asterisk di sini. Jadi saya coba ndak jauh-jauh mengingat perintah berikut ini untuk server-server VoIP saya. Yang biasanya saya lakukan sebagai berikut:

Mengaktifkan firewalld agar secara default up setelah reboot atau start.

# systemctl enable firewalld
# systemctl start firewalld

Mengganti port ssh dari 22 ke 8022 (soalnya kalo ndak begitu, selalu diprobe dari mana-mana):

# firewall-cmd --permanent --zone=public --add-port=8022/tcp
# firewall-cmd --permanent --zone=public --remove-service=ssh

Lalu menambahkan port-port penting untuk produksi:

# firewall-cmd --permanent --zone=public --add-service={http,https}
# firewall-cmd --permanent --zone=public --add-port={5060,5061,7000,7001,8000,8443,11000}/tcp
# firewall-cmd --permanent --zone=public --add-port={5060,5061,7000,7001,8000,8443,11000}/udp
# firewall-cmd --permanent --zone=public --add-port=16384-32784/udp

Lalu menambahkan blok ip address yang diperbolehkan untuk mengakses service ke server:

# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.4" accept'
# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="6.7.8.0/24" accept'

Optional, kita bisa menambahkan blocking ICMP. Pertama, kita bisa lihat list tipe ICMP:

# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option

dari list di atas misal kita akan melakukan block echo-reply:

# firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply

Jika dirasa sudah cukup, reload rule di atas dengan perintah:

# firewall-cmd --reload

Dari contoh di atas, sudah keliatan polanya kan? Jika masih belum juga, url berikut ini bisa membantu menjelaskan cara kerja firewalld dengan lebih jelas.

Selamat mencoba!

[Tips] “sngrep” Sebagai Pengganti “ngrep”

Kadang satu atau dua server yang sedang saya tangani tidak selalu bisa terambung ke monitoring Homer. Jadi untuk troubleshoot masih harus meminta bantuan ngrepHanya saja perintahnya cukup panjang dan agak susah merunut ketika trafik sedang ramai. Belakangan nemu tool yang sebenarnya berbasis ngrep, hanya memang dikhususkan untuk trafik SIP, namanya sngrep

Di Yum packaging Centos 7 saat ini belum ada, jadi harus menambahkan file /etc/yum.repos.d/irontec.repo dengan isi:

[irontec]
name=Irontec RPMs repository
baseurl=http://packages.irontec.com/centos/$releasever/$basearch/

tambahkan public key:

rpm --import http://packages.irontec.com/public.key

jalankan update dan install:

[root@aio ~]# yum check-update -y
[root@aio ~]# yum install sngrep -y

Untuk menjalankan cukup ketik: sngrep

Dari tabel di atas kita bisa menggerakkan highlight ke atas dan ke bawah untuk memilih barus transaksi yang hendak dilihat. Misal hendak melihat salah satu proses Register, turunkan highlight ke daftar Method Register lalu tekan enter:

Contoh dialog/transaksi REGISTER yang berhasil dan tidak berhasil seperti berikut:

Lebih enak liatnya kan?

Ada kalanya gambar garis transaksi dengan anak panah di atas muncul sebagai rentetan huruf q seperti: qqqqqqqqqqqqqqqqqqqqqqqqq>
hal ini bisa diatasi dengan menjalankan perintah:

[root@aio ~]# export NCURSES_NO_UTF8_ACS=1

Agar tidak mengulang perintah tiap kali kita login, tambahkan baris berikut di /root/.bash_profile:

export NCURSES_NO_UTF8_ACS=1

Setiap kali login ke username yang sama, maka perintah tersebut akan otomatis dieksekusi.
Selamat mencoba!

[TIPS] Problem Kamailio “contact uri is too long”

Suatu hari saya menemukan masalah Mobile Dialer tidak dapat register ke SIP server kecuali port SIP client diganti ke 5060. Saya pikir firewall SIP server memblokir akses SIP port ke client dari server. Tapi ternyata, saya mendapati error di SIP server sebagai berikut:

kamailio[7968]: WARNING: registrar [sip_msg.c:194]: check_contacts(): contact uri is too long: [sip:021xxxxxxxx@11.2.33.444:48573;app-id=123412341234;pn-type=firebase;pn-tok=fnszKs2QQoA:AbCdEfGHIJkLmNoPQRsTuVwXyZ_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;pn-silent=1;transport=udp]

Secara default panjang maksimal SIP contact URI kamailio diset 255. Kalo kondisi normal sebenarnya baik-baik saja. Tapi kebetulan saya mengaktifkan Google Firebase Cloud Messaging sehingga contact URI menjadi lebih panjang… daaaaann… karena port SIP saya setting random, ada kalanya port SIP client menjadi sepanjang 5 digit. Setelah dihitung, panjang contact URI akan pas 255 kalau port nya 4 digit seperti 5060. Kalo pas kebetulan dapet 48573 seperti di log, akan kelebihan satu digit. Akhirnya di config Kamailio saya tambahkan baris:

modparam("registrar", "contact_max_size", 500)

Lalu setelah reload, akhirnya mobile dialer bisa register dengan lancar

[Tips] Windows 10 Tersambung ke Internet Tapi Tidak Bisa Browsing

Memang sudah ndak bisa lepas dari Windows sih, jadi beberapa pekerjaan perlu digarap dengan aplikasi di bawah OS satu ini walaupun sudah mulai sering ake Ubuntu. Sampe suatu saat entah kenapa tidak bisa browsing sama sekali sementara kegiatan remote ssh, icmp ping, resolve dns, email OutLook masih bisa berjalan dengan lancar. Sampe akhirnya ketemu cara ini:

  • Jalankan  CMD prompt Windows 10 sebagai Administrator.
  • Ketik perintah: netsh int ip reset
  • Reboot Windows 10.
  • Jalankan CMD prompt Windows 10 sebagai Administator.
  • Ketik perintah: netsh winsock reset
  • Reboot Windows 10.

setelah itu laptop kembali bisa dibuat browse lancar.

Transcoding G711 ke Opus di Kazoo

Tempo hari kantor kedatangan tamu dari Aarenet. Mereka memperesentasikan layanan UC yang bisa mereka sediakan untuk level provider. Platform yang mereka gunakan buatan sendiri yang didevelop dari tahun 2004 – 2009, tanpa jualan dulu. Hasilnya juga ndak main-main. Menarik lah pokoknya. Kelak kalo punya ITSP sendiri mungkin kepikiran pakai produk mereka, terutama kalo sudah males ngoprek. Hehehe.

Ada beberapa hal yang bisa dipelajari dari presentasi mereka, yang juga bisa diterapkan di network yang lagi saya bangun. Dari sekian banyak hal, saya jadi ngeh kalau ingin layanan UC bisa diakses dari jaringan 3G/4G (untuk saat ini), yang dipake adalah codec Opus. Hal lain yang saya pelajari dari mereka mungkin nanti saja diceritakan dalam postingan berikutnya (kalo sempet dan inget). Sekarang ini sudah banyak aplikasi softphone yang sudah menggunakan Opus. Salah satu yang saya pakai di PC/laptop yang cukup ringan adalah Microsip. Sedangkan di smartphone, saya memanfaatkan Linphone. Jadi di media server Kazoo yang menghadap ke user akan selalu dipaksa menggunakan Opus (kecuali jika user hendak menggunakan fax di mana harus menggunakan codec G711 ulaw/alaw), sedangkan di sisi menghadap OLO (Other Local Operator) akan tetap menggunakan G711 untuk menjamin kualitas. Karena media server melakukan transcoding, maka di FreeSWITCH ditambahkan konfigurasi seperti berikut:

  • Di sip profile (kebetulan dalam topologi Kazoo hanya punya satu profile), tambahkan baris:
    • disable-transcoding = false (tujuannya untuk mengaktifkan transcoding).
    • inbound-late-negotiation = true (tujuannya supaya media server tidak memilih codec hingga RTP lewat).
    • inherit_codec = true (tujuannya adalah agar media server mencoba codec yang pertama digunakan oleh call leg satunya. Hal ini berhubungan dengan penghematan resource server).
<param name="inbound-late-negotiation" value="true"/>
<param name="inherit_codec" value="true"/>
<param name="disable-transcoding" value="false"/>
  • di dalam freeswitch.xml (di FS Kazoo tidak ada vars.xml) tambahkan baris:
<X-PRE-PROCESS cmd="set" data="media_mix_inbound_outbound_codecs=true"/>
  • Dan terakhir, paksa Device yang teregister ke Kazoo untuk selalu menggunakan Opus dengan cara hanya mengaktifkan codec Opus di setting Device dan di masing-masing software SIP client:

Ketika kita coba melakukan panggilan, maka SDP akan tampak seperti:

INVITE

v=0
o=FreeSWITCH 1522990346 1522990347 IN IP4 116.68.171.76
s=FreeSWITCH
c=IN IP4 1.2.3.4
t=0 0
m=audio 25278 RTP/AVP 102 101 13
a=rtpmap:102 opus/48000/22
a=fmtp:102 useinbandfec=1; maxaveragebitrate=30000; maxplaybackrate=48000; ptime=20; minptime=10; maxptime=40
a=rtpmap:101 telephone-event/48000
a=fmtp:101 0-16
a=rtpmap:13 CN/48000
a=ptime:20

Selamat mencoba!

Ref:

[Tips] Mengganti Nama Multiple File Dalam Direktori

Sepele sih, entah kenapa automake mencari Makefile.in alih-alih mencari Makefile.am. Pasti ada alasannya cuma kondisi sudah cape, jadi saya pikir kapan-kapan saja nyarinya. Paling gampang ngganti nama Makefile.am menjadi Makefile.in. Pada saat sudah merename satu nama file tersebut, ternyata di sub direktori yang sama ada banyak sekali Makefile.am, dan mengganti satu per satu sepertinya bodoh. Akhirnya pake cara perintah shell berikut yang mengcopy file Makefile.am ke Makefile.in dalam direktori yang sama.

$ find -iname "Makefile.am" -exec rename Makefile.am Makefile.in '{}' \;

dan seluruh nama Makefile.am dicopy ke Makefile.in dalam direktori yang sama dan subdirektorinya.

2018

Sudah mulai awal tahun lagi. Cepet banget 12 bulan, ndak tau ilangnya ke mana. Resolusi tahun lalu banyak  yang belum tercapai, malah dapet hasil yang ndak masuk ke daftar resolusi. Jadi untuk tahun ini kira-kira daftarnya seperti ini:

  • Lancar mainan OpenSIPS, Kamailio, dan FreeSWITCH.
  • Lancar dengan Kazoo.
  • Mulai lagi utak atik bahasa pemrograman.
  • Beli gitar akustik.
  • Six packs.
  • Ke Amrik lagi.
  • Mbayar utang-utang.

Kayaknya yang paling penting itu saja. Semoga kali ini tidak meleset, terutama yang terakhir itu. Amin.

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 =&gt; 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