Yazan: boratanrikulu

Kaynaklar
LYK’18 - GNU/Linux Sistem Yönetimi 2. Düzey (Engür Pişirici)

NOT: Anlatım için VirtualBox ve Debian9 kullanılmıştır.


Bus Topology Nedir ?

Cihazların tek bir çizgi(line) üzerinde birbirine bağlanması ile oluşturulan network’e Bus Topology denir.

  • Avantajları
    • Küçük network için kolay bir çözümdür.
    • Star Topology’e göre daha az kablo gerektirir, ucuzdur.
  • Dezavantajları
    • Temassızlık, kopukluk, kısa devre vs. tüm sistemi etkiler.
    • Arıza tespiti zordur.

Oluşturulacak Yapıya Genel Bir Bakış

Bu şekilde bir yapı kurup, B server’ı üzerinden akan trafiği yönetmek istiyoruz. Bunun için 3 interface’e ihtiyacımız var. Interface’leri aşağıdaki gibi oluşturabilirsiniz.


Interface’lerin Ayarlanması

Interface oluşturmalarının yapılmasından sonra 4 tane sanal makine oluşturun ve network ayarlarını “Host Only Adapter” seçerek aşağıdaki gibi yapın.
(Adaptör sıralarına dikkat edin, script’ler bunlara uygun yazılmıştır.)

Device Adapter 1 Adapter 2 Adapter 3
Client - A vboxnet0 vboxnet1 -
Forwarder - B vboxnet1 vboxnet0 vboxnet2
Server - C vboxnet2 vboxnet1 -
Server - D vboxnet2 vboxnet1 -

Client - A’ nın Yapılandırılması

A Cihazını bir istemci gibi kullanacağımız için curl‘e ihtiyacımız olacak. Yüklü değil ise kurun. Eğer istiyorsanız terminal browser’ı da kurabilirsiniz.

Network ayarlarını yapılandırmak için aşağıdaki script’i root yetkisi ile her başlangıçta çalıştırılacak şekilde hazırlayın.

#!/bin/bash

setName() {
	ip link set dev enp0s8 down
	ip link set dev enp0s8 name AtoB
	ip link set dev AtoB up
}

setIPs() {
	ip addr add 192.168.3.3/24 dev AtoB # sets Device A IP for vboxnet1
	ip route add 192.168.4.0/24 dev AtoB via 192.168.3.40 # sets Device B as the router to access vboxnet2
}

main() {
	setName
	setIPs
}

main

Forwarder - B’ nin Yapılandırılması

B Cihazını bir forwarder olarak kullanacağız. C ve D cihazlarına erişim kapatıldığında bir uyarı sayfası göstermek istediğimizden dolayı apache2‘e ihtiyacımız olacak. Sunucuya apache2’yi kurun.

Uyarı sayfasını /var/www/hmtl/index.html altına koyabilirsiniz.

<!DOCTYPE html>
<html>
<head>
	<title>!Warning!</title>
</head>
<body>
	<h1>C and D is unreachable.</h1>
</body>
</html>

Network ayarlarını yapılandırmak için aşağıdaki script’i root yetkisi ile her başlangıçta çalıştırılacak şekilde hazırlayın.

#!/bin/bash

setNames() {
	ip link set dev enp0s8 down
	ip link set dev enp0s8 name BtoA
	ip link set dev BtoA up

	ip link set dev enp0s9 down
	ip link set dev enp0s9 name BtoC
	ip link set dev BtoC up
}

setIPs() {
	ip addr add 192.168.3.40/24 dev BtoA # sets Device B IP for vboxnet0
	ip addr add 192.168.4.2/24 dev BtoC # sets Device B IP for vboxnet2

}

setIPForward() {
	ipForward=`cat /proc/sys/net/ipv4/ip_forward`

	if [[ "$ipForward" -eq "0" ]]; then # sets IP Forward as 1
		sysctl net.ipv4.ip_forward=1
	fi
}

main() {
	setNames
	setIPs
	setIPForward
}

main

Server - C’ nin Yapılandırılması

Birinci sunucumuz olan C’ye apache2’i kurun ve /var/www/hmtl/index.html dosyasını istediğiniz gibi şekillendirin. Ben bu örnekte aşağıdaki gibi sadece C olduğunu belirtecek bir yapı kullandım.

<!DOCTYPE html>
<html>
<head>
	<title>!Device-C!</title>
</head>
<body>
	<h1>Yep. That's Fucking C!</h1>
