Dinamik DNS servisi kullanımında mekanizma, cihazınızın, sizin belirleyeceğiniz bir ağ arayüzündeki IP adresi değişikliklerini algılayarak otomatik olarak Dinamik DNS servisi aldığınız yerin sunucularında almış olduğunuz bir alan adına (domain name), yeni IP adresini bağlamaktan ibarettir.
Günümüz ağ erişim cihazları, özellikle ADSL modemler, dinamik DNS servislerine erişip DNS güncellemesi yapabilme yeteneğine sahiptirler. Ancak bu tür bir yeteneği olmayan cihazlarla aynı işi yapabilmenin bir yolu SNMP kullanmaktır.
SNMP (Simple Network Management Protocol), ağ üzerindeki her tür cihazdan veri toplama ve bu cihazları uzaktan yönetme amacıyla kullanılabilen bir iletişim protokolüdür. Cihazınız dinamik DNS desteği vermese de büyük ihtimalle SNMP desteği veriyor olmalıdır. Burada anlatacağımız yöntemde SNMP, ağ erişim cihazınızın güncel IP adresinin bu cihazın arkasında duran daha akıllı bir cihaz tarafından öğrenilmesi amacıyla kullanılacaktır.
Şu an elimizde şu tür bir konfigürasyon olduğunu varsayalım:
- Bir adet ADSL modem. Bu modemde aşağıdaki gibi iki temel ağ arabirimini mevcut:
- İç ağa bakacak şekilde bir adet ethernet arabirimi. (Örnek, eth0 ve IP'si 192.168.0.1)
- Dış ağa bakacak şekilde bir adet ppp arabirimi.
- İç ağda bir adet 7x24 çalışan bir sunucu. Örneğimizde bir Debian Linux sunucusu kullanıldı. Bu sunucunun erişim cihazına bağlı şekilde bir adet ethernet arabirimi mevcut.
ADSL Modemde SNMP Ajanının Aktive Edilmesi
- SNMP v1 ve v2, erişimde doğrulama (authentication) amaçlı olarak Community tanımlamasını kullanmaktadır. Bu tanımlama erişim şifresi olarak düşünülebilir. Ancak bu tanımlama metni ağ üzerinden açık şekilde cihaza gidecektir. Dolayısıyla dinleyiciler (sniffer) tarafından kolayca elde edilebilir. Bu nedenle söz konusu SNMP versiyonları için sunucunun ADLS modeme kablolu ethernet üzerinden fiziksel olarak bağlı olması tercih edilmelidir.
- İkinci olarak söz konusu Community tanımını en azından "public" dışında sadece kendinizin bileceği bir değer atayarak yapmanız iyi olur. Örneğimizde "home" olarak belirlendi.
- Son olarak bu Community üzerinden bağlantıları salt okunur (read-only) erişim yetkisi ile sınırlamak iyi olacaktır.
Sunucuya SNMP kurulumu ve SNMP testleri
- Aslında bu adım test amaçlı olarak kullanılacaktır:
apt-get install snmp
- SNMP araçları sunucuya kurulduktan sonra aşağıdaki SNMP sorgusu ile ADSL modemden arabirim IP adreslerinin alınıp alınmadığı test edilir:
snmpwalk -Oa -t 5 -c home -v 2c 192.168.0.1 ipAddrEntry.ipAdEntAddr
- Bu sorgu sonucu aşağıdakine benzer bir rapor alınması muhtemeldir:
IP-MIB::ipAdEntAddr.127.0.0.1 = IpAddress: 127.0.0.1 IP-MIB::ipAdEntAddr.a.b.c.d = IpAddress: a.b.c.d IP-MIB::ipAdEntAddr.192.168.0.1 = IpAddress: 192.168.0.1 ...
SNMP Üzerinden Güncel Ağ Adresinin Öğrenilmesi
- Bu aşamada yazacağımız perl programcığı SNMP kütüphanesi kullanacaktır. Bu amaçla debian paket yöneticisi üzerinden gerekli modüllerin kurulumu tercih edildi:
apt-get install libsnmp-perl
- SNMP üzerinden ADSL modemin ppp arabiriminin güncel IP adresini öğrenecek olan perl programı (snmp-ip-fetcher.pl) :
#!/usr/bin/perl use Data::Dumper; use SNMP; $sess = new SNMP::Session(DestHost => "192.168.0.1", Community => "home", Version => "2c", Timeout => 5000000); $leaf_id = "ipAdEntAddr"; $invalid_ip_filter = "^(192\.168|127)"; my $ip = ""; $vb = new SNMP::Varbind(); $vb->[0] = $leaf_id; while ($vb->[0] eq $leaf_id && defined($val = $sess->getnext($vb))) { # print Dumper($vb->[0], $val, $leaf_id); if ($vb->[0] ne $leaf_id || $val =~ m/$invalid_ip_filter/) { next; } if ($val =~ m/^\d+\.\d+\.\d+\.\d+$/) { $ip = $val; } } print "$ip"; - Bu program çalıştırıldığında yukarıdaki test adımında elde edilen sonuçlardan yanlızca ppp arayüz IP adresini (yukarıda a.b.c.d ile ifade edilmişti) getirmelidir.
Dinamik DNS Güncellemesi
- Bu adımda dinamik DNS güncellemesinde kullanmak üzere ez-ipupdate aracı tercih edildi:
apt-get install ez-ipupdate
- Söz konusu araç ile DNS güncellemesi yapılıp yapılamadığı test ediliyor. Örneğimizde dinamik DNS servisi DynDNS'ten alındı ve test amaçlı olarak Internet üzerinde geçersiz (IANA Special Use) bir IP (10.0.0.1) kullanıldı:
/usr/sbin/ez-ipupdate -S dyndns -u kullanici:sifre -h foo.dyndns.org -a 10.0.0.1
Dinamik DNS Güncellemesini Yapacak Zamanlanmış Görev
- Zamanlanmış görev olarak çalıştırılacak shell script (updater.sh):
#!/bin/sh ip_fetcher=./snmp-ip-fetcher.pl ez_ipupdater=/usr/sbin/ez-ipupdate current_ip_file=.current dyndns_service=dyndns dyndns_auth=kullanici:sifre dyndns_hostname=foo.dyndns.org if [ ! -f $current_ip_file ]; then touch $current_ip_file fi read current_ip < $current_ip_file new_ip=`$ip_fetcher` if [ -n $new_ip ]; then if [ "$current_ip" != "$new_ip" ]; then cmd="$ez_ipupdater -r 10 -S $dyndns_service -u $dyndns_auth -h $dyndns_hostname -a $new_ip" result=`$cmd` if [ "$result" == "request successful" ]; then echo $new_ip > $current_ip_file echo "IP adresi DNS'e kaydedildi. Yeni IP : $new_ip" else echo "IP adresi DNS'e kaydedilemedi. Yeni IP : $new_ip" fi else echo "IP adresi degismemis. IP : $current_ip" fi fi - updater.sh ve snmp-ip-fetcher.pl dosyalarının aynı dizinde (örneğin /crontab/dnsupdate dizininde) olmasına özen gösterelim.
- Aşağıdaki crontab satırı ile saatlik olarak ADSL modemin ppp ağ arabiriminin IP adresi alınarak dinamik DNS servisi sunucusuna güncelleme emri gönderilecektir:
0 * * * * (cd /crontab/dnsupdate && ./updater.sh)

Hiç yorum yok:
Yorum Gönder