Membuat Server Dynamic DNS Dan Script Update Pada Mikrotik

Sebagian besar ISP broadband saat ini memberikan IP address dinamik kepada pelanggannya dan kita diharuskan untuk membayar lebih mahal untuk bisa mendapatkan ip statik. Padahal seperti kita ketahui, sangat penting bagi kita untuk mengetahui IP address kita untuk berbagai keperluan seperti melakukan remote maupun web server atau mail server. Hal ini tidak akan menjadi permasalahan manakala kita memiliki IP address statik atau tetap, masalah akan muncul saat IP address tersebut selalu berganti setiap kali koneksi mengalami redial. Tidak mungkin bagi kita mengamati setiap saat ip kita terutama saat kita tidak berada dalam jaringan “rumah” kita.

Sebagai alternatif mengamati perubahan IP address dinamik tersebut, kita membutuhkan service dynamic DNS dimana layanan ini  berfungsi untuk mengupdate IP address terbaru dan menterjemahkan menjadi sebuah alamat host berupa domain atau subdomain. Selanjutnya kita hanya perlu menghapal alamat domain atau subdomain tersebut yang relatif jauh lebih mudah.

Bagi anda yang sudah tidak asing dengan layanan dynamic DNS ini, pasti anda telah mengenal dyndns, no-ip, changeip, afraid & ddns² yang lainnya. Disini saya akan membahas bagaimana membuat sendiri Server Dynamic DNS. Keuntungannya adalah kita bisa menggunakan hostname dengan domain kita sendiri serta berbagai kustomisasi yang jika kita menggunakan layanan free ddns tidak bisa kita dapatkan.

Ok. terlalu panjang pengantar saya 😀
Bahan yang kita perlukan disini adalah :

  1. koneksi internet dengan IP Address dinamik.
  2. Sebuah Server yang memiliki koeneksi internet dengan IP Address statik (disini saya menggunakan VPS) yang telah di install BIND dan WEB SERVER
  3. Sebuah domain yang kita host pada server pada point no. 2 diatas. (contoh disini : domain.com)

Pastikan server DNS atau service BIND anda telah berjalan dengan baik, artinya domain anda telah menggunakan server tersebut sebagai hostnya dimana NS utamanya mengarah pada IP server yang akan digunakan.

Langkah pertama buat dulu key untuk dynamic host yang akan digunakan

dnssec-keygen -a HMAC-MD5 -b 512 -n USER dynhost.domain.com.

Keyword USER pada perintah diatas adalah perintah mutlak dan anda tidak perlu merubahnya. Maka akan terbuat dua buah file dengan nama Kdynhost.domain.com.*.key dan Kdynhost.domain.com.*.private. Selanjutnya Copy key yang dihasilkan ke folder yang sesuai untuk mempermudah kontrol.

mkdir /home/user/dyndns
cp Kdynhost* /home/user/dyndns

Setelah itu masukkan key yang dibuat tadi kedalam zona DNS yang telah ada. Saya menggunakan ubuntu sehingga fila yang perlu di edit adalah /etc/bind/named.conf.local

key dynhost.domain.com. {
algorithm HMAC-MD5;
secret "paste key dari file Kdynhost.domain.com.*.private yang dibuat tadi==";
};

zone "domain.com" {
type master;
file "/var/lib/bind/domain.com.hosts";
allow-transfer {
127.0.0.1;
localnets;
};
update-policy {
grant dynhost.domain.com. name dynhost.domain.com. A;
};
};

Dengan menambahkan script diatas, maka isi dari file /var/lib/bind/domain.com.hosts akan berubah secara dinamik setiap kali kita melakukan perintah update khususnya untuk hostname dynhost.domain.com.

Lakukan restart BIND.

Service bind9 restart

Jika setelah ini anda perlu untuk merubah zona domain.com maka anda harus melakukan freeze agar tidak terjadi konflik saat dilakukan perubahan karena bind dalam kondisi berjalan.

rndc freeze domain.com
nano /var/lib/bind/domain.com.hosts
rndc thaw domain.com

Sampai disini anda telah memiliki dynamic host yang bisa anda update “A record”-nya setiap saat dengan perintah yang dijalankan menggunakan script http/https. Untuk scriptnya, saya menggunakan script CGI. Jadi pastikan anda telah menginstall paket libcgi-pm-perl.

apt-get install libcgi-pm-perl

Kemudian Buat sebuah file dan simpan pada folder dengan nama /home/user/dyndns/cgi-bin/update

nano /home/user/dyndns/cgi-bin/update

Pastekan code script berikut dan edit sesuai dengan yang anda butuhkan

#!/usr/bin/perl
# (c)2013 Max Baker 
# Perl Artistic License 2.0 http://opensource.org/licenses/artistic-license-2.0
#
# This is a dyndns server replacement CGI script that calls bind's nsupdate
# Reference : http://dyn.com/support/developers/api/perform-update/
 
use strict;
use CGI;
 