</body>
</html>

Network ayarlarını yapılandırmak için aşağıdaki script’i root yetkisi ile her başlangıçta çalıştırılacak şekilde hazırlayın.

#!/bin/bash

setName() {
	ip link set dev enp0s8 down
	ip link set dev enp0s8 name CtoB
	ip link set dev CtoB up
}

setIPs() {
	ip addr add 192.168.4.4/24 dev CtoB # sets Device C IP for vboxnet1
	ip route add 192.168.3.0/24 dev CtoB via 192.168.4.2 # sets Device B as the router to access vboxnet0
}

main() {
	setName
	setIPs
}

main

Server - D’ nin Yapılandırılması

İkinci sunucumuz olan D’ye apache2’i kurun ve /var/www/hmtl/index.html dosyasını istediğiniz gibi şekillendirin. Ben bu örnekte aşağıdaki gibi sadece D olduğunu belirtecek bir yapı kullandım.

<!DOCTYPE html>
<html>
<head>
	<title>!Device-D!</title>
</head>
<body>
	<h1>Yep. That's Fucking D!</h1>
</body>
</html>

Network ayarlarını yapılandırmak için aşağıdaki script’i root yetkisi ile her başlangıçta çalıştırılacak şekilde hazırlayın.

#!/bin/bash

setName() {
	ip link set dev enp0s8 down
	ip link set dev enp0s8 name DtoB
	ip link set dev DtoB up
}

setIPs() {
	ip addr add 192.168.4.5/24 dev DtoB # sets Device D IP for vboxnet1
	ip route add 192.168.3.0/24 dev DtoB via 192.168.4.2 # sets Device B as the router to access vboxnet0
}

main() {
	setName
	setIPs
}

main

Ne Yaptık ? Ne Yapmak İstiyoruz ?

Oluşturulan scriptlerin çalışması için tüm cihazların kapatıp tekrar açın.
Şuan oluşan yapıda A cihazından (B üzerinden geçerek) C ve D cihazlarına erişim sağlanabiliyor. Ama bizim yapmak istediğimiz yapı tam olarak bu değil. Biz A cihazından yalnızca B’ye istek yapılmasını, hangi cevabın dönüleceğini B üzerinden karar vermek istiyoruz.

Yani aslında buradaki amaç B cihazı üzerinden client’lara hizmet vermek, C ve D cihazlarını B’nin arkasında tutmak. Bu sayede direkt olarak B üzerinde yaptığımız ayarlar sayesinde network’ü kollaylıkla yönetebileceğiz.


Forwarder Yapılandırılması

B üzerine yapılan web servisi sorgularında hangi server’dan dönüş sağlanılacağını ayarlamak için aşağıdaki gibi bir script kullanacağız.

Bu sayede Client - A üzerinden yapılacak olacak olan “curl 192.168.3.40” sorgularında hangi sunucunun sonucunun dönüleceğini kolaylıkla belirleyebiliriz.

#!/bin/bash

C_IP=192.168.4.4
D_IP=192.168.4.5

delete_them_all() {
	iptables -t nat -F # deletes all nat rules
}

add_nat_rule() {
	iptables -t nat -A PREROUTING -p tcp --dport 80 -d 192.168.3.40 -j DNAT --to-destination "$1"
}

main() {
	if [[ "$1" == "c" ]]; then
		delete_them_all
		add_nat_rule "$C_IP" # adds Device C IP to forward
		echo "Process is Completed [C]."
	elif [[ "$1" == "d" ]]; then
		delete_them_all
		add_nat_rule "$D_IP" # adds Device D IP to forward
		echo "Process is Completed [D]."
	elif [[ "$1" == "off" ]]; then
		delete_them_all
		echo "All NAT Rules are Deleted."
	else
		echo "Please use only \"c\", \"d\" or \"off\" as the input"
	fi
}

main "$*"

Client Üzerinden Görüntüleme Yapılması

Eğer B üzerinde aşağıdaki gibi bir işlem yapılırsa,

B$ ./forward.sh c

A artık B’yi sorguladığında C’yi görüntüleyecektir.


Eğer B üzerinden D forward’ı açılırsa

B$ ./forward.sh d

Client - A, D’yi görüntüler


Eğer B üzerinden Forward işlemi kapatılırsa,

B$ ./forward.sh off

Client - A aşağıdaki gibi bir ekranla karşılaşır.


B Üzerinden Hız Ayarlarının Kontrolü



Buraya Yazı Gelecek