15 Mayıs 2015 Cuma

GNS3te Cisco Router ile Statik NAT Ayarları


Bu yazıyı yazma fikri çok anlık gelişti. Bugün ofiste otururken neden olmasın dedim, eve gelip senaryoyu hazırladım, makinaları kurup ayarları yaptım. 23:50'de yazmaya oturdum. Konu ne?

Önce NAT'ın (ve daha özelde PAT'ın) ne olduğuna değineyim. Elinizde özel (private) IP bloklarından bir ağ vardır. Nedir bunlar? 10.0.0.0/8, 172.16.0.0/12 veya 192.168.0.0/16. Bunlardan internete çıkmak istiyorsunuzdur. Yönlendirici (router) bu paketleri alır, kendinden çıkıyor gibi gösterir. Dönen cevabı da alıp iç ağdaki makinaya yönlendirir. Nasılına değinmeyeceğim, merak eden okuyucu Wiki'deki NAT maddesini okuyabilir. Hemen her ADSL veya Kablonet kullanıcısı farkında olsun olmasın NAT'ı kullanmaktadır.

Cisco cihazlarda 3 tür NAT bulunuyor (en azından benim bildiğim). Statik, dinamik ve Cisco'nun overload da dediği PAT (Port Address Translation). Kolay anlaşılabilir olması için örnekleri internete çıkmak üzerinden vereceğim ama kuracağım senaryoda tamamen özel IP'leri kullanacağım. Statik ve dinamik NAT için elimizde birden fazla internete çıkabilir (public) IP olması gerekiyor. Statik NAT'ta iç ağdaki her cihaza sabit bir dış IP karşılık geliyor. Örneğin servis sağlayıcılar bunu sunucularını korumak için kullanıyorlar. Sunucunun internetteki IP'si aslında bir firewall yada yönlendiricinin bacağıdır ve bunlar dışarıdan gelen kötü niyetli istekleri bloklayacak şekilde ayarlanmıştır. Dinamik NAT'ta tek fark iç ağdaki cihazların bir dış IP'lerinin sabit olmamasıdır. Yönlendirici, cihaz açılırken ayarlarda belirlenmiş bir dinamik NAT IP havuzundan sıradaki ilk IP'yi verir. Son olarak PAT'da dışa açılan tek bir IP vardır. İç ağdaki makinalar ağ geçidinin (gateway) farklı portlarından internete erişir. Örneğin iç makina 192.168.144.12 olsun ve 43210/tcp'den dışarıdaki bir sunucuya (mesela google) http isteği göndersin. Dışarıdaki IP (servis sağlayıcının atadığı) 120.130.140.150 olsun. İnternette dolaşan trafik 120.130.140.150'nin herhangi bir tcp portundan çıkıyor olabilir. Ağ geçidi o anda boş bulunan herhangi bir portundan trafiği çıkarabilir. Sıradan ev internet kullanıcısının kendi yerel ağından internete çıkarken PAT'dan yararlanır.

Benim senaryom iç ağda farklı bir VLAN'daki sunucuları başka bir ağa sanki standart VLAN'dan gelen trafikmiş gibi göstermek. Kullanacağım araçlar GNS3 (GNU Network Simulator-3), Oracle VirtualBox ve PuTTY. GNS3 başlı başına gelişkin ve bir çok bileşeni olan bir paket. http://www.gns3.com/ adresinden bulunabilecek bu yazılımda DynaMIPS, Qemu hypervisor'leri geliyor. Ayrıca Wireshark ve VirtualBox ile birlikte çalışabiliyor. DynaMIPS, Cisco cihazların IOS kalıp dosyalarını çalıştırarak sanal yönlendirici çalıştırmaya olanak sağlıyor. Wireshark'ı cihazlar arası bağlantılar üzerinde çalıştırarak gidip gelen paketler gözlemlenebiliyor ve VirtualBox ile oluşturulan sanal makinalar bu yönlendiricilere bağlanarak uç cihazlar oluşturuluyor. Wireshark ve VirtualBox GNS3 kurulumunda seçimlik. Ben, VirtualBox'ı kullanacağım.

