Leoman’s blog

bi blög

Archive for the ‘bind’ tag

BIND ile DNS bölümleme (Split DNS)

one comment

Bildiğiniz üzere BIND dünya üzerinde en çok kullanılan ve popüler olan DNS sunucusudur. Bu üstünlük Domain Name System [1] protokolünün ortaya koyulduğu 1983 yılınını takip eden 1984 yılında geliştirilmeye başlanmış olması gibi gözükse de bu kadarla da sınırlı değildir. Bu popülerliğin arkasında yatan etkenlerden biri de yeterince esnek bir yapıya sahip olmasından da geliyor.

Esnek derken?
Esnek bir yapı derken BIND size neler sağlayabilir? Daha önceki blog girdilerimden birinde bahsettiğim gibi mysql-bind [2] gibi bir veritabanı sürücüsü ile zone’larınızı MySQL üzerinde tutabilirsiniz. Yine Dynamically Loadable Zones [3] (DLZ) ile farklı veri kaynakları üzerinde (MySQL, PostgreSQL, File system, ODBC, LDAP) zone’larınızı saklayabilirsiniz. DNS Spliting ile isteyeceğiniz herhangi bir kaynağa isteyeceğiniz herhangi bir cevabı döndürebilirsiniz.

Split DNS mi?
Çok basit bir değiş ile aynı alan adı için yapılan DNS sorgulamasında isteği yapan kaynak IP adreslerine göre değişik IP cevapları verme işlemine split-horizon/split-view/split-brain [4] DNS adını veriyoruz. Bir çok DNS sununucu tarafından desteklenen bu metot [5] BIND’ın içerisinde de ön tanımlı olarak desteklenmektedir.

Nasıl?

Bind konfigrasyonu içerisinde bunu anlatan ifade “view”‘dır. Oluşturacağınız view bloklarına göre [6] istediğiniz kaynaklara istediğiniz cevapları döndürebilirsiniz.

Bunun gibi bir named.conf konfigürasyonu ile yapılandıracağımız DNS sunucumuza 192.168.0 ile başlayan bir client’tan gelecek istek dahilinde db.domain.tld.conf.local konfigürasyon dosyamızın içerindeki zone tanımlamaları geçerli olacak ve bu clientlar aynı zamanda recursive query’ler için de kullanabilecekler, bunun haricinde olan tüm IP adresleri bu DNS sunucuya recursive query’ler için kullanmazkan domain.tld isteklerinde db.domain.tld.conf konfigürasyon dosyası içerisinde tanımlı olan zone’lara göre cevap alacaklar.

Daha düzenli konfigürasyon ve daha anlaşılır olması için şöyle bir örnek senaryo çizebiliriz. Elimizde Internet üzerinde çalışacak bir proje geliştiren bir ekip bütünü var. İki farklı lokasyonda VPN ile birbirine bağlı ve ofisler birbirine erişebiliyor. Ekip aynı ofisi paylaşan yazılım geliştiriciler ve geliştiricilerin kullandığı sunucu, geliştiriciler ile aynı ofisi paylaşan test ekibi, ikinci lokasyonda bulunan pre-live izleyicileri ve yine ikinci lokasyonda bulunan test ekibi.
Bu coğrafik olarak dağıtık fakat aynı network içinde çalışan ofis örneğinde dev.newapp.com’a istek gönderen her ekibin farklı sunucuya erişmesini şu şekilde sağlarız.

Öncelikle DNS sunucumuza bir Access Control List (ACL)’leri (istek yapan IP kaynaklarını belirleyen) alt bir konfigürasyon dosyası oluşturmakla başlayalım.  Bunun için /etc/bind9/named.conf.acls adında bir dosya oluşturarak içerisine ilgili acl listelerini oluşturuyoruz.

Bu işlemin ardından sırasıyla zone detaylarının yer alacağı konfigürasyon dosyalarını yaratıyoruz.

Bu dosyaların arından varolan named.conf’unuzunu içerisine öncelikle named.conf.acls dosyasını include etmeniz ve her üç durum için de ayrı bir view eklemeniz yeterli olacaktır.

 

 

[1] http://tr.wikipedia.org/wiki/DNS
[2] http://mysql-bind.sourceforge.net/
[3] http://bind-dlz.sourceforge.net/
[4] http://en.wikipedia.org/wiki/Split-horizon_DNS
[5] http://en.wikipedia.org/wiki/Comparison_of_DNS_server_software#Feature_matrix
[6] http://www.isc.org/files/arm96.html#id2549625

Written by leoman

February 21st, 2011 at 12:20 am

Posted in GNU/Linux,Sistem Yönetimi

Tagged with , ,

Debian üzerinden MySQL back-end’e sahip Bind yapılandırmak

leave a comment

Dağıtık projelerde genellikle yaşanılan sıkıtılardan biri kullanmış olduğunuz yazılımların yapıları gereği bir API’ye sahip olmamasından kaynaklanmaktadır. Bununla beraber yazılımların izin verdiği derece alt arayüzler ve genellikle ek yazılımlar üreterek çözümler geliştirilir.

Örneğin multi node’dan oluşan bir web-host farm’ında her noktadan gelecek değişilikleri bind üzerinde güncellemek/eklemek istiyorsunuz. Bunun için ya bir veritabanı üzerinden çalışan bir queue mantığı ile yönetmeniz ya da bu işi yapan bir RPC Interface ile gerçekleştirmeniz gerekecektir.

Bunun yerine diğer bir seçenek ise Bind’ın config dosyaları üzerinde değişiklik yapmaktan ziyade daha pratik bir uygulamaile host detay kayıtlarının MySQL üzerinde tutulduğu ve anlık olarak buradan değiştirildiği bir DNS sunucuya sahip olmak olabilir.

