Membuat DNS Filtering dengan BIND RPZ

Pemerintah saat ini sedang berusaha melakukan pemblokiran konten pornografi dengan gencarnya. Para penyedia layanan internet (ISP dan NAP) diwajibkan untuk melakukan pemblokiran terhadap situs-situs yang mengandung konten pornografi. Pemerintah melakukan sidak ke ISP / NAP untuk mengecek apakah sudah dilakukan pemblokiran konten pornografi atau belum. Jika ternyata masih bisa mengakses situs-situs yang mengandung konten pornografi, maka mereka akan ditegur dengan surat peringatan resmi.

Untuk melakukan pemblokiran konten pornografi, cara yang paling mudah adalah dengan menggunakan DNS filtering yang cara kerjanya me-redirect request DNS dari pengguna ke halaman web tertentu yang berisi peringatan bahwa situs yang berusaha diakses telah diblokir karena mengandung konten pornografi.

Sebenarnya saat ini sudah tersedia publik DNS filtering di Indonesia yang dibuat oleh Yayasan Nawala Nusantara biasa disebut dengan DNS Nawala. Namun terkadang masih bisa lolos dari filtering mungkin overload dikarenakan terlalu banyak yang menggunakannya.

Oleh karena itu Pemerintah dalam hal ini Kementrian Kominfo mewajibkan ISP / NAP untuk membangun DNS filtering sendiri. Tulisan singkat ini untuk memberikan panduan bagaimana cara membuat DNS filtering dengan RPZ menggunakan software BIND. RPZ (Response Policy Zones) merupakan salah satu fitur yang terdapat pada BIND9.8+ yang memungkinkan resolver (DNS server) untuk melakukan penerjemahan terhadap request yang sudah didefinisikan pada zone file. Situs-situs yang akan diblokir harus didefinisikan terlebih dahulu di zone file untuk diarahkan (di-redirect) ke server tertentu yang sudah kita siapkan.

Dalam panduan ini saya akan menggunakan Ubuntu 14.04 dengan BIND versi 9.9.5. Konfigurasi pada distro Linux yang lain seperti CentOS, RedHat, Fedora, atau Slackware mestinya identik hanya penamaan dan penempatan file konfigurasinya saja yang mungkin berbeda. Mari kita langsung saja ke langkah-langkahnya:

1. Install BIND 9

sudo apt-get install bind9

2. Edit file /etc/bind/named.conf.options menjadi seperti berikut:

options {
    directory "/var/cache/bind";

    dnssec-validation auto;
    auth-nxdomain no;
    listen-on-v6 { any; }; 
    
    check-names master ignore;
    check-names slave  ignore;
    allow-query { 127.0.0.1; 10.11.12.0/24; };
    response-policy { zone "rpz.zone"; };
};

zone "rpz.zone" {
    type master;
    file "/etc/bind/db.rpz.zone";
    allow-query { any; };
};

3. Buat file baru dengan nama ‘db.rpz.zone’ di folder /etc/bind/

Inilah file zone yang nantinya akan berisi domain-domain yang akan di-redirect ke server kita sendiri yang sudah disiapkan. Isi file ‘db.rpz.zone’ adalah sebagai berikut:

$TTL 1H
@       IN             SOA LOCALHOST. hostmaster.local. (1 1h 15m 30d 2h)
@       IN             NS  LOCALHOST.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1