GNS'in en son sanırım 1.2 sürümü çıkmıştı. Bende 0.8.6 sürümünü var ve yazıda bunu kullanacağım. Son sürümde bir çok şey değişmiş geldi, gözümü korkuttuğundan yeni sürüme geçmedim. GNS3'ün kurulumu, ayarları ve Cisco IOS kalıp dosyası atılması ayrı bir yazı konusu olabilir. O nedenle onu buraya sıkıştırmayacağım. Youtube'da bu konuyla ilgili bir çok video var (örneğin #1 yada #2).

Herşeyden önce VirtualBox'ta aşağıdaki gibi 3 tane "Host-Only" ağ oluşturdum. Bunlara sırayla 192.168.24.0/24, 192.168.25.0/24, 192.168.26.0/24 IP'lerini verdim. Bunun benzerini bir önceki yazıda VMware için de yapmıştım, okuyan varsa hatırlayacaktır. 

VirtualBox'da ağ oluşturma

Sonra bu ağlarda kullanmak üzere VirtualBox'ta 'Mazhar' adında bir sanal makina oluşturdum. Donanımda standart olmayan tek şey sanal makinanın iki ağ kartının olması. İlkini GNS3 kullanıyor. Onu NAT olarak bıraktım, ikincisini Host-Only#1 ağında olacak şekilde ayarlayıp üzerine CentOS6.6 minimal kurdum. eth0, IP'yi DHCP'den alıyor, eth1'e elle aşağıdaki ayarları girdim.

IPADDR=192.168.24.101
NETMASK=255.255.255.0
#GATEWAY=192.168.24.2

Ayarlar /eth/sysconfig/network-scripts/ifcfg-ethX dosyalarına girilecek. Ayrıca UUID ve HWADDR ile başlayan satırları silip ONBOOT=yes yapmakta yarar var.

Gerekli değil ama makinaya VirtualBox additions paketi kurulacaksa aşağıdaki adımları izlemek gerekiyor:

yum install kernel-firmware kernel-devel gcc perl
yum -y update
reboot
[ Sanal makina penceresinde Devices-> Insert Guest Additions ... seçilir. ]
mount /dev/sr0 /mnt
cp /mnt/VBoxLinuxAdditions.run .
./VBoxLinuxAdditions.run
reboot

Sonra bu makinadan 3 tane klon çıkardım. Adları sırayla Osman, Rustem ve Server.  İkinci ağ kartları Osman Host-Only#1'de, Rustem Host-Only#2'de ve Server Host-Only#3'te. Bütün makinaları açıp şu ayarları yaptım:
  1. Kartların numaralandırması /etc/udev/rules.d/70-persistent-net.rules dosyasından yapılır (Mazhar'ın MAC'ine ait girdiler silinebilir yada tüm girdiler silinip açılışta yeniden oluşması beklenir).
  2. /etc/sysconfig/network dosyasında doğru hostname'ler girilir.
  3. /etc/sysconfig/network-scripts/ifcfg-eth1 dosyasında IP'ler girilir. Osman için 192.168.24.101, Rustem için 192.168.25.101 ve GATEWAY=192.168.25.2 (başındaki # kalsın). Server için 192.168.26.101 ve GATEWAY=192.168.26.2 (başındaki # kalsın).
Server'de ek olarak apache ve php kurulumu şöyle yapılacak:
yum -y install httpd php
chkconfig httpd on

Ve /var/www/html/index.php dosyasının içeriği şöyle olsun:
<?php
$ip = getenv("REMOTE_ADDR") ;
Echo "Your IP is " . $ip;
?>

Bu betiği internette buldum. Böylece VirtualBox'ta ayarlar tamamlandı. Bütün makinaları kapatıp GNS3'e geçiyorum.


Şebekenin Topolojisi
GNS3'te yan görüntüdeki ağı kurdum. Kullandığım cihazlar; iki c7600 yönlendirici, iki switch ve önceden oluşturduğum 4 tane sanal makina. Sanal makinaları GNS3 içinde kullanmak için GNS3'e tanıtılmaları gerekiyor. Edit -> Preferences -> VirtualBox penceresinin VirtualBox Guest sekmesinde VMList'ten sanal makinalar seçilip GNS3'e import edilir. Nasıl yapılacağına dair yine youtube'da video var. Bu işlemden sonra sanal makinalar ağa eklenebilir duruma gelir (solda üstten üçüncü simge). Switch'lerde standart ethernet switch kullandım. SW2'de herhangi bir port ayarı yok. SW1'deki port ayarları aşağıdaki gibi: 