Bunun için sourceforge üzerinde yayınlan mysql-bind adlı projeyi kullanabiliriz. Debian bir sistem üzerinde yapmamız gereken adımlar şu adımlardan oluşmaktadır;

İşleme gerekli paketlerin yüklenmesi ile başlayalım;

cd /usr/src
apt-get install mysql-server libmysqlclient15-dev
apt-get install build-essential
apt-get install libssl-dev libtool libdb-dev libldap2-dev libxml2-dev libcap2-dev hardening-wrapper libkrb5-dev debhelper fakeroot bison

Bu işlem sırasında MySQL size bir root parolası soracaktır. Belirlemiş olduğunuz bu parola tüm MySQL yönetimsel işlemlerinde kullanılacağından sağlam ve unutmayacağınız bir parola vermeniz gerekmektedir.

Bundan bir sonraki adımda bind source ve bind-mysql’i edinmek;

apt-get source bind9
wget http://downloads.sourceforge.net/project/mysql-bind/mysql-bind/mysql-bind-0.2%20src/mysql-bind.tar.gz?use_mirror=garr
tar zxf mysql-bind.tar.gz

mysql-bind kodunu bind’a ekliyoruz;

cd mysql-bind
cp mysqldb.c ../bind9-9.5.1.dfsg.P3/bin/named/
cp mysqldb.h ../bind9-9.5.1.dfsg.P3/bin/named/include/named/
cd ../bind9-9.5.1.dfsg.P3/

Bind’a Database driver’ını ekelemek için gerekli bilgileri MySQL’den almamız gerekiyor. Bu komutların vermiş olduğu çıktıları bir kenara not etmemiz gerekmektedir.

mysql_config --cflags
mysql_config --libs
cd ../bind9-9.5.1.dfsg.P3/
nano bin/named/Makefile.in

Açılan dosyamız içerisinde DBDRIVER_OBJS yazan satıra gitmemiz gerekiyor. Bu satırda yer alan değişkenleri aşağıdaki gibi doldurmamız gerekiyor;


DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =


DBDRIVER_OBJS = mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES = -I'/usr/include/mysql' //mysql_config --cflags ciktisi
DBDRIVER_LIBS = -L'/usr/lib/mysql' -lmysqlclient //mysql_config --libs ciktisi

dosyayı kaydederek kapatıyoruz.

Bir sonraki aşamada ise bind’ın MySQL bağlantısını açabilmesini sağlamak için gerekli eklemeleri bin/named/main.c içinde değişiklik yapmamız gerekiyor.


nano bin/named/main.c

Dosya içerisinde öncelikle mysqldb header dosyasının dahil olmasını ardından ns_server_create fonksiyonunun çağırıldığı satırın öncesine mysqldb_init(); ekleyerek veritabanı bağlantısının yapılmasını, ns_server_destroy fonsksiyonundan hemen sonraki satırda mysqldb_clear(); ile açılan bağlantının kapatılmasını sağlamamız gerekiyor.

#include
/*
*
*
*/

#include

#include "bin/named/include/named/mysqldb.h"

/*
*
*
*/

#endif

mysqldb_init();
ns_server_create(ns_g_mctx, &ns_g_server);
}

/*
*
*
*
*/

destroy_managers();

ns_server_destroy(&ns_g_server);
mysqldb_clear();

ns_builtin_deinit();

Artık hazırlamış olduğumuz yapılandırmayı bir debian paketi haline getirebilir ve oluşturduğumuz paketleri yükleyebiliriz.


dpkg-buildpackage -rfakeroot -b
cd ..
dpkg -i *.deb

Bu işlemden sonra bind’ı durdurarak MySQL üzerinde gerekli kullanıcı ve tablolaları yaratıroyuruz;


/etc/init.d/bind stop
mysql -u root -p


CREATE DATABASE dns;
CREATE USER 'dnsuser'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON dns.* TO 'dnsuser'@'localhost';

CREATE TABLE mydomains (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;

INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800');
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.');
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.');
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.');
INSERT INTO mydomains VALUES ('ns0.mydomain.com', 259200, 'A', '192.168.1.1');
INSERT INTO mydomains VALUES ('ns1mydomain.com', 259200, 'A', '192.168.1.1');
INSERT INTO mydomains VALUES ('www.mydomain.com', 259200, 'A', '192.168.1.1');
INSERT INTO mydomains VALUES ('mydomain.com', 259200, 'A', '192.168.1.1');

Hem kullanacağımız veritabanı hem de örnek bir domain için gerekli kayıtları oluşturmuş olduk. Artık sadece named.conf’a bu domain’i belirterek bind’ı başlatmamız yeterli olacaktır.


zone "mydomain.com" {
type master;
notify no;
database "mysqldb dns mydomains localhost dnsuser password";
};

Konsoldan nslookup ile sorguladığınızda dns sunucunuzun verdiği sonuçları kontrol edebilirsiniz;


>nslookup
>server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
>www.mydomain.com
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
Name: www.mydomain.com
Address: 192.168.1.1

Ve işte artık zone kayıtlarını MySQL üzerinde tutan bir bind sunucuya sahip durumdayız.

Not:

  • Boot sırasında MySQL sunucunun bind’tan önce başlamak zorunda olduğunu unutmayınız.
  • Çıkabilecek bind açıklarına karşı bind updatelerini kesinlikle takip etmenizi öneririm.

Written by leoman

June 13th, 2010 at 7:14 pm