use vars qw/$q $hostname $myip $wildcard $mx $backmx $offline $nsupdate 
        $remote_user $user $dir %hosts /;
 
$dir = '/home/user/dyndns';
$nsupdate = '/usr/bin/nsupdate';
 
%hosts = (
# Host                    user   zone         key file
'dynhost.domain.com' => [ 'saya','domain.com','Kdynhost.domain.com.+157+28821.key' ],
         );
 
$q = CGI->new;
 
$hostname = $q->param('hostname');
$myip     = $q->param('myip');
$user     = $q->remote_user;
#$offline = $q->param('offline');
#$wildcard= $q->param('wildcard');
#$mx      = $q->param('mx');
#$backmx  = $q->param('backmx');
 
print $q->header();
 
# Check that we have the auth set and are sending non-blank stuff
unless (not_blank($hostname) and not_blank($myip) and not_blank($user)) {
        apachelog("not_blank");
        print "badauth\n";
        exit;
}
 
# Handle Auto-Discover of IP
if ($myip eq 'auto') {
    $myip = $q->remote_addr;
}
 
# Check the IP address makes sense
unless ($myip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
        apachelog("bad_ip");
        print "badauth\n";
        exit;
}
# Multiple hosts can be given, separated by a comma
my @hosts = split(',',$hostname);
if (scalar @hosts > 10 ) {
        apachelog("too many");
        print "numhost\n";
        exit;
}
 
foreach my $host (@hosts) {
        # Check if it's a host we allow
        unless (defined $hosts{$host}) {
                apachelog("Bad host");
                print "notfqdn\n";
                last;
        }
        # Check that the user has access to this host
        unless ($hosts{$host}->[0] eq $user) {
                apachelog("Access Denied");
                print "nohost\n";
                last;
        }
        my $key = sprintf("%s/%s",$dir,$hosts{$host}->[2]);
        my $zone = $hosts{$host}->[1];
 
        unless (-r $key) {
                die "Key file $key missing.";
        }
 
        # Perform the update
        unless (open(N,"|$nsupdate -k $key 1>/dev/null")) {
                apachelog("nsupdate failed");
                print "dnserr\n";
                next;
        }
        # There should be no space between the lesser-than signs here, wordpress is adding it, remove.
        print N < < "end_update";
server $zone
zone $zone
update delete $host. A
update add $host. 86400 A $myip
show
send
end_update
        # Should have exited, otherwise we have a problem
        unless (close N) {
                apachelog("nsupdate failed on close");
                print "dnserr\n";
                next;
        }
        print "good\n";
}
 
exit;
 
sub not_blank {
        my $val = $_[0];
        return 1 if defined $val and $val !~ /^\s*$/;
        return 0;
}
 
sub apachelog {
        my $msg = join(' ',@_);
        { no warnings; 
        warn "dyndns : $user $hostname = $myip $msg\n";
        }
}

chmod 755 pada file script tersebut agar bisa di eksekusi

Kemudian buat virtualhost untuk domain.com pada apache untuk melakukan eksekusi script cgi diatas pada browser atau tambahkan pada virtualhost yang sudah ada untuk memberikan permission pada eksekusi file cgi script

ScriptAlias /cgi-bin/ /home/user/dyndns/cgi-bin/
<Directory "/home/user/dyndns/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all


<location "/cgi-bin">
AuthName "[email protected]"
AuthType Basic
AuthUserFile /home/user/dyndns/.htpasswd
require valid-user

Buat file .htpasswd untuk memasukkan username dan password sebagai autentikasi saat eksekusi file cgi script pada browser maupun script


cd /home/user/dyndns
htpasswd -c .htpasswd saya

Restart Apache

service apache2 restart

Sekarang anda sudah bisa melakukan update melalui browser anda untuk pengetesan

http://domain.com/cgi-bin/update?hostname=dynhost.domain.com&myip=123.123.123.123

Masukkan username dan password yang anda buat tadi. Jika tidak terdapat kesalahan, maka pada browser anda akan ada jawaban

good

Selanjutnya silahkan anda cek record zona domain.com pada server anda dengan perintah dig

dig dynhost.domain.com

maka pada hasil dig akan nampak baris sebagai berikut :

;; ANSWER SECTION:
dynamichost.yourdomain.com.      86400   IN      A       123.123.123.123

 

Sampai disini script anda sudah berjalan dengan benar, selanjutnya tinggal anda buat script dan scheduler pada router mikrotik untuk update ip secara otomatis

Script update ddns mikrotik (tested on ROS 6.x) :

