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

 

[Tips] Kazoo Media Server – Tidak Bisa Memainkan Voice Recording

Jika kita memiliki platform Kazoo dengan media server terpisah, ada kemungkinan tidak bisa mendengarkan voice recording, misal, jika kita salah mendial nomer seharusnya mendapatkan pesan suara:

“The call can not be completed as dialed. Please check your number and dial again.”

alih-alih akan mendapatkan error message di console FreeSWITCH seperti berikut:

[ERR] mod_http_cache.c:1170 Received HTTP error 0 trying to fetch http://127.0.0.1:15984/system_media/en-us%2Ffault-can_not_be_completed_as_dialed/fault-can_not_be_completed_as_dialed.wav?rev=6-585c8f2e3b6b3f4063efb1c18cce5309

Sebelum melanjutkan ke setting HAPROXY, pastikan semua rekaman suara sudah berada di dalam direktori /opt/kazoo/sounds (dalam contoh ini, karena menggunakan bahasa inggris, lokasi direktori lengkapnya /opt/kazoo/sounds/en/us). Jika belum ada, copy manual langsung dari server ecallmgr yang sudah berjalan.

Selanjutnya, ubah config HAPROXY yang mengarah ke server database CouchDB (biasanya karena server terpisah dengan media server) dengan bind server ke 0.0.0.0 misal :

....
listen bigcouch-data
bind 0.0.0.0:15984
balance roundrobin
server db_1.couch.db 127.0.0.1:5984 check
server db_2.couch.db 127.0.0.1:5984 check
server db_3.couch.db 127.0.0.1:5984 check backup
server db_4.couch.db 127.0.0.1:5984 check backup

listen bigcouch-mgr
bind 0.0.0.0:15986
balance roundrobin
server db_1.couch.db 127.0.0.1:5986 check
server db_2.couch.db 127.0.0.1:5986 check
server db_3.couch.db 127.0.0.1:5986 check backup
server db_4.couch.db 127.0.0.1:5986 check backup
...

Pastikan juga firewall hanya menerima koneksi ke service-service tersebut dari ip address cluster kita sendiri untuk keamanan.

Lalu di server FreeSWITCH juga diinstall HAPROXY dengan config sebagai berikut (misal HAPROXY database terpasang di ip address 1.2.3.4 dengan port 15984 dan 15986):

....
listen bigcouch-data
bind 127.0.0.1:15984
balance roundrobin
server db_1.couch.db 1.2.3.4:15984 check
server db_2.couch.db 1.2.3.4:15984 check
server db_3.couch.db 1.2.3.4:15984 check backup
server db_4.couch.db 1.2.3.4:15984 check backup

listen bigcouch-mgr
bind 0.0.0.0:15986
balance roundrobin
server db_1.couch.db 1.2.3.4:15986 check
server db_2.couch.db 1.2.3.4:15986 check
server db_3.couch.db 1.2.3.4:15986 check backup
server db_4.couch.db 1.2.3.4:15986 check backup
...

Reload semua HAPROXY di ke-2 server/cluster tersebut, lalu test kembali.

 

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

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

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

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

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

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

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

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

Dan setelah dikosongkan:

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

Berikutnya dicoba lagi menjalakan perintah opensipsdbctl create :

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

Done.

Link: