Tutorial Simple Membuat Local DNS dengan Bind9 Docker untuk Intranet

Memiliki server lebih dari satu dengan beberapa server saling terhubung dalam jaringan terbatas atau intranet, menjadi suatu kebutuhan untuk pengarahan domain lokal ke server-server spesifik. Bisa jadi domain seperti intranet.loc atau semacamnya digunakan untuk menavigasi antara satu server dengan server lain. Letak server yang berada di intranet tentunya memerlukan tata kelola resolve domain tersebut sehingga suatu DNS resolver service dalam intranet menjadi suatu kebutuhan. Lantas bagaiman cara mudah untuk membuat DNS resolver local untuk menerjemahkan nama domain ke alamat IP di intranet ? Tulisan ini akan membahas tutorial membuat local DNS dengan Bind9 di dalam kontainer docker untuk menjadi DNS resolver local untuk intranet anda.

Apa itu DNS ?

DNS (Domain Name System) adalah sistem yang menerjemahkan nama domain ke alamat IP, memungkinkan kita untuk mengakses situs web dengan mudah menggunakan nama alih-alih angka IP. Dalam lingkungan jaringan lokal (intranet), memiliki server DNS lokal adalah kebutuhan untuk dapat menerjemahkan nama domain lokal yang tidak ditemukan pada DNS global. Semisal DNS global dapat menerjemahkan bahwa google.com adalah 8.8.8.8, maka DNS lokal dapat menerjemahkan intranet.loc menjadi 10.104.0.2, suatu IP lokal pada intranet anda.

Langkah 1: Persiapkan Lingkungan Docker

Pastikan Docker dan Docker-Compose sudah terpasang di sistem Anda. Anda dapat mengunduh dan menginstal Docker dari situs resminya jika belum terpasang.

Langkah 2: Siapkan Folder Konfigurasi Bind9

Pada tutorial ini konfigurasi Bind9 akan disimpan di dalam folder /home/bind9.

cd /home
mkdir bind9
cd bind9
mkdir config
mkdir cache
mkdir records

Langkah 3: Siapkan File konfigurasi Docker-Compose

Lakukan langkah berikut untuk membuat file konfigurasi docker-compose.

nano docker-compose.yml

Untuk service ini akan mengekspose port 58 pada localhost yang dipetakan pada port 53 TCP dan UDP container. Sebagai bahan pertimbangan untuk kebanyakan server port 53 sudah digunakan oleh systemd-resolver sehingga jika kita mengekspose Bind9 pada port 53 akan terjadi konflik. Untuk tutorial ini kita akan menggunakan user root dan timezone America/New_York. Untuk jaringan kita akan membuat jaringan baru yaitu bind9 dengan IP statik 172.21.0.253. Hal ini agar berikutnya memudahkan kita mendaftarkan Bind9 ke dalam DNS record.

version: "3"
services:
  bind9:
    container_name: bind9
    image: ubuntu/bind9:latest
    environment:
      - BIND9_USER=root
      - TZ=America/New_York
    ports:
      - 58:53/tcp
      - 58:53/udp
    networks:
      bind9_bind9:
        ipv4_address: 172.21.0.253
    volumes:
      - ./config:/etc/bind
      - ./cache:/var/cache/bind
      - ./records:/var/lib/bind
    restart: unless-stopped
networks:
  bind9:
    driver: bridge
    ipam:
      config:
        - subnet: 172.21.0.0/16
          gateway: 172.21.0.1

Langkah 4: Siapkan File Named.conf

Masuk ke file config, kita kemudian membuat file named.conf

cd /home/bind9/config
nano named.conf

File ini bertujuan memberikan akses kepada IP range yang kita berikan izin untuk mengakses bind9. Sekaligus menambahkan file zona yang pada tutorial ini kita gunakan intranet.loc.

acl internal {
  172.17.0.0/16;
  172.21.0.0/16;
  127.0.0.1;
  localhost;
  localnets;
};

options {
  forwarders {
    8.8.8.8;
    8.8.4.4;
  };
  allow-query { internal; };
};

zone "intranet.loc" IN {
  type master;
  file "/etc/bind/intranet.loc.zone";
};

Langkah 5: Siapkan File intranet.loc.zone

Masuk ke file config, kita kemudian membuat file named.conf

cd /home/bind9/config
nano intranet.loc.zone

File ini bertujuan untuk mengatur DNS record standar meliputi, A, AAAA, NS, MX, dll.

$TTL 2d
$ORIGIN intranet.loc.

@           IN      SOA     ns1.intranet.loc admin.intranet.loc (
                                20230218		; serial number
	                        3600			; refresh period
	                        600			; retry period
	                        604800			; expire time
	                        1800 			; negative TTL
                              )
@           IN      NS      ns1.intranet.loc.

ns1         IN      A	    172.21.0.253
@           IN      A	    172.17.0.1
test        IN      A       172.17.0.1

Langkah 6: Nyalakan Bind9

Untuk menyalakan Bind9 anda cukup melakukan docker-compose up -d

cd /home/bind9
docker-compose up -d

Langkah 7: Update DNS pada host server

Untuk mengupdate DNS pada host server secara instan anda dapat melakukan update pada /etc/resolv.conf

nano /etc/resolv.conf

kemudian tambahkan pada line teratas

nameserver 172.21.0.253

Langkah 8: Uji Coba pada Server Host

Terakhir anda dapat menguji cobakan dengan melakukan command nslookup

nslookup test.intranet.loc

Hasilnya akan menunjukkan 172.17.0.1

Langkah 9: Setup firewall untuk server

Misal anda menggunakan IP server lain 10.104.0.3, dan IP 10.104.0.2 pada server host eth1 network interface tambahkan ini

ufw allow from 10.104.0.3
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.104.0.2 --dport 53 -j DNAT --to-destination 10.104.0.2:58
iptables -t nat -A PREROUTING -i eth1 -p tcp -d 10.104.0.2 --dport 53 -j DNAT --to-destination 10.104.0.2:58

Langkah 10: Update DNS pada server lain

Untuk mengupdate DNS pada host server secara instan anda dapat melakukan update pada /etc/resolv.conf

nano /etc/resolv.conf

kemudian tambahkan pada line teratas IP dari Server Host Bind9

nameserver 10.104.0.2

Langkah 11: Uji Coba pada Server Lain

Terakhir anda dapat menguji cobakan dengan melakukan command nslookup

nslookup test.intranet.loc

Hasilnya akan menunjukkan 10.104.0.2. Selamat mencoba