:global ddnsuser "saya"
:global ddnspass "passwordsaya"
:global iface "pppoe-out1"
:global ddnshost dynhost.domain.com
:global ipddns [:resolve $ddnshost];
:global ipfresh [ /ip address get [/ip address find interface=$iface ] address ]
:if ([ :typeof $ipfresh ] = nil ) do={
   :log info ("myDDNS: $iface tidak memiliki IP Address.")
} else={
   :for i from=( [:len $ipfresh] - 1) to=0 do={ 
      :if ( [:pick $ipfresh $i] = "/") do={ 
    :set ipfresh [:pick $ipfresh 0 $i];
      } 
}

:if ($ipddns != $ipfresh) do={
:log info ("myDDNS: IP $ddnshost = $ipddns")
:log info ("myDDNS: IP-Fresh $iface = $ipfresh")
:log info "myDDNS: Pembaharuan diperlukan, Meminta Update IP ke myDDNS...!"
:global str "/cgi-bin/update\?hostname=$ddnshost&myip=$ipfresh"
/tool fetch address=domain.com src-path=$str mode=http user=$ddnsuser \
password=$ddnspass dst-path=("/myDDNS.".$ddnshost)
:delay 1
:global str [/file find name="myDDNS.$ddnshost"];
/file remove $str
:global ipddns $ipfresh
:log info "myDDNS: IP $iface berhasil diperbaharui menjadi $ipfresh!"
 }
}

Buat scheduler agar bisa di eksekusi setiap menit.

Mohon koreksi ya jika ada yang kurang benar…

 sumber : berbagai forum dan blog

Update Oktober 2017 : Bagi yang gak mau buang uang buat beli VPS, bisa mencoba alternatif gratis, baca tulisan saya lainnya : Update A Record domain di Cloudflare dengan IP publik dinamik IndiHome menggunakan script MikroTik dan layanan DNS-O-Matic

16 thoughts on “Membuat Server Dynamic DNS Dan Script Update Pada Mikrotik

  1. Salam kenal mas sebelumnya, saya mau tanya itu harus ada ip public staticnya juga ya di bindnya? semisal cuman yang ada hanyalah ip public dynamic semua kira2 bisa tidak?

    • tidak bisa mas, memang harus memiliki setidaknya 1 ip publik statik karena gimna bisa update script kalau servernya juga selalu berubah ip-nya.

  2. lha kalau sudah ada sebuah IP public statik kan tidak perlu lagi menggunkan sebuah ip dynamic untuk pembuatan webserver tersebu. kan dengan Ip static akan lebih mudah dan sudah dapat tertangani.

    • he.. iya mas, kalau sudah ada ip publik memang masalah terpecahkan. Tapi pokok persoalannya kan kita disini belajar bagaimana membuat layanan dynamic DNS sendiri, sehingga jika anda memiliki sepuluh tempat usaha dengan dinamik ip, anda cukup langganan isp dengan ip statik di 1 tempat dan mengupdate host semuanya dari di server yg ada di tempat dengan ip statik tersebut. Hal ini pula yang yang melatar belakangi penulisan tutor ini, layanan gratis dari dyndns akan segera ditutup tanggal 7 mei, sedangkan saya bergantung pada layanan tersebut untuk meremote beberapa tempat usaha saya yg semua pakai ip dinamik, maka kenapa saya tidak memanfaatkan VPS yang kebetulan saya sewa dan memiliki 2 ip statik untuk kebutuhan ini? Mudah2an sedikit tutor ini ada manfaat bagi kita, setidaknya untuk mengobati rasa ingin tahu kita bagai mana layanan dynamic DNS seperti dyndns, no-ip, dll berjalan. Salam..

  3. genul says:

    Ijin bookmark dulu. Saya tertarik dengan tulisan ini karena untuk raspberry saya masih menggunakan link dari weaved.com. sedangkan link tersebut berubah-ubah dan acak. Mungkin suatu saat saya bisa bikin layanan dyndns sendiri dan untuk kalangan sendiri dengan vps yang tidak terlalu mahal. Makasih banyak gan tutorialnya.

    • Silahkan gan, mudah2an bermanfaat.. Saya juga bikin dyndns sendiri untuk jaringan2 yang saya kelola dan hampir semua pakai ip dinamik, lumayanlah memanfaatkan VPS yg saya sewa seharga $15/yr dan dapat 2 ip, 1 ip saya pake untuk hosting dan satu lagi untuk dyndns ini 🙂

      • kalau pesan errornya pas update melalui url “dnserr” apanya ya kang?.
        saya lihat di log apachenya sih ini errornya

        couldn’t get address for ‘domain.com’: not found
        dyndns : saya dynhost.domain.com = 123.123.123.123 nsupdate failed on close

  4. Achmad Zaki Mubarok says:

    saya tertarik dengan topik ini. klo saya punya server vps dengan indihome ip dinamis tanpa mikrotik bisa nggak? harus ada mikrotik? terima kasih

  5. Gan numpang nanya, maklum masih awam…untuk pengisian
    :global ddnsuser “saya”
    :global ddnspass “passwordsaya”
    :global iface “pppoe-out1”
    :global ddnshost dynhost.domain.com

    apakah diisi user, pasword, dan dns ddns saya atau mengikuti itu… demikian juga pada settingan server nya….alias tidak dirubah…mohon pencerahannya

Leave a Reply

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