8 Kasım 2024 Cuma

 

Büyük Ağ Topolojilerini Neo4J ile Görselleştirmek
















Neden Neo4J

Neo4J açık kaynak kodlu bir grafik veritabanıdır. Neo4j sayesinde veriler arası ilişkiler yaratılabilir. Bu ilişkilere göre filtreler yazılarak sorgulanabilir ve bunlar grafik olarak gösterilebilir. Neo4J, Cypher adı verilen SQL benzeri, kullanımı basit ve kolay bir sorgu diline sahiptir. Neo4j NoSQL bir veritabanıdır.

Node, Properties, Relationship ve Label terimleri


  1. Node: Veritabanına girilen her bir kayıttır. Bir ID’ye sahip her kayıt bir Node’dur.
  2. Properties: Her kaydın zorunlu bir ID numarası olduğu gibi opsiyonel olarak Properties adı verilen isim, yaş, adres gibi özellikleri de olabilir. Bu opsiyon olsa da ilişkileri veya sorguları yazarken Properties alanı önemli olabilir.
  3. Label, Properties ve Relationship terimlerini Linkedin üzerinden bir örnekle anlamaya çalışalım;

Firmalar ve çalışanlarının bulunduğu bir tablo olduğunu düşünelim, burdaki her kayıt bir Node’dur. Bu Node’ları gruplayıp örneğin Company ismi verebiliriz bu Label oluyor. Her kaydın yani Node’un da özellikleri olarak bulunduğu şehir, şirket adı, adresini girebiliriz bunlar da Properties oluyor. Ve Node’lar veya Properties’lar arası ilişkileri belirlediğimiz kısım da Relationship oluyor.

Aşağıdaki neo4j.com’dan aldığım görselde bir çalışana ait name, date_of_birth gibi özelliklerin (Properties) girildiği ve çalıştığı şirketteki görevinin özellik(Properties) olarak çalıştığı firma ile olan ilişkisel alana (Relationship) girildiğini görüyoruz. Properties aynı zamanda Relationship içinde de olabilir. City etiketli Node’daki gibi her zaman özellikli olmak zorunda değil.




Aşağıdaki görsel Yüzüklerin Efendisi (Kitap ve Film) üçlemesindeki karakterler ve birbirleriyle ilişkilerini gösteren güzel bir örnek. Örnek olarak Orta Dünya’da yaşadıkları yerleri de Node veya Properties olarak girerek bu veriler arası ilişkiler gösterilebilirdi.






Ağ topolojleriniz için kullanım örneği

Örnek Topolojimiz

Mars ve Venüs adında 2 veri merkezi aktif — aktif çalışıyor. VRF ile bir izolasyon yapısı mevcut. VRF’ler arası direkt leaking anonsları olduğu gibi firewall üzerinden dönen trafikler de mevcut. Son olarak Mars ve Venüs veri merkezleri arasında DCI router cihazları üzerinden haberleşme sağlanıyor.

VRF’ler arası ilişkiler

Böyle bir topolojide hangi iki network birbiriyle nasıl haberleşiyor, leaking mi var yoksa firewall üzerinden mi? Bunları görebilmek için cihazlarda erişime sahip olup, rotaları tek tek incelemek gerekecektir. Bu hem uğraş isteyen hem de erişim hakkı gerektiren bir durum. Bunu bir ağ uzmanı değil de bir yazılımcının öğrenmek istediğini düşünelim. Bu durumda da tüm erişimlerin Excel benzeri bir matriste güncel olarak tutulması gerekir. Excel yerine bir yöntem olarak Neo4j kullanabiliriz.

Neo4j Kurulum ve Kullanımı

Kurulum:
En basit ve hızlıca kurma yöntemi bir Docker container olarak kurmak olacaktır. Docker kurmak için Docker resmi web sayfasından yararlanabilirsiniz. Aşağıdaki şekilde kurduğumuzda varsayılan ayarlarda Neo4J 7474(http) ve 7473(https) olarak servis veriyor. Kendi sunucunuzda veya bilgisayarınızda Docker ile kurmak için bu komutları çalıştırabilirsiniz.

