Linux ile Basit Network Tasarımı GW-NAT-DHCP-DNS
Bu makalemde linux sistemler ile temel anlamda Gateway, NAT, DHCP ve DNS gibi temel servislerin kurulmasını anlatacağım. Aşağıdaki resimde de bu yapılandırma için nasıl bir lab kuracağımın detaylarını görebilirsiniz.
Lab ortamında;
Router olarak adlandırılan server üzerinde Debian Server 32 bit
Server1 olarak adlandırılan server üzerinde Debian Server 32 bit
Client bilgisayarlarından birisi Windows XP diğeri de Centos 6.5 olarak işletim sistemleri kullanılmıştır.
Çizmiş olduğum taslak üzerinde de görüleceği gibi client bilgisayarlar DHCP sunucudan IP bilgilerini alacaklar. Aldıkları bu bilgiler doğrultusunda da Gateway üzerinden internete 192.168.2.0 ağına bağlanarak internete çıkacaklar.
Neler yapılacak?
router isimli sunucu üzerinde NAT işlemini yapabilmesi için gerekli konfigürasyonlar yapılacak
DHCP-DNS olarak çalışacak server1 isimli sunucu üzerine, sırasıyla DNS ve DHCP kurulumları ve gerekli konfigürasyonları yapılacak.
Client tarafında yapılan testlere göz atılacak.
1. NAT KURULUMU (router sunucusu)
Öncelikle kurulum ve konfigürasyon sırasında vim text editor’u kullanıldı. Uygulama esnasında favori text editorunuz(nano, pico vs…) ile çalışabilirsiniz.
# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 172.16.16.1
netmask 255.255.255.0
network 172.16.16.0
broadcast 172.16.16.255
“# vim /etc/network/interfaces” komutu ile interfaces dosyasının içeriği yukarıdaki hale getirilmeli.
Interfaces dosyası yukarıdaki hale getirildikten sonra
# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# vim /etc/sysctl.conf Komutu ile sysctl.conf dosyasında bazı değişikliker yapmak üzere bu dosyayı açıyoruz. Ve “net.ipv4.ip_forward” yazan satırı bularak başındaki diyez(#) işaretini kaldırıyoruz. Yapılan bu değişiklik Linux üzerinde network servisinin yeniden başlatılmasından sonra aktif hale gelecek. Eğer hemen aktif olmasını istiyorsak;
# sysctl -w net.ipv4.ip_forward=1
Komutunu kullanabiliriz.
NAT işlemi için iptables modülünü transparan olarak devreye alacağız. Herhangi bir kesme yapmayacak, sadece ip nat işlemini yapmak üzere konfigure edeceğiz
“rc.local” dosyasına her açılışta iptables’a eklemesi gereken kuralları yazalım;
# vim /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
iptables -P FORWARD ACCEPT
iptables –table nat -A POSTROUTING -o eth0 -j MASQUERADE
exit 0
rc.local dosyasını yukarıdaki hali ile kaydedip çıkalım.
rc.local dosyası kabaca Linux işletim sisteminin boot sırasında hangi komutları çalıştıracağını barındıran bir dosyadır/scripttir. Dolayısı ile bu dosyaya yazdılan komutlar bir dahaki system başlangıcından sonra aktif olacaktır. Sistemi yeniden başlatmadan iptables komutlarını shell’de çalıştıralım;
# iptables -P FORWARD ACCEPT
# iptables –table nat -A POSTROUTING -o eth0 -j MASQUERADE
Eğer server1 sunucusu üzerinde 172.16.16.2 olarak static IP’yi tanımladıysanız, server1 üzerinden 192.168.2.0 ağına veya dış bir network’e ping atarak konfigürasyonu kontrol edebilirsiniz.
Ben de herhangi bir problem görünmediği için 2.adıma yani DNS ve DHCP sunucuların kurulumlarına geçiyorum.
2.1. Dns kurulumu (server1)
Standart olarak network yapılandırması ile başlayalım ve interfaces dosyası üzerinde yapmadıysak gerekli ayarları aşağıdaki adımlar doğrultusunda yapalım.
# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 172.16.16.2
netmask 255.255.255.0
gateway 172.16.16.1
Yukarıdaki gibi network ayarlarını bitirip, # ifconfig komutu ile eth0’ın 172.16.16.2 IP’sini kullandığını görebildiysek DNS kurulumuna geçelim. DNS sunucu olarak BIND server kuracağım.
# apt-get update
$ORIGIN .
$TTL 604800 ; 1 week
yilmaz.com IN SOA server1.yilmezy-updates Release.gpg [836 B] 100 elease 604800 ; refresh (1 week)
; retry (1 day)
lease.gpg s)
604800 ; )
rg.tr wheezy/main i386 Packagesrver1.yilmaz.com.
eezy/main Translation-en6.16.2
$ORIGIN yilmaz.com.
server1 -updates/main Sources [4,057 B]ter A 172.16.16.1
$es/main i386 Packages/DiffIndexek
16.16.172.in-addr.abian.org wheezy/updates Release16.16.172.in-addr.arpa. root.yilmaz.com.16s/main Translation-en/DiffIndex 150org wheezy/updates/main Sources 604800 ; refeezy/updates/main i386 Packages 86400 ; retry (ezy/updates/main Translation-en 2419200 ; ex215 kB/s)eks)
Depo bilgilerini güncelledikten sonra kurulum adımına geçelim.
# apt-get install bind9 dnsutils
Reading package lists… Done
Building dependency tree
Reading state information… Done
dnsutils is already the newest version.
Suggested packages:
bind9-doc resolvconf ufw
The following NEW packages will be installed:
bind9 bind9utils
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 490 kB of archives.
After this operation, 1,257 kB of additional disk space will be used.
Get:1 http://ftp.linux.org.tr/debian/ wheezy/main bind9utils i386 1:9.8.4.dfsg.P1-6+nmu2+deb7u1 [121 kB]
Get:2 http://ftp.linux.org.tr/debian/ wheezy/main bind9 i386 1:9.8.4.dfsg.P1-6+nmu2+deb7u1 [370 kB]
Fetched 490 kB in 0s (706 kB/s)
Preconfiguring packages …
Selecting previously unselected package bind9utils.
(Reading database … 38893 files and directories currently installed.)
Unpacking bind9utils (from …/bind9utils_1%3a9.8.4.dfsg.P1-6+nmu2+deb7u1_i386.deb) …
Selecting previously unselected package bind9.
Unpacking bind9 (from …/bind9_1%3a9.8.4.dfsg.P1-6+nmu2+deb7u1_i386.deb) …
Processing triggers for man-db …
Setting up bind9utils (1:9.8.4.dfsg.P1-6+nmu2+deb7u1) …
Setting up bind9 (1:9.8.4.dfsg.P1-6+nmu2+deb7u1) …
Adding group `bind’ (GID 107) …
Done.
Adding system user `bind’ (UID 104) …
Adding new user `bind’ (UID 104) with group `bind’ …
Not creating home directory `/var/cache/bind’.
wrote key file “/etc/bind/rndc.key”
#
[ ok ] Starting domain name service…: bind9.
Dns sunucu caching işlemi yapacağı için cache içinde bulunmayan isimleri çözebilmesi için opendns üzerinden sorgu yapması için “/etc/bind/named.conf.options” dosyası içindeki forwarders bölümünü aşağıdaki gibi düzenleyelim;
# vim /etc/bind/named.conf.options
forwarders {
// OpenDNS
208.67.222.222 ;
208.67.220.220 ;
};
“/etc/bind/named.conf.local” dosyası içinde LAN için kullanacağımız zone’ları ve PTR için kullanacağımız reverse zone’ları tanımlayalım;
# vim /etc/bind/named.conf.local
zone “yilmaz.com” {
type master;
file “/var/lib/bind/db.yilmaz.com”;
};
zone “16.16.172.in-addr.arpa” {
type master;
file “/var/lib/bind/db.16.16.172”;
};
Zone tanımlama işlemi sırasında farkedildiyse eğer “/var/lib/bind/” klasörü altında bu zone’ların zone’lara ait dosya yolları tanımlandı. Adresleri verilen bu dosyalar zone’lara ait kayıtların ve konfigürasyonun tutulduğu dosyalardır.
O dosyaları oluşturup gerekli satırları ekleyelim;
# vim /var/lib/bind/db.yilmaz.com
$ORIGIN .
$TTL 604800 ; 1 week
yilmaz.com IN SOA server1.yilmaz.com. root.yilmaz.com. (
100 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
2419200 ; expire (4 weeks)
604800 ; minimum (1 week)
)
NS server1.yilmaz.com.
A 172.16.16.2
$ORIGIN yilmaz.com.
server1 A 172.16.16.2
router A 172.16.16.1
Db.yilmaz.com dosyasını oluşturduysak PTR kayıtlarını tutan “/var/lib/bind/db.16.16.172” dosyasını oluşturacağız;
# vi /var/lib/bind/db.16.16.172
$ORIGIN .
$TTL 604800 ; 1 week
16.16.172.in-addr.arpa IN SOA server1.yilmaz.com.16.16.172.in-addr.arpa. root.yilmaz.com.16.16.172.in-addr.arpa. (
150 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
2419200 ; expire (4 weeks)
604800 ; minimum (1 week)
)
NS server1.
2 PTR server1.yilmaz.com.
1 PTR router.yilmaz.com
~
Bahsi geçen zone dosyalarını oluşturduysak “/var/lib/bind” klasörünün grup ve kullanıcı ayarlarını muhakkak bind:bind olarak ayarlamak gerekiyor.
# chown bind:bind /var/lib/bind/ -R
Dns kurulumunu ve konfigürasyonunu tamamladık. Şimdi nslookup ile bazı kontroller yapalım.
# nslookup
> server 127.0.0.1
> cozumpark.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: cozumpark.com
Address: 188.132.200.15
Görüldüğü gibi cozumpark.com alan adını kendi sunucumuz üzerinden çözdük.
Yukarıdaki adımlarda herhangi bir yanlışlık yaptığınızı düşünüyorsanız veya dns sunucunuz hata veriyorsa konfigürasyonunuzu ve zone’ları kontrol etmek için şu komutları kullanabilirsiniz;
# named-checkconf /etc/bind/<conf_dosyası>
# named-checkzone <hostname> /var/lib/bind/<dosya_adı>
2.2. DHCP KURULUMU (server1)
Dhcp sunucu olarak isc-dhcp-server kurulumu yapacağız.
# apt-get install isc-dhcp-server
Reading package lists… Done
Building dependency tree
Reading state information… Done
Suggested packages:
isc-dhcp-server-ldap
The following NEW packages will be installed:
isc-dhcp-server
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 935 kB of archives.
After this operation, 2,075 kB of additional disk space will be used.
Get:1 http://http.debian.net/debian/ wheezy/main isc-dhcp-server amd64 4.2.2.dfsg.1-5+deb70u6 [935 kB]
Fetched 935 kB in 1s (561 kB/s)
Preconfiguring packages …
Selecting previously unselected package isc-dhcp-server.
(Reading database … 146032 files and directories currently installed.)
Unpacking isc-dhcp-server (from …/isc-dhcp-server_4.2.2.dfsg.1-5+deb70u6_amd64.deb) …
Processing triggers for man-db …
Setting up isc-dhcp-server (4.2.2.dfsg.1-5+deb70u6) …
Generating /etc/default/isc-dhcp-server…
[FAIL] Starting ISC DHCP server: dhcpd[….] check syslog for diagnostics. … failed!
failed!
invoke-rc.d: initscript isc-dhcp-server, action “start” failed.
Yukarıda da görüldüğü gibi dhcp sunucumuz başlama anında hata verdi. Endişe edecek bir şey yok sadece konfigürasyonu toparlamamız gerekecek. “vim /etc/default/isc-dhcp-server” dosyasını açıp, INTERFACES satırını bulacağız ve karşısına Ethernet ara yüzünün adresini gireceğiz. Bu ayarda DHCP sunucu hangi Ethernet ara yüzü üzerinden DHCP sunacak ona karar veriyoruz.
#vim /etc/default/isc-dhcp-server
INTERFACES=”eth0″
#vim /etc/default/isc-dhcp-server
INTERFACES=”eth0″
Dhcp sunucusunu yapılandırmak için “/etc/dhcp/dhcpd.conf” dosyası üzerinde düzenlemeler yapıyoruz. Dosyanın içeriğini tamamen silip aşağıdaki konfigürasyon örneğinden yararlanmak konfigürasyon dosyanızı baştan oluşturabilirsiniz.
# vi /etc/dhcp/dhcpd.conf
ddns-updates on; //dns update acik
ddns-update-style interim; //dns update icin kullanilacak sema
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
ddns-domainname “yilmaz.com”;
ddns-rev-domainname “in-addr.arpa.”;
option domain-name “yilmaz.com”;
option domain-name-servers 172.16.16.2;
option routers 172.16.16.1;
option broadcast-address 172.16.16.255;
subnet 172.16.16.0 netmask 255.255.255.0 {
range 172.16.16.10 172.16.16.25;
zone 16.16.172.in-addr.arpa. {
primary 172.16.16.2;
}
zone yilmaz.com. {
primary 172.16.16.2;
}
}
Yukarıdaki dosyada dinamik dns güncellemesi için gerekli ayarları ve dhcp sunucusnun standart ayarlarını yaptık. Son olarak dhcp sunucumuzu başlatıyoruz.
# /etc/init.d/isc-dhcp-server start
Makalenin başında çizmiş olduğumuz yapıyı yukarıda yapmış olduğumuz işlemler neticesinde gerçeklemiş olduk.
Test aşamasına dhcp-dns sunucusu olan server1 üzerinde dhcp lease’leri kontrol ederek başlayalım;
# tail /var/lib/dhcp/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.2
lease 172.16.16.10 {
starts 1 2014/04/21 23:41:16;
ends 1 2014/04/21 23:51:16;
tstp 1 2014/04/21 23:51:16;
cltt 1 2014/04/21 23:41:16;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 08:00:27:ef:7d:33;
uid “\001\010\000’\357}3”;
client-hostname “yilmaz-xp”;
}
lease 172.16.16.11 {
starts 1 2014/04/21 23:43:32;
ends 1 2014/04/21 23:53:32;
tstp 1 2014/04/21 23:53:32;
cltt 1 2014/04/21 23:43:32;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 08:00:27:10:52:81;
client-hostname “centos.yilmaz.com”;
}
Yukarıda görüldüğü gibi client bilgisayarlar sorunsuz IP almışlar.
Client tarafındaki testler;
Centos client isim çözebiliyor mu?
Sorunsuz çözüyor.
XP’nin IP ayarları;
Sorunsuz bir şekilde kurmuş olduğumuz sistem üzerinden IP alabiliyor.
İnternete bağlanalım;
Testlerimizde de sorun yoksa isteklerimizi tam anlamıyla gerçeklemişiz demektir. Linux ile basit bir network ve sistem altyapısı kurmayı hedeflediğim bu makale umarım yararlı olur.