Switch SW1 port ayarları
Yönlendiricide modül ayarları
Son olarak yönlendiricileri ağa ekledim. Yönlendiricilerin üzerinde GNS3'te herhangi bir bağlantı modülü (bakır, fiber, seri vb.) gelmiyor. Bunlar grafik arayüzden elle eklenmelidir. Yandaki görüntüde kendi seçtiğim modülleri gösterdim. Modüller eklenip bağlantılar yapılınca (bağlantılar için sol sütun en alt simge) sıra sanal makinaları açıp yönlendiricilerdeki ayarları girmeye geliyor. Önce GNS3'te sanal makinalara sağ tıklayıp Start dedim. Makinalar açıldıklarında "default gateway" eth0 olacak. Her makinanın ifcfg-eth1 dosyasında GATEWAY ifadesinin başındaki # işaretini kaldırıp service network restart komutuyla ağı yeniden başlatıyorum. Böylelikle artık "default gateway" eth1 arabirimi oldu. 

Buraya kadar olan kısımda aslında hiçbirşey yapılmadı. Ağın iskeleti yönlendiricilerdeki ayarlarla oluşturulacak. Önce arabirimlere IP'lerini vermekle başlıyorum. Kolaylık açısından yönlendiricilere Alpha ve Bravo adını verdim. Hangi yönlendiriciye hangi ayar girdiğimi belirtirken bu adları kullanacağım. Yönlendiriciye sağ tıklayıp "Start" diyerek açıyorum.

GNS3'te yönlendiriciye çift tıklayınca önceden ayarlı olarak enable mod adı verilen modda başlıyor. Çift tıklayınca "Alpha>" gibi bir ifade varsa bu ayar bulunmuyordur. enable komutuyla bu moda geçilmelidir. Enable modda Alpha# ifadesi bulunur. Bu mod, yönlendiricinin Linux'taki root kullanıcısıyla çalıştığı kabuğa benzetilebilir. Yönlendiricinin modeli ve arabirimler aynıysa aşağıdaki komutlar sorunsuz çalışacaktır. Aynı olmaması durumunda doğru arabirimlerin adlarını girmek gerekecektir. 

Önce iki yönlendirici arasındaki ağı ayarlayıp bunun NAT'ta bir dış arabirim olduğunu bildirelim:


Alpha#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Alpha(config)#int gig0/0

Alpha(config-if)#ip address 192.168.27.1 255.255.255.252
Alpha(config-if)#ip nat outside
Alpha(config-if)#no sh
Alpha(config-if)#exit
Alpha(config)#


Sonra iç ağı ayarlayalım:
Alpha(config)#int FastEthernet 1/0
Alpha(config-if)#no sh
Alpha(config-if)#exit

Alpha(config)#int FastEthernet 1/0.10
Alpha(config-subif)#description VLAN10
Alpha(config-subif)#encapsulation dot1Q 10
Alpha(config-subif)#ip address 192.168.24.2 255.255.255.0
Alpha(config-subif)#ip nat inside
Alpha(config-subif)#exit
Alpha(config)#
Alpha(config)#int Fa 1/0.20
Alpha(config-subif)#desc VLAN20 

Alpha(config-subif)#encapsulation dot1Q 20
Alpha(config-subif)#ip address 192.168.25.2 255.255.255.0 
Alpha(config-subif)#exit
Alpha(config)#


İç ağda FastEthernet1/0'a bağlı iki alt-arabirim tanımladım. Linux'taki eth0:0 gibi. Alt-arabirim aynı ağ kartının birden fazla kart gibi davranmasını sağlıyor. Böylece tek arabirimle FastEthernet 1/0.10 VLAN10'daki makinalarla, FastEthernet1/0.20 ise VLAN20'deki makinalarla aynı ağda olabilecek. Bu yapıya "router-on-a-stick configuration" deniyor. Sanıyorum VLAN'ların üzerinde aktığı "trunk" bağlantısı, dondurma çubuğuna (stick) benzetiliyor. Örn. bu görüntü. Bu ayarlarda önemli bir nokta da VLAN10'daki cihazların NAT'ın iç tarafında olacaklarını bildirdim.