docker run \
--name testneo4j \
-p7474:7474 -p7687:7687 \
-d \
-v $HOME/neo4j/data:/data \
-v $HOME/neo4j/logs:/logs \
-v $HOME/neo4j/import:/var/lib/neo4j/import \
-v $HOME/neo4j/plugins:/plugins \
--env NEO4J_AUTH=testneo4juser/testneo4jpassword \
neo4j:latest

Cypher dili kullanımı:

CREATE: yeni node veya relationship yaratmak için kullanılan komut. Örnek olarak aşağıdaki özelliklerde yeni iki adet vlan, vrf ve aralarındaki ilişkileri kuralım.

create
//OOB_MNT ve OPS_MNT VLAN'larını yaratıyoruz
(vlanvenus_OOB_MNT:VLAN{name:'OOB_MNT',vrf:'OOB_MNT',vlanid:101,type:'vlan',subnet:'172.16.0.0/20',description:'Out Of Band'}),
(vlanvenus_OPS_MNT:VLAN{name:'OPS_MNT',vrf:'INFRA_MNT',vlanid:102,type:'vlan',subnet:'172.16.16.0/20',description:'Openstack'}),

//OOB_MGMT ve INFRA_MNT VRF'lerini yaratıyoruz
(vrfvenus_OOB_MNT:VRF{name:'OOB_MNT',type:'vrf',site:'venus',fabric:'tyc'}),
(vrfvenus_INFRA_MNT:VRF{name:'INFRA_MNT',type:'vrf',site:'venus',fabric:'tyc'}),

//VLAN'ların üyesi olduğu VRF'e göre ilişkilerini kuruyoruz
(vrfvenus_OOB_MNT)-[:REACHED {howto: 'member_of'}]->(vlanvenus_OOB_MNT),
(vrfvenus_INFRA_MNT)-[:REACHED {howto: 'member_of'}]->(vlanvenus_OPS_MNT),

//VRF'ler arası erişimler ilişkilerini kuruyoruz
(vrfvenus_INFRA_MNT)-[:REACHED {howto: 'via_firewall'}]->(vrfvenus_OOB_MNT),
(vrfvenus_OOB_MNT)-[:REACHED {howto: 'via_firewall'}]->(vrfvenus_INFRA_MNT)
return *

Sonuç:





Şimdi tüm topoloji için yukarıdaki örneği baz alarak tüm vlan, vrf ve ilişkileri yaratabiliriz. Tüm node ve ilişkilerini görebilmek için aşağıdaki sorguyu kullanabiliriz.

//tüm topolojiyi gösterir
MATCH (n)
RETURN n

Daha spesifik sorgular için node’ların properties alanlarını ve ilişki tiplerini kullanabiliriz. Örneğin iki farklı VRF arasındaki subnet haberleşiyor mu, haberleşiyorsa da leaking mi yoksa firewall üzerinden mi haberleşme var bunu görebiliriz.

Birbirine leak olan VRF’lerin üyesi olan iki subnet erişim sorgusu:

//172.16.195.0/24 ile 172.14.178.0/24 nasıl haberleşiyor
MATCH p=(:VLAN {subnet:"172.16.195.0/24"})-[:REACHED*..3]-(:VLAN {subnet:"172.14.178.0/24"})
RETURN p

Trafiği firewall üzerinden olan iki subnet erişim sorgusu:

//Firewall üzerinden olan subnet erişim
MATCH p=(:VLAN {subnet:"172.16.0.0/20"})-[:REACHED*..3]-(:VLAN {subnet:"172.16.16.0/20"})
RETURN p

Son olarak Mars ve Venüs’te bulunan iki VRF arasındaki erişimi ve trafiğin akışını gösteren sorgu:

//Mars ve Venüs arası haberleşme
MATCH p=(:VLAN {subnet:"172.16.0.0/20"})-[:REACHED*..7]-(:VLAN {subnet:"10.16.0.0/20"})
RETURN p

Okuduğunuz için teşekkürler.