Skrip BASH Autoupdate /etc/hosts Sesuai IP Dinamis

7 minutes 517 1

Saya bingung mau ngasih judul apa yang pas. Tapi semoga setelah membaca tulisan saya ini, nanti bisa menangkap idenya dan memanfaatkannya dengan baik.

router

Akhir-akhir ini ada kerjaan kantor yang mengharuskan saya menggunakan API dari perusahaan rekanan di Singapura.

Karena API ini rahasia dan memuat data yang sensitif, mereka meminta saya untuk menambahkan entry alamat IP dan hostname di /etc/hosts daripada menggunakan nama domain.

Semua nampaknya tidak ada masalah, namun mereka memberi catatan bahwa alamat IP mereka dinamis (dynamic IP), dan untuk menangani ini mereka menggunakan layanan DynDNS.

Apakah IP dinamis itu? Di beberapa situasi, alamat IP yang kita gunakan bisa berubah, sesuai dengan aturan ISP. Kebanyakan ISP yang dipakai menggunakan sistem ini, sehingga setiap kita terhubung ke ISP, kita akan diberi alamat IP yang baru.

Masalah akan muncul saat kita bermaksud mengakses server di dalam jaringan yang menggunakan IP dinamis. Akan sulit karena alamat IP-nya terus berubah.

Solusinya adalah menggunakan DNS dinamis. DNS dinamis membuat IP dinamis berlaku seperti IP statis, dengan memberikan sebuah (biasanya) nama domain sehingga lebih mudah untuk diakses.

Ada banyak layanan penyedia DNS dinamis, salah satu yang dipakai oleh perusahaan rekanan kantor adalah DynDNS.

Perusahaan rekanan meminta kami untuk menambahkan entry di /etc/hosts sehingga mudah saat diakses karena tak perlu menghafal alamat IP. Tapi karena alamat IP-nya dinamis, mereka menyarankan untuk sering memeriksa alamat IP yang baru lalu menyesuaikannya di /etc/hosts.

Bagaimana cara mengetahui alamat IP yang baru? Dengan melakukan ping ke sebuah domain yang diatur oleh DynDNS.

Kenapa tidak langsung menggunakan domain, daripada repot-repot menggunakan hostname di /etc/hosts?

Server API yang diakses menggunakan HTTPS, dengan sebelumnya antar server pengakses dan server API bertukar sertifikat SSL yang harus ditanam di server masing-masing. Jika API tersebut diakses lewat domain atau hostname yang lain, akses akan ditolak karena tidak cocok dengan sertifikat SSL yang telah ditanam.

Cara ini memang tidak praktis. Daripada saya harus melakukan pekerjaan tersebut secara manual, saya lalu membuat sebuah skrip untuk melakukan pekerjaan tersebut secara otomatis. Skripnya sangat sederhana dan saya ingin membagikannya, siapa tahu ada yang menghadapi masalah yang sama.

Skrip ini dibuat menggunakan BASH, dengan memanfaatkan beberapa perintah dasar di sistem UNIX. Saya menggunakan BASH versi 4, dan seharusnya berjalan juga di BASH versi 3.

Pertama, kita harus mengetahui alamat IP-nya. Perusahaan rekanan memberikan sebuah domain untuk di-ping yang alamat IP hasil ping-nya digunakan di /etc/hosts. Konversi domain ke alamat IP ini dilayani oleh DynDNS.

Sebagai contoh, saya diberi domain matriphe.dyndns.org yang jika di-ping memberikan alamat IP: 74.125.236.71. Alamat IP ini nanti yang akan dituliskan di /etc/hosts sebagai alamat IP dari hostname apihostname.

Di file /etc/hosts sudah ada alamat IP yang didefinisikan sebelumnya. Berikut isi file /etc/hosts awal:

matriphe:~$ cat /etc/hosts
127.0.0.1 localhost 

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# API web service
74.125.236.64 apihostname
matriphe:~$

Untuk mendapatkan alamat IP baru, saya menggunakan perintah nslookup. Hasil eksekusi perintah-nya kira-kira seperti ini:

matriphe:~$ nslookup matriphe.dyndns.org
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	matriphe.dyndns.org
Address: 74.125.236.71

matriphe:~$

Kita akan ambil baris terakhir, yang merupakan alamat IP dari matriphe.dyndns.org yang baru, yang akan kita ganti di /etc/hosts. Untuk mengambil alamat IP ini, gunakan perintah grep dan sed.

matriphe:~$ nslookup matriphe.dyndns.org | grep Address | sed '$!d' | sed 's/Address: //'
74.125.236.71
matriphe:~$

Setelah kita bisa mendapatkan alamat IP, saatnya menuliskannya ke file /etc/hosts. Perintah-perintah tersebut dirangkai ke dalam skrip BASH yang nantinya akan kita eksekusi menggunakan crontab.

Berikut ini isi lengkap file BASH yang saya beri nama hostexchanger.sh:

#!/bin/bash
NEWHOST=`nslookup matriphe.dyndns.org | grep Address | sed '$!d' | sed 's/Address: //'`
if [[ $NEWHOST != "" ]]; then
sed 's/^(.*)apihostname$//' /etc/hosts > /tmp/hosts
sed '$d' /tmp/hosts > /tmp/hosts2
echo "$NEWHOST apihostname" >> /tmp/hosts2
cp /tmp/hosts2 /etc/hosts
rm /tmp/hosts
rm /tmp/hosts2
echo "IP address: $NEWHOST"
fi

Penjelasan perintah-perintah dari skrip di atas bisa dilihat di pastebin saya.

Karena skrip tersebut mengubah file /etc/hosts, maka dibutuhkan akses root. Jalankan perintah tersebut dengan sudo, dan hasilnya kira-kira seperti ini:

matriphe:~$ sudo ./hostexchanger.sh 
[sudo] password for matriphe: 
IP address: 74.125.236.71
matriphe:~$

Dan setelah dieksekusi, hasil dari file /etc/hosts adalah:

matriphe:~$ cat /etc/hosts
127.0.0.1 localhost 

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# API web service
74.125.236.71 apihostname
matriphe:~$

Berhasil! Sekarang tinggal masukkan ke crontab dan sesuaikan waktu eksekusinya. Saya memerintahkan crontab mengeksekusi perintah ini setiap jam.

Beberapa catatan:

  • Entry alamat IP dan hostname harus sudah didefinisikan terlebih dulu di /etc/hosts.
  • Jalankan sebagai root, termasuk saat menggunakan crontab, eksekusi crontab dengan sudo.
1 response
  1. Gravatar of Yohan
    Yohan

    Loh, kenapa harus pakai /etc/hosts kl masih harus pakai nslookup untuk dapatkan alamat IP? bukannya ketika kita query domain itu kita juga akan mendapatkan alamat IP yg terakhir?