IPTables untuk Asterisk Based IP PBX

Sampai saat ini masih ada rekan-rekan sysadmin yang memasang IP PBX (terutama Asterisk based) dengan menggunakan ip public langsung. Dan agak mengkhawatirkan lagi IP PBX tersebut tersambung ke jaringan telepon umum. Beberapa kali muncul kasus kebobolan yang menyebabkan mereka diharuskan membayar penggunaan telepon mencapai puluhan bahkan ratusan juta. Ada banyak alasan kenapa rekan-rekan masih harus memasang ip public langsung ke IP PBX, di antaranya karena topology dan alokasi ip address yang tidak memungkinkan DMZ, permasalahan VoIP jika harus dilewatkan NAT/port forward, dan lain sebagainya. Terlepas dari hal tersebut, sangat disarankan untuk melindungi IP PBX sebaik mungkin termasuk meletakannya di dalam IP PBX. Jika memang terpaksa harus meletakkan nya dengan ip public, maka berikut template IPTables yang bisa digunakan untuk mengurangi resiko kebobolan (tapi mohon diingat, cara ini bukan obat manjur untuk menahan penetrasi):

#!/bin/bash
 # cwd=/etc/sysconfig/
 #

#VARS
 EXTIF="eth0"
 INTIF="eth1"

# flush rule iptables jika masih ada
 iptables -F
 iptables -X

# allow inbound ssh connection melalui external/public interface
 iptables -A INPUT -p tcp --dport 22 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT

# set default policies (memperbolehkan semua outbound, block inbound, membatasi forwarding antar interfaces)
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT ACCEPT

# Memperbolehkan TCP 80 and 443
 iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Memperbolehkan RTP traffic
 iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT

# Memperbolehkan SIP traffic
 iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
 iptables -A INPUT -p udp --dport 5060 -j ACCEPT

# Memperbolehkan trafik dari interface loopback dan internal interface (jika ada)
 #iptables -A INPUT -i $INTIF -j ACCEPT
 iptables -A INPUT -i lo -j ACCEPT

# Memperbolehkan akses dari ip address yang sudah dikenali (kantor, rumah, dst), jika ada.
 iptables -A INPUT -i $INTIF -s XXX.XXX.XXX.XXX/XX -j ACCEPT
 iptables -A INPUT -i $INTIF -s XXX.XXX.XXX.XXX/XX -j ACCEPT

# Melewatkan koneksi dengan status established di interface external/public
 iptables -A INPUT -i $EXTIF -m state --state ESTABLISHED,RELATED -j ACCEPT

# memblokir trafik dari blok ip address private yang masuk via interface public
 iptables -A INPUT -i $EXTIF -s 10.0.0.0/8 -j DROP
 iptables -A INPUT -i $EXTIF -s 172.16.0.0/12 -j DROP
 iptables -A INPUT -i $EXTIF -s 192.168.0.0/16 -j DROP
 iptables -A INPUT -i $EXTIF -s 224.0.0.0/4 -j DROP
 iptables -A INPUT -i $EXTIF -s 240.0.0.0/5 -j DROP
 iptables -A INPUT -i $EXTIF -s 0.0.0.0/8 -j DROP
 iptables -A INPUT -i $EXTIF -s 169.254.0.0/16 -j DROP
 iptables -A INPUT -i $EXTIF -s 127.0.0.0/8 -j DROP

# ICMP
 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/sec -j ACCEPT

# SYN flood limiter
 iptables -A INPUT -p tcp --syn -m limit --limit 5/s -j ACCEPT

# ditutup dengan rule catch-all
 # LOG dan DENY semua packet yang belum masuk di rule.
 iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level debug
 iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

# menyimpan  setting
 iptables-save > /etc/sysconfig/iptables

#
 # Menampilkan rule di atas
 #
 iptables -L -v

 

Edit file tersebut sesuai dengan kondisi server masing-masing. Di sini saya mengasumsikan menggunakan dua interface. Berikut ini beberapa hal yang bisa ditambahkan untuk mengurangi resiko kebobolan

  • Gunakan dua interface LAN. Satu interface terpasang ip public dan interface lain terpasang ip address private untuk ke LAN. Biasanya saya hanya memperbolehkan Web GUI, dan SSH hanya bisa diakses dari LAN. Jika saya sedang tidak berada satu lokasi dengan server tersebut, saya mengaksesnya melalui VPN yang tersambung ke jaringan LAN.
  • set PermitRootLogin=no untuk ssh, dan buat akun shell tambahan yang dimasukkan list sudo supaya bisa melakukan aktifitas administrasi server.
  • Ubah port ssh dan web UI ke port lain yang hanya kita ketahui (misal 8241, 9231, dst), dan tetap difilter dengan IPTables.
  • Menambahkan setting httpd.conf misal:
<Directory>
    ...
    Deny from all
    Allow from 1.2.3.4
    Allow from 6.7.8.0/24
    Allow from 192.168.1.0/24
    Allow from 10.0.0.0/24
    Allow from 172.16.0.0/24
    ...
</Directory>

 

  • Bila perlu, block MySQL dari semua interface kecuali interface loopback/localhost.
  • Menambahkan fail2ban lebih bagus lagi.

Intinya, jadilan super paranoid jika berurusan dengan IP PBX terlebih yang tersambung ke jaringan telepon umum.

Tambahan

Jika terjadi sesuatu dan harus melakukan flush iptables, bisa dengan membuat script baru dengan isi:

#!/bin/sh

echo "Flushing Tables ..."

# Reset Default Policies
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT

# Flush all rules
iptables -F
iptables -t nat -F
iptables -t mangle -F

# Erase all non-default chains
iptables -X
iptables -t nat -X
iptables -t mangle -X

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>