4. Download database domain yang harus diblokir di website Kominfo (http://trustpositif.kominfo.go.id/files/)

Untuk men-download-nya, klik menu Shares > Database > blacklist > porn, kemudian klik ‘domains’ untuk mulai mengunduhnya. File berukuran sekitar 12.37 MB.

5. Setelah selesai mengunduh file ‘domains’ pada langkah no. 4 di atas, langkah berikutnya adalah membuat zone entry dengan format “namadomain IN A IP_ADDRESS” yang ditambahkan ke dalam file db.rpz.zone. Kalau kita buka file ‘domains’ tersebut hanya berisi daftar domain saja. Supaya bisa dibaca oleh BIND DNS, kita perlu mengubahnya dalam format “namadomain IN A IP_ADDRESS”. Kita akan menggunakan tool ‘awk’ untuk meng-generate-nya.

awk '{print $1" IN A 10.11.12.13"}' domains >> /etc/bind/db.rpz.zone
awk '{print "*."$1" IN A 10.11.12.13"}' domains >> /etc/bind/db.rpz.zone

Script pertama akan mengambil semua baris dalam file ‘domains’ dan menambahkan “IN A 10.11.12.13” pada tiap baris dan kemudian memasukkan / menambahkannya ke dalam file ‘db.rpz.zone’.

Script kedua akan mengambil semua baris dalam file ‘domains’ dengan menambahkan “*.” (bintang dan titik) sebelum namadomain dan “IN A 10.11.12.13” setelah namadomain pada tiap baris dan kemudian memasukkan / menambahkannya ke dalam file ‘db.rpz.zone’.

contohnya adalah sbb:

17bb.info IN A 10.11.12.13
*.17bb.info IN A 10.11.12.13

Sebagaimana kita tahu, jika hanya ada entry baris pertama (17bb.info), maka sub-domain dari domain tersebut (misalnya www.17bb.info, web.17bb.info) tidak ikut terblokir. Maka dari itu kita perlu menambahkan entry baris kedua (*.17bb.info) supaya semua sub-domain ikut terblokir.

Kemudian restart service BIND9 nya.

service bind9 restart

6. Test query DNS

Waktunya untuk melakukan tes dari server DNS (localhost) dengan menggunakan ‘dig’

dig @127.0.0.1 redtube.com

; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> @127.0.0.1 redtube.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49180
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;redtube.com.			IN	A

;; ANSWER SECTION:
redtube.com.		5	IN	A	10.11.12.13

;; AUTHORITY SECTION:
rpz.zone.		3600	IN	NS	LOCALHOST.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 11 02:47:21 WIB 2015
;; MSG SIZE  rcvd: 87

Dari hasil command dig di atas terlihat bahwa domain redtube.com mempunyai address 10.11.12.13 seperti yang sudah didefinisikan di zone file db.rpz.zone

7. Tes akses dengan menggunakan browser.

Setelah dipastikan DNS RPZ berjalan dengan benar, terakhir kita pastikan bahwa jika kita mengakses website nya, yang muncul adalah situs web yang sudah kita persiapkan yang berisi pemberitahuan bahwa website yang diakses telah diblokir karena mengandung konten pornografi seperti gambar di bawah ini sebagai contoh:

Membuat DNS Filtering dengan BIND RPZ

Semoga tulisan singkat ini membantu kita untuk mendukung program pemerintah tentant Internet Bersih dan Sehat.

  • Anony

    Selamat pagi mas Fuad,
    ini bentuk konfigurasi saya namun masih ada kesalahan, mohon bantuannya.

    • Selamat pagi juga. Untuk troubleshot:
      1. Apakah domain yg di query sudah terdapat di database db.rpz.zone?
      2. Service BIND sudah di-restart?
      3. Cek log nya.

  • Anony

    Untuk memfilter domain sudah berhasil kak, maaf namun pada saat verifikasi tampilkan pada halaman situsnya kok masih belum terblokir ya ? dan bagaimana cara agar membuat website tersebut terblokir dengan desain website kita sendiri ?

    • Congrats! Tadi sebelumnya apa masalahnya? Untuk membuat tampilan website sendiri, tinggal aktifkan web server-nya bisa dengan Apache, NGINX, atau yang lain.

      • Anony

        Oh baiklah mas, terimakasih.

  • Anony

    Gan pada saya saat ingin install apache2 muncul debug seperti ini “AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message” pada saat saya verifikasi ketik localhost pada address bar berhasil, dan pada saya saat install php5 muncul debug seperti itu juga tapi pada saat verifikasi ketik http://localhost/phpinfo.php di address bar muncul pada halaman page ”

    Not Found

    The requested URL /phpinfo.php was not found on this server.

    Apache/2.4.7 (Ubuntu) Server at localhost Port 80″ bagaimana cara mengatasinya gan ?

  • novian adhi jaya

    mas saya konfigure nya pake centos dns bind nya udah ga error cuma pas tes pake dig @127.0.0.1 redtube.com https://uploads.disquscdn.com/images/e653c3b1450bc91fa556c539960d05fac137bb913b00d1079567c8bfa4ab98a2.png

    • Coba cek log dan firewall / Selinux nya. Untuk keperluan troubleshot, coba buat zone domain testing (tanpa rpz) utk memastikan BIND nya berjalan dengan baik. Setelah itu baru enable rpz nya. Semoga membantu.

      • novian adhi jaya

        iya bener mas selinux ya di matiin aja ,,, baru bisa ngeresolv nih hehehe

        • Husni Alham Dhani

          bagaimana cara mematikan SElinux nya ?

          • Edit file /etc/selinux/config untuk memastikan bahwa nilai SELINUX=disabled

  • Syams Fathur

    Mas, ini kenapa kok servfail ya?

    • Husni Alham Dhani

      iya punya saya juga begitu.

  • adi pratomo

    salam mas Fuad, saya sudah coba filtering dengan rpz sesuai tulisan mas dan berhasil, nah yang saya ingin tanyakan, apakah bisa kita buat file log akses situs yang berhasil terblokir oleh db.rpz.zone?
    karena dari log /var/log/syslog hanya terbaca validating dan success resolving.
    terimakasih sebelumnya.

  • Fendi Kurniawan

    Punya saya masih fail kang
    berikut screeshoot konfig dan hasil tes query dnsnya

    • Coba lampirkan log nya saat / setelah eksekusi ‘dig @127.0.0.1 namadomain’

  • anynomous

    bagaimana untuk mendownload domains secara wget? kerana saya tidak punyai GUI di dalam server ubuntu saya.

  • azon

    saya pas mau download di http://trustpositif.kominfo.go.id/files/ di klik share kenapa kok malah java?

    • Apakah sudah dicoba dengan browser yg berbeda? Saya coba menggunakan Chrome, Firefox dan Safari tidak masalah.