Yönlendirici kendi üzerindeki (doğrudan bağlı) ağlara gidip gelen trafiği yönlendirebilir ama ondan bir 'hop' uzaklıktaki 192.168.26.0/24 ağına hangi bacağıyla gideceğini bilemediğinden bunu statik yönlendirmeyle (elle) girmek gerek:

Alpha(config)#ip route 192.168.26.0 255.255.255.0 GigabitEthernet0/0

Yönlendiricideki arabirimlere .2'li IP vermemin nedeni, her ağın .1'li IP'sinin Windows'un kendi ağ arabirimi tarafından alınması. Bu ayarlar girildiğinde artık Mazhar, Rüstem'i yönlendirici üzerinden ping'leyebiliyor olacaktır (inter-vlan routing). Ancak henüz Server'e kimse ulaşamıyor çünkü Bravo yönlendiricisine geri dönüş rotaları girilmedi. Öyleyse önce arabirim IP'lerini verip rotalarını girelim:

Bravo#conf ter
Enter configuration commands, one per line.  End with CNTL/Z.
Bravo(config)#int Gig0/0
Bravo(config-if)#ip addr 192.168.27.2 255.255.255.252
Bravo(config-if)#no sh
Bravo(config-if)#exit
Bravo(config)#

Bravo(config)#int Fa1/0
Bravo(config-if)#ip addr 192.168.26.2 255.255.255.0
Bravo(config-if)#no sh
Bravo(config-if)#exit


Buraya kadar yalnız IP'ler girildi. Sağ taraf basit bir ağ olduğundan VLAN yada NAT ayarı bulunmuyor. Yalnız bu sefer iki tane ağ bilinmediğinden, iki tane rota girilecek:

Bravo(config)#ip route 192.168.24.0 255.255.255.0 GigabitEthernet0/0

Bravo(config)#ip route 192.168.25.0 255.255.255.0 GigabitEthernet0/0

Elbette bu iki rota 192.168.24.0 255.255.254.0 olarak özetlenebilirdi. Şimdi Mazhar'dan Server'e bir ping atmayı deneyelim:

Görüldüğü gibi gidip dönebiliyor. Bunu yaparken hangi IP'yi kullandı? Bunu bilmek için apache'de php ile yazdığımız betiği kullanacağız. curl ile web sayfasını çekip dönen cevaba bakalım:

Yönlendiricide hangi tarafın NAT için iç ve dış olduğunu tanımladık ama hangi iç IP'nin hangi dış IP'ye karşılık geldiğini yazmadık. Şimdi Alpha yönlendiricisine geri dönüp şu komutları girelim:

Alpha#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Alpha(config)#ip nat inside source static 192.168.24.101 192.168.25.111
Alpha(config)#ip nat inside source static 192.168.24.102 192.168.25.112
Alpha(config)#


Bunlardan ilki Mazhar ikincisi Osman içindi. Komutları girdikten sonra Mazhar'a geri dönüp aynı komutları tekrar çalıştırdım:


Yukarıda görüldüğü gibi artık Mazhar statik NAT'la sunucuya erişmiş oldu.


Son olarak yazıyı burada bitirmeden, daha önce de aslında daha düşük seviye bazı yazılar yazmak istediğimi söylemiştim. Korumalı modla ilgili yazmak için araştırma yaparken WRK (Windows Research Kernel) ile ilgili bazı yazılar ilgimi çekti ancak konu benim alanımın dışına çıkıyor (C++'dan ötürü). Bununla birlikte elektronikle ilgili şeyler de yazmak istiyordum. Özellikle aklımdaki konu, şu arduino arabayı yapıp, yaparken de adım adım anlatıp incelemesini yapmaktı ama arabayı tamamladım ve tekrar bozup yapmak istemiyorum. Buraya kadar yazıyı okuyan biri bana bunu alırsa, arabayı yapıp yapılmış halde geri vereceğime dair söz veriyorum : ). Eğer o olmazsa şu osiloskobu sipariş ettim, yakında gelir. Belki bununla ilgili bir inceleme yaparım. Kim bilir...