Saya bingung mau ngasih judul apa yang pas. Tapi semoga setelah membaca tulisan saya ini, nanti bisa menangkap idenya dan memanfaatkannya dengan baik.
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.
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?