Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me
Showing posts with label veri haberleşmesi. Show all posts
Showing posts with label veri haberleşmesi. Show all posts

Syslog çoğu linux dağıtımında kurulu gelen genel amaçlı bir loglama uygulamasıdır. Bütün programlar loglanmış bilgilerini syslog'a gönderir, syslog konfigurasyon dosyasına başvurarak bulduğu eşleşmelere göre yapılması beklenen eylemi gerçekleştirir (gerekli yerlere yazmak veya göndermek). Rsyslog için ana konfigurasyon dosyası '/etc/rsyslog.conf' dur. Bu dosya içerisinde global directives,modules ve rules bölümleri vardır. Rules ismi verilen kurallar filter ve action bölümlerinden oluşur. Filter kısmı belli bir syslog mesaj kümesini seçmek için, action kısmı ise o mesaj kümesi için yapılacak eylemi belirlemek için kullanılır. Bu dosya içerisinde bir rule tanımlamak için; filter ve action aralarında boşluk olacak şekilde bir satırda yazılmalıdır.

NTP, fazlalık kapasitesi olan bir sıralı zaman dağıtım sistemidir. Ağdaki ve de hedef makinedeki algoritmaları, gecikmeleri ölçer. Bu teknikleri kullanarak saatleri saliselere kadar senkronize edebilir. NTP ayarları hangi dağıtımın kullanıldığına bağlı olarak ya /etc/ntp.conf ya da /etc/xntp.conf dosyasından yapılır.
Çoğu temel yapılandırmalı ntp.conf dosyasında iki sunucu ismi mevcuttur. Birisi, saat ayarının yapılması istenen sunucunun adı ve diğeri de sahte bir IP adresidir. (Bu örnekte 127.127.1.0)
Sahte IP adresi ağ problemleri olması durumunda veya NTP sunucusunun kapalı olması/çökmesi durumunda kullanılır. Sistemdeki NTP uygulaması, uzak NTP sunucusu ayağa kalkınca, sistem saatini tekrar ona göre ayarlayacaktır. Bu iki sunucudan birincisi asıl sunucu olarak işlem yapar, ikincisi ise yedek amaçlıdır. Ayrıca bu hedef dosyanın yeri de belirtilmelidir. NTP zamanla, sistem saatindeki hata oranını "öğrenecek" ve kendini buna göre ayarlayacaktır.

Düşük etkileşimli ve istemci taraflıdır. Web tarayıcısı davranışının benzetimini yaparak istemci taraflı saldırıları tespit etmeyi hedefler. ActiveX kontrolleri, temel tarayıcı fonksiyonellikleri ve tarayıcı eklentileri olmak üzere 3 adet açıklık modülü vardır.

Honeypot sistemimize yapılan saldırıları tespit etmek, yavaşlatmak ve gerçek sistemimizi kamufle etmek için kullanılan bir teknolojidir.Ayrıca çağımızda hızla yenilenen teknoloji ile buna paralel olarak keşfedilen yeni saldırı tekniklerini analiz etmek amacıyla da kullanılabilen bir teknolojidir. Peki neden balküpü denmiştir ve altında yatan felsefe nedir ? Bu sorunun cevabı ise tahmin ettiğiniz gibi kolaydır. Balküpü dışarıdan bakıldığında güzel bir görünüme sahip ve ele geçirmek için cezbedici bir özelliğe sahiptir. Fakat içinde nelerin olduğunu bilemeyiz. Örneğin bir canlı içinden ballar akan güzel kokulu bir balküpüne saldırmak istediğinde içinde tehlikelerle dolu zararlı arılarla karşılaşacağını bilemez. İşte doğadaki bu mantığın teknolojiye ve günümüzde giderek çoğalan siber saldırılara uygulanmış halidir honeypot teknolojisi.

Saldırgan sistemimize saldırmak istediğinde karşısında bizim konfigüre ettiğimiz bir sistem görünür. Saldırgan belirlediğimiz sistemi gerçek bir sistem sanarak saldırmayı dener. Bu süre içerisinde konfigüre ettiğimiz honeypot sistemi devreye girer. Saldırganın hareketlerini, saldırı tekniğini loglamaya başlar. Böylelikle saldırganın nereden ve hangi teknikle saldırmış olduğunu öğrenerek sistemimizde gerekli güvenlik önlemlerini almaya çalışırız.

Honey Pot Türleri

Bunun için belirlenmiş bir standart olmasa da bal küpleri yerleşim ve etkileşim seviyelerine göre sınıflandırılabilirler.

Yerleşimlerine göre bal küpleri şu şekilde sınıflandırılabilir:
  • Üretim bal küpleri (production honeypots)
  • Araştırma bal küpleri (research honeypots)
Üretim bal küplerinin kullanımı kolaydır. Kısıtlı bilgi içerirler. Üretim bal küpleri genel olarak diğer üretim sunucuları ile birlikte üretim ağına yerleştirilir. Üretim bal küpleri genelde, kurulumu ve kullanımı daha kolay olan, düşük etkileşimli bal küpleridir. Saldırılar ve saldırganlar hakkında araştırma bal küplerine göre daha az bilgi elde ederler.

Araştırma bal küpleri, farklı ağları hedef alan saldırgan (hacker) gruplarının amaçları ve saldırı taktikleri hakkında bilgi toplamaları için ve kuruluşların karşılaştıkları tehditleri araştırmak ve kuruluşların bu tehditlere karşı daha iyi nasıl korunabileceklerini öğrenmek için kullanılırlar. Araştırma bal küplerinin kurulumu ve bakımı zordur. Daha kapsamlı bilgi tutarlar ve özellikle askeri kurumlar, araştırma ve devlet kurumları tarafından kullanılırlar.

Etkileşim seviyelerine göre bal küpleri şu şekilde sınıflandırılabilir:
  • Saf bal küpleri (pure honeypots)
  • Yüksek etkileşimli bal küpleri (high-interaction honeypots)
  • Düşük etkileşimli bal küpleri (low-interaction honeypots)
Yüksek etkileşimli bal küpü teknolojisinde yapılan son araştırmalar sonucu, sanal makine kullanılarak birden fazla bal küpü tek bir fiziksel makinede çalıştırılabilmektedir. Bu sayede, bal küpü saldırıdan etkilense bile çok hızlı bir şekilde eski durumuna döndürülebilmektedir. Sanal makinenin kullanılabilir olmadığı durumlarda, her fiziksel makine için bir bal küpü çalıştırılır. Bu durumun da maliyeti çok yüsektir.

Saf bal küpleri tam teşekküllü sistemlerdir. Başka bir yazılımın yüklenmesine gerek yoktur. Saf bal küpü kullanışlı olmasına rağmen savunma mekanizmasının gizliliği genelde, daha gelişmiş bir mekanizma tarafından sağlanabilir.

Yüksek etkileşimli bal küpleri çeşitli servisler sağlayan gerçek sistemlerin hareketlerini taklit ederler, böylece saldırganın zamanını harcayabileceği birçok servisi kullanmasına izin verilir. Yüksek etkileşimli bal küpleri, düşük etkileşimli bal küplerine göre daha zor tespit edilebilmektedirler. Fakat idame maliyetleri düşük etkileşimli bal küplerine göre daha yüksektir.

Düşük etkileşimli bal küpleri sadece saldırganlar tarafından sık kullanılan bazı servisleri taklit ederler. Yüksek etkileşimli bal küplerine kıyasla daha az kaynak harcadıkları için bir fiziksel makinede kolaylıkla birden fazla sanal makine çalışabilir.

Honeypotların Çalışma Mantığı

Honeypotlar yaptığı büyük işlerin aksine öyle karmaşık kurgulanmış algoritmalara sahip değildir. Gayet basit bir mantığı vardır. Honeypotların çalışma mantığı IDS(Intrusion Detection System) saldırı tespit sistemlerinin çalışma mantığı ile paraleldir. Belirlediğimiz portta çalışan servislere yapılan saldırıları analiz ederek bize log kayıtlarını gösterebilir. Saldırgan bir exploit yolladığında bunu antivirüs yardımıyla analiz edebilir. Kullanım alanlarına göre birçok şekilde konfigüre edilebilirler. Örneğin spam hareketlerini tespit etmek için dahi kullanılabilirler.

Başka bir örnek ise büyük bir kuruluş içerisinde farklı ağ yapıları bulunabilir. Saldırgan atak yapmaya başladığında honeypot olmayan bir ağa sızmayı denediğinde bu bir zafiyet oluşturabilir. Bunun içinde birçok honeypot’u farklı ağlarda konfigüre ederek bir honeypot ağıda kurulabilir. Bu tarz sistemlere HoneyNet denir. Honeypotların en büyük avantajı zor tespit edilebilmesi ve gerçek bir sistemmiş gibi konfigüre edilen tuzak sistemler olmasıdır. Dezavantajı ise saldırgan honeypot veya honeynet sistemlerine değinmeden asıl sisteme ulaşmış olabilir veya direk olarak asıl sisteme saldırabilir. Bu yüzden honeypot sistemlerini iyi konfigüre etmeli ve güvenlik kurgusunu iyi oluşturmalıyız.

Threat Intelligence(Tehdit İstihbaratı)

Kim Saldırıyor?
Neden bunu yapıyorlar?
Ne Peşindeler?
Ne yapıyorlar?
Nereden geliyorlar?
Nasıl savunabilirim?

Honeypot’u neden kullanmak gerektiğini açıklayan başlıklar işte bunlardır.

Bu soruların cevaplarını elde etmek için honeypot sisteminden yararlanabiliriz. Siber tehdit istihbaratı bu yüzden önemlidir. Mesela honeypot sisteminde saldırganın kim olduğunu analiz edebiliriz. Daha sonra hangi saldırı türünü kullandığını ve nereye saldırdığını öğrenme şansımız olabilir. Saldırırken çalışan servislerde ne tür exploitler deniyor, hangi şifrelerle brute force attack yapıyor bunları grafiksel hale dökerek bile inceleyebiliriz. Bu verileri inceledikten sonra ne olacak diye bir soru sorabiliriz. Bu verileri inceledikten sonra gerekli analiz yapılarak sistemimizde bu ataklara karşı bir zafiyet varmı diye kontrol edebiliriz. Örneğin kolay parola zafiyeti veya local root exploit zafiyeti gibi zafiyetler varmı diye kontrol edebiliriz. Daha sonra gerekli savunma faaliyetlerini, sıkılaştırmaları sistemimizde yapabiliriz.

Honeypot Uygulaması

Honeypot Bileşenleri

Genel işleyişe bakıldığında , sanal cihazlar kullanılarak ağda yer alacak yönlendiriciler, istemciler ve sunucular yaratılmaktadır. Bu süreç 4 aşamadan oluşmaktadır;

1.Sanal Cihazların Oluşturulması

FreeBSD Jail : Birbirinden bağımsız , düşük kaynak tüketimli sanal sistemler oluşturmaya yarayan bir sanallaştırma sistemidir. Sistemler gerçek bir sistemin sağlayabildiği birçok özelliği sağlayabilmektedir. Honeypot ,ihtiyacı olan ağ işlemlerini Jail sisteminin ileri bir sürümü olan VIMAGE’i kullanmaktadır.

2.Sanal Bağlantıların Oluşturulması

Netgraph : Üzerinde çeşitli ağ işlemleri yapılmasına olanak sağlayan , ağ nesnelerine sahip bir sistemdir. Honeypot , netgraph nesnelerini birbirine bağlayarak ağ yapısını oluşturmaktadır.

Honeypot’da kullanılan netgraph nesneleri;
ng_eiface : Sanal ethernet arayüzü sağlamaktadır.
ng_bridge : Birden fazla nesnenin birbirine bağlanmasında kullanılır.
ng_pipe : Gecikme ve paket kaybını taklit ederek trafiğin şekillendirilmesini sağlar.

Epair : Netgraph gibi ağ cihazlarının birbirine bağlanmasında kullanılır. Aralarındaki önemli iki fark vardır.

Epair sistemi , netgraph kadar karmaşık değildir. İpconfig komutu sayesinde nesneler kolayca oluşturulup dağıtılır.

Netgraph nesneleri arasında , pipe nesnesi kullanılarak daha gerçekçi bir ağ yaratılabilir. Epair da böyle bir özellik yoktur.

3.Dinamik Yönlendirme

Quagga : Açık kaynak kodlu hizmet veren bir yönlendirme protokolüdür. Ayrıca bu uygulama OSPF,IS-IS,BGP ve RIP gibi temel routing protokollerini desteklemektedir. Quagga , GNU lisansıyla istenildiği kadar router eklemeye olanak sağlar.

4.Servis Sanallaştırma

Honeypot projesi kapsamında HTTP, DNS, SMTP ve FTP servislerinin taklitleri geliştirilerek bu sistemlerde kullanılmaktadır. Bu gibi servisler oluşturulacak honeypot üzerinde amacına uygun bir şekilde öykülenerek çalıştırılır.

FreeBSD , gelişmiş ağ altyapısı , verimlilik, güvenlik ve uyumluluk yeteneklerine sahip gelişmiş bir işletim sistemidir. İçinde yukarda bahsettiğimiz Netgraph ve Epair gibi bir çok araç bulundurmaktadır. Kısacası en baştan bir Honeypot oluşturmaya karar veren bir kişinin ilk yapması gereken şey FreeBSD’yi kurması olacaktır. Bundan sonraki adımlar değişkenlik gösterebilir. Bunun sebebi kullanılacak Honeypotun belli bir amaca hizmet edicek olmasıdır(Saldırganları caydırma yada saldırganların kullandığı yöntemleri öğrenmek). FreeBSD sayesinde birkaç tane sanal makine kurduk. Bu aşamadan sonra Netgraph ve Epair gibi araçları kullanarak bu makinalar arasında bağlantıları oluşturduk. Aslında bu aşamanın internete bağlanmak için bilgisayarınızı modeme bağlamaktan pek bir farkı yok. Kabloları bağladık şimdi sırada sanal cihazlarımızı birbirleriyle iletişimi sağlayabilmeleri için dinamik yönlendirme yapmakta. Bu iş için Quagga yazılımını kullanabilirsiniz. Son aşama öyküleme aşaması. Saldırganı meşgul etmek mi istiyorsunuz yoksa yaptıklarından bilgi mi almak istiyorsunuz? Bunu belirledikten sonra http, dns gibi servislerin taklitlerini bu sanal cihazlarda kullanıyoruz.

Honeypotun asıl amacı korumak istediğimiz makinaları taklit ederek bütün saldırıları kendi üzerine çekmesidir. Bu yüzden yukarıdaki aşamalarda ki öyküleme iyi yapılması gerekir.

Bir honeypot uygulamasını nasıl yapılandırabiliriz aşamalarıyla incelemiş olduk. Şimdide büyük honeypot projelerini incelemeye çalışalım. Hangi sistemlerde kullanılıyor, hangi büyük kuruluşlar kullanıyor bunları inceleyelim.

Honeypot Tespit Yöntemleri

Aslında işin en can alıcı ve önemli noktasını anlatmaya çalışacağız. Çünkü bir sistemi alaşağı etmek istiyorsak o sistemi tamamıyla bilmemiz gerekir. Neler çalışıyor, hangi teknolojileri kullanmakta, kimler çalışıyor, hangi algoritmaları kullanıyor bilmek gerekir. Bu konu daha çok savunma tarafı değil de saldırı tarafı için önemlidir. Bir sisteme sızma testi gerçekleştirirken o sistemde honeypot’a yakalanma oranımız yüksektir. Ve de iyi kurgulanmış ve amacına uygun konfigüre edilmiş bir honeypot gerçekten tespit edilemez bile olabilir.

Honeypotları gerçekten tespit etmek zordur. Çünkü emülasyon olsa bile saldırgana gerçek bir sistemmiş gibi gözükebilir. Honeypotları tespit etmek için bazı yazılımlar vardır. Bunlardan öne çıkan yazılım Send-Safe Honeypot Hunter’dır. Bunun gibi yazılımlar portları, portlarda çalışan servisleri analiz ederek sistemin gerçek veya tuzak bir sistem olduğunu anlamaya yarayan araçlardır. Diğer bir yazılım ise Nessus’tur .Bu da uzak sistemde honeypot olup olmadığını tespit etmek için sistemi analiz eden bir yazılımdır. 

Özgür bir parola çözme yazılım aracıdır. Parola çözücüleri tek paket içinde bir araya getiren, parola test eden ve çözen en popüler programlardan biridir.

John The Ripper Password Cracker  Kurulumu
  • sudo apt-get install john
komutu ile kurulum gerçekleştirilir.

Sanal özel ağ (VPN), uzaktan erişim yoluyla farklı ağlara bağlanmayı sağlayan internet teknolojisidir. VPN sanal bir ağ uzantısı oluşturduğu için, VPN kullanarak ağa bağlanan bir cihaz, fiziksel olarak bağlıymış gibi o ağ üzerinden veri alışverişinde bulunabilir. Kısacası Virtual Private Network (VPN), İnternet ya da başka bir açık ağ üzerinden özel bir ağa bağlanmayı sağlayan bir bağlantı çeşididir. VPN üzerinden bir ağa bağlanan kişi, o ağın fonksiyonel, güvenlik ve yönetim özelliklerini kullanmaya da devam eder. VPN'in en önemli iki uygulaması OpenVPN ve IPsec'dir.

VPN istemcisi, İnternet üzerinden bağlantı kurmak istediği kaynakla sanal bir noktadan-noktaya (point-to-point) bağlantı kurar, kaynak ya da uzaktan erişime geçmek istediği sunucu kimlik bilgilerini kontrol eder ve doğrulama sonrasında VPN istemcisiyle uzaktan erişime geçtiği sunucu arasında veri akışı gerçekleşir. Veriler, akış sırasında noktadan-noktaya bağlantı gibi üst bilgi kullanılarak kapsüllenir. Üst bilgi, verilerin bitiş noktasına erişimleri için paylaşılan veya ortak ağ üzerinden yönlendirme bilgileri sağlar. Özel ağ bağlantısını taklit etmek için, gönderilen veriler gizlilik amacıyla şifrelenir. Paylaşılan veya ortak ağda ele geçirilen paketlerin şifreleri, şifreleme anahtarları olmadan çözülemez. Özel ağ verilerinin kapsüllendiği ve şifrelendiği bağlantı VPN bağlantısı olarak bilinir.

İki çeşit VPN bağlantısı vardır. İlki uzaktan erişim VPN, diğeri ise siteden siteye VPN’dir.

VPN Bağlantı Çeşitleri
  • Uzaktan Erişim VPN: Uzaktan erişim VPN bağlantıları, evinde çalışan ya da seyahat esnasında ofisinde olamayan kullanıcıların İnternet üzerinden özel ağ üzerindeki sunucuya erişme imkânı sağlar. VPN, istemcisiyle uzaktan erişim sunucusu arasında noktadan noktaya bir bağlantıdır. Ayrıca veriler özel bir ağ üzerinden gönderiliyormuş gibi görünmektedir. Bu yüzden ortak ağın gerçek alt yapısı önemli değildir.
  • Siteden siteye VPN: Siteden siteye VPN bağlantıları farklı ofisler arasında veya farklı kuruluşlar arasında ortak bir ağ üzerinden güvenli bir şekilde iletişimi sağlamaz. VPN bağlantısı WAN (Wide Area Network) bağlantısı gibi çalışır. WAN bağlantısı şehirler, ülkeler gibi uzun mesafeler arasında iletişimi sağlayan ağ çeşididir. Ağlar, İnternet üzerinden verileri bir yönlendirici ile başka bir yönlendiriciye iletir. Yönlendiricilere göre VPN bağlantısı, veri bağlantısı olarak işlev görmektedir.
Siteden Siteye VPN bağlantısı özel bir ağın iki bölümünü birbirine bağlar. VPN sunucusu, bağlı olduğu ağa bağlantı sunarken, yanıtlayan diğer sunucu ya da yönlendirici (VPN sunucusu), yanıtlayan yönlendiricinin (VPN istemcisi) kimlik bilgilerini doğrular. Karşılıklı doğrulama sağlanır. Ayrıca siteden siteye VPN bağlantısı üzerindeki iki sunucunun gönderdikleri veri transferlerinin başlangıç noktaları tipik olarak yönlendiriciler veya sunucular değillerdir.

VPN Bağlantılarının Özellikleri

PPTP, L2TP/Ipsec ve SSTP kullanan VPN bağlantılarının 3 önemli özelliği kapsülleme, kimlik doğrulama ve son olarak ise veri şifrelemedir.
  • Kapsülleme: VPN ağında veriler bir üst bilgi ile kapsüllenirler. Üst bilgi, verilerin bitiş noktalarına erişmeleri için, paylaşılan veya ortak ağ üzerinden çapraz geçebilmelerine olanak veren yönlendirme bilgileri sağlar. 
  • Kimlik doğrulama: Ağa erişmeye çalışan kişinin buna yetkili olup olmadığı, dışarıdan müdahale edilemeyecek şekilde, yani şifreli olarak HTTPS protokolü ile yapılır ve izini olanlar ağa alınır. 
  • Veri şifreleme: Veriler de dışarıdan ağdan geçen bilgileri dinleyenlerin çözümleyemeyeceği biçimde şifrelenerek dışarıdakiler için anlaşılmaz hâle getirilir.
Kapsülleme

VPN teknolojisinde özel veriler, geçiş ağını çapraz geçmelerine izin verecek yönlendirme bilgilerini içeren bir üst bilgiyle kapsüllenir.

Tünel oluşturma, bir protokol türündeki paketin başka bir protokol datagramı içinde kapsüllenmesini sağlar. Örneğin, VPN, IP paketlerini Internet gibi ortak bir ağ üzerinden kapsüllemek için PPTP'yi kullanır. Noktadan Noktaya Tünel Protokolü (PPTP), Katman İki Tünel Protokolü (L2TP) veya Güvenli Yuva Tünel Protokolü'ne (SSTP) dayalı bir VPN çözümü yapılandırılabilir.

PPTP, L2TP ve SSTP protokolleri büyük ölçüde, orijinal olarak Noktadan Noktaya Protokolü (PPP) için belirlenen özellikleri esas alır. PPP çevirmeli veya adanmış noktadan noktaya bağlantılar üzerinden veri göndermek için tasarlanmıştır. IP kullanımında, PPP, IP paketlerini PPP çerçeveleri içinde kapsüller ve ardından kapsüllenen PPP paketlerini noktadan noktaya bir bağlantı üzerinden aktarır. PPP orijinal olarak çevirmeli istemci ve ağ erişimi sunucusu arasında kullanılacak protokol olarak tanımlanmıştır.

Kimlik Doğrulama

VPN bağlantılarında kimlik doğrulama üç farklı biçimde yapılır:

PPP kimlik doğrulama kullanılarak kullanıcı düzeyinde kimlik doğrulama
VPN bağlantısı oluşturmak için, VPN sunucusu bağlanmayı deneyen VPN istemcisinin kimliğini, Noktadan Noktaya Protokolü (PPP) kullanıcı düzeyinde kimlik doğrulama yöntemi kullanarak doğrular ve VPN istemcisinin uygun yetkilendirmeye sahip olduğunu onaylar. Karşılıklı kimlik doğrulama kullanılırsa, VPN istemcisi de VPN sunucusunun kimliğini doğrular; bu şekilde kendilerini VPN sunucuları gibi tanıtan bilgisayarlara karşı koruma sağlanır.

Internet Anahtar Değişimi (IKE) kullanarak bilgisayar düzeyinde kimlik doğrulama

Internet Protokolü güvenliği (IPsec) güvenlik ilişkisi oluşturmak üzere VPN istemcisi ve VPN sunucusu, bilgisayar sertifikaları veya önceden paylaşılan bir anahtar değişimi için IKE protokolünü kullanır. Her iki durumda da VPN istemcisi ve sunucusu, birbirlerinin kimliklerini bilgisayar düzeyinde doğrular. Bilgisayar sertifikası kimlik doğrulaması çok daha güçlü bir kimlik doğrulama yöntemi olduğundan daha fazla önerilir. Bilgisayar düzeyinde kimlik doğrulama yalnızca L2TP/IPsec bağlantıları için uygulanır.

Veri kaynağı için kimlik doğrulama ve veri bütünlüğü

VPN bağlantısı üzerinden gönderilen verinin, bağlantının diğer ucundan gönderilmiş olduğunu ve aktarım sırasında değiştirilmediğini onaylamak için, veride yalnızca gönderenin ve alanın bildiği bir şifreleme anahtarına dayalı şifreleme sağlama toplamı bulunur. Veri kaynağı için kimlik doğrulama ve veri bütünlüğü yalnızca L2TP/IPsec bağlantılarında kullanılabilir.

Veri şifreleme

Veriler, paylaşılan veya ortak geçiş ağından çapraz geçer ve gizliliğin sağlanması için gönderici tarafından şifrelenir. Daha sonra bu şifreler, alan tarafından çözümlenir. Şifreleme ve alan tarafından şifre çözme işlemi, göndericinin ve alanın kullandığı şifreleme anahtarına bağlıdır.

VPN bağlantısı üzerinden veri transferi yapıldığında şifreleme anahtarı olduğu için bilgiler ele geçirilse bile dışarıdaki için bir anlam ifade etmez. Ayrıca şifreleme anahtarının uzunluğu da güvenlik anlamında önemli bir faktördür. Çünkü şifreleme anahtarını belirlemek adına hesaplama işlemleri yapıldığında bu tür metotlar, şifreleme anahtarı büyüdüğünde daha uzun hesaplama zamanı alır. Bu yüzden güvenliği sağlamak adına, yani veriyi mümkün olduğu kadar gizli tutmak amacıyla şifreleme anahtarını mümkün olan en büyük boyutta seçmek veya kullanmak önemli bir faktördür.

VPN Tünel Protokolleri

Tünel oluşturma, bir protokol türündeki paketin başka bir protokol datagramı içinde kapsüllenmesini sağlar. Örneğin, VPN, IP paketlerini Internet gibi ortak bir ağ üzerinden kapsüllemek için PPTP'yi kullanır. Noktadan Noktaya Tünel Protokolü (PPTP), Katman İki Tünel Protokolü (L2TP) veya Güvenli Yuva Tünel Protokolü'ne (SSTP) dayalı bir VPN çözümü yapılandırılabilir.

PPTP, L2TP ve SSTP protokolleri büyük ölçüde, orijinal olarak Noktadan Noktaya Protokolü (PPP) için belirlenen özellikleri esas alır. PPP çevirmeli veya adanmış noktadan noktaya bağlantılar üzerinden veri göndermek için tasarlanmıştır. IP kullanımında, PPP, IP paketlerini PPP çerçeveleri içinde kapsüller ve ardından kapsüllenen PPP paketlerini noktadan noktaya bir bağlantı üzerinden aktarır. PPP orijinal olarak çevirmeli istemci ve ağ erişimi sunucusu arasında kullanılacak protokol olarak tanımlanmıştır.

PPTP

PPTP, birden çok protokol trafiğinin şifrelenmesini ve ardından IP ağı veya Internet gibi ortak IP ağı üzerinden gönderilmek üzere bir IP üst bilgisi ile kapsüllenmesini sağlar. PPTP uzaktan erişim ve siteden siteye VPN bağlantıları için kullanılabilir. Internet, VPN için ortak ağ olarak kullanıldığında, PPTP sunucusu, biri Internet üzerinde diğeri de intranet'te bulunan iki arabirime sahip PPTP etkin bir VPN sunucusudur.

PPTP, ağ üzerinden aktarım yaptığında PPP çerçevelerini IP datagramları içerisinde kapsüller. PPTP, tünel yönetimi için Genel Yönlendirme Kapsüllemesi‘nin (GRE) değiştirilmiş bir sürümünü kullanır. Ayrıca kapsüllenen PPP çerçeveleri şifrelenebilir veya sıkıştırılabilir.

PPP çerçevesi, MS-CHAPv2 veya EAP-TLS kimlik doğrulama işlemiyle oluşturulan şifreleme anahtarları kullanılarak, Microsoft Noktadan Noktaya Şifreleme (MPPE) ile şifrelenir. PPP çerçeve yüklerinin şifrelenebilmesi için, sanal özel ağ istemcilerinin MS-CHAP v2 veya EAP-TLS kimlik doğrulama protokolünü kullanması gerekir. PPTP, temeldeki PPP şifrelemesinden ve önceden şifrelenen PPP çerçevesinin kapsüllenmesinden yararlanır.

L2TP

L2TP birden çok protokol trafiğinin şifrelenmesini ve ardından IP veya zaman uyumsuz aktarım modu (ATM) gibi noktadan noktaya datagram teslimini destekleyen herhangi bir medya üzerinden gönderilmesini sağlar. L2TP, Cisco Systems, Inc. tarafından geliştirilen, PPTP ve Katman İki İletme (L2F) protokollerinin birleşiminden oluşan bir teknolojidir. L2TP, PPTP ve L2F'nin en iyi özelliklerini alır.

PPTP'nin aksine, Microsoft'un L2TP uygulaması, PPP datagramlarının şifrelenmesinde MPPE'yi kullanmaz. L2TP, şifreleme hizmetleri için Aktarım Modunda Internet Protokolü güvenliğine (IPsec) dayanır. L2TP ve IPsec'in birleşimi L2TP/IPsec olarak bilinir.

L2TP/IPsec paketlerinin kapsüllenmesi iki katmandan oluşmaktadır. Birinci katman, PPP çerçevesi L2TP ve UDP üst bilgisiyle sarılmaktadır. İkinci katman ise Ipsec güvenlik yükü dediğimiz (ESP) üst bilgi ve alt bilgi olmak üzere iletiyi ve kimlik doğrulamayı destekleyen Ipsec kimlik doğrulama alt bilgisi ve IP üst bilgisiyle sarılır. IP üst bilgisinde VPN sunucusuna karşılık gelen IP adresi yer almaktadır.

SSTP

Güvenli Yuva Tüneli Protokolü (SSTP), 443 numaralı TCP bağlantı noktası üzerinden HTTPS protokolünü kullanan yeni bir tünel protokolüdür ve trafiğin güvenlik duvarlarından ve PPTP ile L2TP/IPsec trafiğini engelleyebilen Web proxy'lerden geçirilmesini sağlar. SSTP, PPP trafiğini HTTPS protokolünün Güvenli Yuva Katmanı (SSL) kanalı üzerinde kapsüllemek için bir mekanizma sağlar. PPP'nin kullanılması, EAP-TLS gibi etkili kimlik doğrulama yöntemlerinin desteklenmesine olanak sağlar. SSL, gelişmiş anahtar anlaşması, şifreleme ve bütünlük denetimi kullanarak aktarma düzeyinde güvenlik sağlar.

Bir istemci SSTP tabanlı VPN bağlantısı oluşturmaya çalışırsa, SSPT ilk olarak, SSTP sunucusunda çift yönlü bir HTTPS katmanı oluşturur. Protokol paketleri bu HTTPS katmanı üzerinden veri yükü olarak geçer.

Tünel Protokolleri Arasında Seçim Yapma

PPTP, L2TP/Ipsec ve SSTP ile VPN çözümlerinde dikkat edilmesi gereken hususlar:
PPTP, Microsoft işletim sistemleriyle birlikte (Microsoft 2000, WindowsXP, Windows Vista vb.) ve aynı zamanda farklı Microsoft istemcileriyle kullanılabilir. PPTP, L2TP/Ipsec gibi ortak anahtar altyapısı (PKI) kullanımını gerektirmez. Bunun üzerine PPTP, veri akışındaki güvenliği sağlar, yani veri bir başkasının eline geçtiğinde şifreleme anahtarı olmadan ulaşılamaz. Fakat veriler, PPTP tabanlı VPN bağlantılarının akış sırasıda verilerin değişimi konusunda ve kimlik doğrulama, yani veriyi gönderen kişinin yetkili kullanıcı olup olmadığı konularında kanıt sağlayamaz.
L2TP/Ipsec, sadece Microsoft 2000, Windows XP ve Windows Vista ve üstü çalıştıran bilgisayarlarla kullanılabilir. L2TP/Ipsec, kimlik doğrulama yöntemi için önceden paylaşılan anahtarları veya bilgisayar sertifikalarını sağlar. Kimlik doğrulama kısımında bilgisayar sertifikalarını sağlamak için PKI’ya başvurur. L2TP/Ipsec, VPN bağlantıları kimlik doğrulama, veri gizliliği ve veri bütünlüğü için IPsec'i kullanır.
SSTP, Windows Vista Service Pack 1 (SP1) veya Windows Server 2008 ve üstü işletim sistemleriyle çalışan bilgisayarlarda kullanılır. SSTP VPN bağlantılarında SSL kullanılarak veri gizliliği, kimlik doğrulaması ve veri bütünlüğü sağlanır.

Ayrıca, bu üç tünel türünde de kimlik doğrulama, İnternet Protokolü sürüm 4 (Ipv4) ve İnternet Protokolü 6 (Ipv6) antlaşması ve ağ erişim koruması (NAP) gibi PPP özellikleri, bu üç tünelde de değişmez bir kıstastır.

Snort, 1998 yılında Martin Roesch tarafından geliştirilmiş bir ağ sızma tespit/engelleme sistemidir. GNU lisansı ile dağıtılan, açık kaynak kodlu ve ücretsiz bir yazılımdır. Yazılım, çeşitli Linux dağıtımları, Windows ve MAC gibi pek çok işletim sistemi üzerinde çalıştırılabilmektedir. Snort yazılımını temel alarak grafik arayüz desteği ile çalışacak şekilde geliştirilen bağımsız şirket yazılımları da mevcuttur. Bu yazılımlar yönetim, raporlama, günlükleme (loglama) gibi işlevleri yerine getirmektedir.

Snort'un mimarisi performans, basitlik ve esnekliğe dayalıdır. Snort IP ağları üzerinde gerçek zamanlı trafik analizi ve paket loglaması yapabilen bir yazılımdır. Yazılım protokol analizi, içerik tarama/eşleme yapabildiği gibi, arabellek taşması, port taraması, CGI saldırısı, işletim sistemi parmakizi denemesi gibi pek çok saldırı ve zararlı/şüpheli yazılım çeşidini tespit edebilmektedir. Snort üzerinden geçen trafiği tanımlamak için kullanıcı tarafından da tanımlanabilen esnek kural dilini kullanır; bunun yanı sıra modüler takma-program (plug-in) mimarisini kullanan tespit motoru da bulunmaktadır. Snort'un gerçek zamanlı alarm mekanizması vardır. Bu mekanizma Windows istemcilerine WinPopup pencereleri çıkarabilir, Linux türevlerinde alarm mekanizmalarını syslog'a dahil edebilir, ya da özelleştirilmiş günlük dosyasında alarmları biriktirebilir.

Snort mimarisinin 3 temel bileşeni vardır: paket çözücü, tespit motoru ve günlükleme/alarm altsistemi. Snort temel olarak uygulama seviyesine kadar tüm katmanlardaki veriye bakar ve bu veri içerisinden belirli trafiği toplar; kullanıcı ya da geliştirici tarafından tanımlanabilen kural setlerini uygulayarak bulduklarını değerlendirir.

Snort temelde 3 ayrı modda çalışabilecek şekilde yapılandırılabilir:

Paket İzleyici modu (packet sniffer): Bu mod tcpdump paket izleyici programı gibi basit bir şekilde ağdan paketleri okuyup sürekli bir şekilde konsola akıttığı moddur. Konut satırında
  • ./snort -v
şeklinde çalıştırılabilir; bu şekilde sadece TCP paket başlık bilgilerini ekrana basar.

Paket Günlükleme modu (packet logger): paketleri diske yazar. Komut satırında
  • ./snort -dev -l ./log
komutu ile çalıştırılabilir. Burada TCP paket başlık ile birlikte paket bilgilerini de kaydeder ve /log dizinine günlükler.

Ağ Sızma Tespit/Engelleme Sistemi modu (NIDS/NIPS): Snort'un en karmaşık ve yapılandırılabilir modudur. Snort bu modda temel olarak trafiği analiz edip kullanıcı tarafından tanımlanabilen bir kural seti ile gördüklerine karşı çeşitli eylemler gerçekleştirebilir. Örneğin komut satırında
  • ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
ile çalıştırıldığında snort temel bir NIDS olarak çalışır ve snort.conf dosyasındaki kural seti uyarınca işlem yapar. Eğer snort "inline" modda çalıştırılırsa (./snort -Q) snort IPS olarak davranır ve drop paket düşürme (drop) kurallarını da devreye alır.

Kuralları Yazmak

Snort kuralları basit bir şekilde yazılabilmesine rağmen zararlı/şüpheli trafiği tespit etmede oldukça başarılıdır.

Snort kuralları mantıksal olarak iki kısma ayrılmaktadır: kural başlığı ve kural opsiyonları. Kural başlığı kural eylemini, protokolü, kaynak IP adresi, hedef IP adresi, alt ağ maskeleri ile kaynak ve hedef port bilgilerini içerir. Kural opsiyonu ise kural eylemi takınılacaksa paketin hangi kısımlarının inceleneceğini belirler. Kural eylemi 8 şekilde olabilir:
  • Pass (Geçir): Paketi basit bir şekilde geçirilir
  • Log (Günlükle): Günlükleme rutini kullanıcı tarafından ne tanımlandı ise tam paket olarak kaydedilir.
  • Alert (Alarm): Kullanıcı tarafından belirlenen metotla bir olay bildirisi yaratır ve tüm paketi günlükler.
  • Activate (Etkinleştir): Alarm ver ve ardından başka bir dinamik kuralı etkinleştirir.
  • Dynamic (Dinamik): Bir etkinleştir kuralı etkinleştirinceye kadar boşta kalır, sonra günlükle olarak çalışır.
  • Drop (Düşür): Paketi düşür ve günlükler.
  • Reject (Reddet): Paketi engeller, günlükler, protokol TCP ise TCP yeniden başlat (TCP reset)ya da ICMP port erişilemez mesajı yollar.
  • Sdrop (Günlüklemeden Düşür): Paketi düşürür ve günlüklemez.

Örnek Bir Snort Kuralı

Aşağıda örnek olarak bir alarm kuralı gösterilmiştir:
  • alert tcp any any ? 10.1.1.5 80 (content: "cgi-bin/phf" ; msg "PHF probe!";)
Örnek kuralımızı detaylı olarak inceleyelim:
  • alert - kural eylemi: alarm ver
  • tcp - protokol
  • any - kaynak IP, herhangi bir IP adresinden
  • any - kaynak port, herhangi bir porttan
  • 10.1.1.5 - hedef IP adresi
  • 80 - hedef port 
  • content: -"cgi-bin/phf" - mesaj içeriğinde "cgi-bin/phf" var ise
  • msg "PHF probe!" - PHF probe! Alarmı ver.Kural setleri periyodik olarak Snort geliştirici grup tarafından Snort resmi web sitesinden yayınlandığı gibi, kurallar kullanıcılar tarafından da oluşturulabilmektedir.

Snort Kurulumu

Snort kurulumunu gerçekleştirmeden önce Snort'un düzgün çalışması için bir takım paketlerin kurulması gereklidir.
  • # apt-get update
  • # apt-get install -y build-essential
  • # apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev
  • # apt-get install -y bison flex
  • # apt-get install -y zlib1g-dev
komutları ile gerekli kurulumları gerçekleştirelim.
  • # wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
komutu ile Snort'un kullandığı ağ kütüphanesi olan Daq kütüphanesini indirelim.
  • # tar -xvzf daq-2.0.6.tar.gz
  • # cd daq-2.0.6
  • # ./configure
  • # make
  • # make install
komutları ile Daq kütüphanesini kuralım.
  • # wget https://www.snort.org/downloads/snort/snort-2.9.7.6.tar.gz
komutu ile Snort'u indirelim.
  • # cd ..
  • # tar -xvzf snort-2.9.7.6.tar.gz
  • # cd snort-2.9.7.6
  • # ./configure --enable-sourcefire
  • # make
  • # make install
komutları ile Snort'u kuralım.

Not! Snort'un en güncel sürümü için https://www.snort.org/ sitesini ziyaret edebilirsiniz.

Scapy, network ağları için özelleştirilmiş paketler üretmeye yarayan python ile yazılmış bir kütüphanedir. Scapy ile aynı zamanda network tarama ve analiz işlemleri yapabiliriz. Scapy python ile yazıldığı için ilgili uygulamalar kuruluğu zaman (python, nmap, Vpython, pcap v.b) Windows ve Linux sistemler ile komut satırından sorunsuz bir şekilde çalışır, platform bağımlılığı yoktur. Scapy’i diğer programlardan (nmap, hping v.s) ayıran özelliği esnek bir yapıya sahip olmasıdır. Esnek yapıdan kastımız ise bu programlar size tasarımcısının sunduğu özellikleri kullanmanızı sağlarken, scapy ile bunların yanında kendi ihtayıcınıza özel TCP/IP paketlerini oluşturarak bu paketler ile networkünüzü analiz edebilirsiniz. ARP paketleri oluşturarak sisteminize arpspoofing testleri yapabilirsiniz.

Scapy Kurulumu
  • $ cd /tmp 
  • $ wget --trust-server-names scapy.net       # veya wget -O scapy.zip scapy.net 
  • $ unzip scapy-x.x.x.zip 
  • $ cd scapy 
  • $ sudo python setup.py install
komutları ile kurulum gerçekleştirilir.

Scapy'i Başlatmak
  • Sudo Scapy
komutu ile scapy başlatılır.

Scapy Kullanımı

Öncelikle Scapy’nin Python 2’de çalıştığını bilmemiz gerekmektedir. Yani Python’ın 3.x versiyonları için geliştirilmiş bir kütüphane değildir. Bunu ek bir not olarak belirtmekte fayda var. Scapy’i Python 3.x sürümlerinde de kullanabilmek için Github’da bazı repositoryler mevcut fakat, ne kadar sağlıklı çalışır onu bilemem. Bu sebepten dolayı örneklerimiz hep Python 2.x sürümleri için geçerli olacaktır. Bu bilgiler ışığında lafı daha fazla uzatmadan Scapy kütüphanemizi aşağıdaki gibi import edelim.
  • from scapy.all import *
Bu aşamadan sonra artık Scapy kütüphanemizi programlarımızda kullanabiliriz. İlk olarak herhangi bir paketin nasıl oluşturulup bir değişkene atılabileceğinden ve daha sonra da Scapy’nin bize sağlamış olduğu çeşitli fonksiyonlarından bahsedelim.
Yazının bu aşaması artık tamamen örnekler üzerinden gidecektir.
  • ethernet_frame = Ether()
  • ethernet_frame.show()
Yukarıdaki örnekte ethernet_frame adında bir değişkene Ether() sınıfından bir Ethernet nesnesi oluşturarak Ethernet paketini atamış olduk. Evet cümlenin birazcık tuhaf olduğunun farkındayım, fakat durum tam olarak böyle. Bu değişkenin içeriğine bakmak için ise daha sonra yine Scapy’nin bize sağlamış olduğu bu nesnenin show() metodunu kullandık. Çıktımız ise aşağıdaki gibidir.
###[ Ethernet ]###
  • dst = ff:ff:ff:ff:ff:ff
  • src = xx:xx:xx:cb:ed:cd
  • type = LOOP
gördüğünüz gibi burada dst, src ve type şeklinde üç adet değişken var. İşte biz Scapy’nin bize sağladığı esneklik sayesinde bu değişkenleri istediğimiz gibi değiştirebiliyoruz. Bu da bize farklı farklı network paketleri oluşturup çeşitli toolları geliştirmemize olanak sağlıyor. Burada dst kısmına istediğiniz bir MAC adresini yazıp paketinizi o mac adresine gönderebilirsiniz. Bu paket gönderme kısmının örneklerine de yazının ilerleyen kısımlarında anlatacağım. Şimdi de bu değişkenleri nasıl değiştireceğimize bir bakalım.
  • ethernet_frame = Ether()
  • ethernet_frame.src = "aa:bb:cc:dd:ee:ff"
  • ethernet_frame.show()
Çıktımız ise aşağıdaki gibidir.
###[ Ethernet ]###
  • dst = ff:ff:ff:ff:ff:ff
  • src = aa:bb:cc:dd:ee:ff #değişen kısım
  • type = LOOP
Örnekte de görüldüğü gibi source mac adresi değişkeni, oluşturduğumuz cihazın ağ kartının default mac adresinden farklı olarak bizim atadığımız bir değerledeğişmiştir. Normalde böyle bir durum olmaz, fakat scapy bize bu imkanı sunmuştur. Bu mantıkla bu ethernet frame’nin diğer değerlerini de değiştirebilirsiniz. Fakat bu değerleri protokolün yapısındaki mantığa göre doldurmanız gerekmektedir. Gider mac adresi kısmına IP adresi atarsanız veya başka bir değer atarsanız, o zaman bu paketler düzgün bir şekilde çalışmayacaktır. Şimdi de bir IP paketinin yapısına bakalım.
  • ip_packet = IP()
  • ip_packet = show()
Çıktımız ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 64
  • proto = hopopt
  • chksum = None
  • src = 127.0.0.1
  • dst = 127.0.0.1
  • \options \
Gördüğünüz gibi IP paketinin içindeki tüm değişkenler görülmektedir. Aslında dikkat ederseniz bu değişkenler IP Headerındaki alanların aynısı. Biz burada IP Header’ı içindeki alanları kendi isteğimize göre değiştirme işlemini yapıyoruz. Aşağıdaki örneği inceleyelim.
  • ip_packet = IP()
  • ip_packet.src = "192.168.1.2"
  • ip_packet.dst = "192.168.1.11"
  • ip_packet.ttl = 128
  • ip_packet.show()
Çıktımız ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 128 #Değiştirdiğimiz kısım
  • proto = hopopt
  • chksum = None
  • src = 192.168.1.2 #Değiştirdiğimiz kısım
  • dst = 192.168.1.11 #Değiştirdiğimiz kısım
  • \options \
paketlerin içerisindeki alanların nasıl değiştirildiği mantığını anladığınızı ümmit ediyorum. Scapy’nin desteklediği tüm protokolleri görmek için ls() fonksiyonunu kullanabilirsiniz. Bu fonksiyon sonrası çıkan tüm protokolleri <protokol_adı>.show() şeklinde görüntüleyip, yukarıdaki örneklerde yaptığımız gibi içeriğini değiştirebilirsiniz. Şimdi ise değiştirdiğimiz bu paketleri nasıl göndereceğimizi inceleyelim.

Scapy'de Paket Gönderme ve Veriyi İşleme

Artık bir paketi nasıl manipüle edebileceğimizi biliyoruz, fakat takdir edersiniz ki amacımız sadece bir protokolün içeriğini manipüle etmek değil, aynı zamanda bu manipüle edilmiş paketi göndermektir. Bunun için Scapy bize temel olarak 6 adet fonksiyon kullanma imkanı sağlamıştır. Aşağıda bu fonksiyonları görmekteyiz;
  • send()
  • sendp()
  • sr()
  • sr1()
  • srp()
  • srp1()
işte bu fonksiyonları yazacağımız scriptler içerisinde etkin bir şekilde kullanırsak ve nasıl davrandıklarını bilirsek, çok ama çok önemli bir yol kat etmişiz demektir. Şimdi sırası ile bu fonksiyonları örnekler ile inceleyelim.

send()

Bu fonksiyon sayesinde oluşturduğumuz paketleri cihazımızdaki ethernet kartı veya wireless kartı vasıtası ile iletim ortamına gönderebiliyoruz. Aşağıdaki örneği inceleyelim.
  • send(IP(dst="192.168.10.14", src="192.168.10.62")/ICMP()/"Scapy")
şimdi bu kodu yazıp scriptimizi sudo <programadi>.py olarak çalıştırdığımızda bize şu şekilde bir çıktı verecektir.
  • .
  • Sent 1 packets.
Buradan anlıyoruz ki, kodumuz sağlıklı bir şekilde çalışmış. Aşağıda bu kodun Wireshark ile dinlenmiş hali gözükmektedir.



Tamam buraya kadar her şey güzel fakat, burada syntax açısından biraz farklılıklar var. Kısaca buna değinmekte fayda var. Sadece tek bir protokol yerine birden fazla protokolden oluşan bir network paketini oluşturmak içinTCP/IP protocol yapısını bilmek gerekir. Mesela HTTP isteği sadece HTTP datasından ibaret değildir. Öncelikle bu HTTP datasını kapsülleyen bir TCP datagramı, bu datagramı kapsülleyen IP paketi, IP paketini kapsülleyen bir Ethernet frame’i vardır. Yani yapı şu şekildedir. Ethernet > IP > TCP > HTTP data . Dolayısıyla Scapy’de de paketlerimizi oluştururken bu yapıya dikkat etmemiz gerekmektedir. Örneğimize geri dönecek olursak protokol başlıklarını sırası ile sonuna () koyarak ekledik. Daha sonra / işaretini de kapsülleyici olarak kullandık. Mesela IP() ile ilk olarak IP paketimizin başlığını eklemiş olduk. Daha sonra parametre verme mantığı ile source ve destination adreslerini src ve dst değişkenlerini kullanarak örnekteki gibi değiştirdik. Daha sonra ICMP() ile ICMP başlığını ekledik. Bu ICMP başlığının payload kısmına da verimizi yerleştirdik. Bu kapsülleme işlemlerini de hep / işareti ile yaptık. Tüm bu işlemlerden sonra artık içinde Scapy yazan bir ICMP paketi oluşmuş oldu. Bizim amacımız bu paketi göndermekti. İşte bu paketi de send() fonksiyonumuzun içine yazarak göndermiş olduk. Genel olarak süreç ve yapı bu şekildedir. Gerisi teferruattur. Şimdi aşağıdaki örneğimizi inceleyelim.
  • send(IP(dst="192.168.10.14")/ICMP()/"Scapy", loop=1, inter=0.2, verbose=False)
Burada dikkat ettiyseniz IP başlığı içinde src= kısmını belirtmedik. Böyle bir durumda Scapy otomatik olaraksizin o an bulunduğunuz networkteki aldığınız IP adresini src= kısmına atar. Daha sonra loop=1 ile bu send() fonksiyonumuzu sonsuz bir döngüye sokuyoruz. Yani biz programı durdurana kadar 192.168.10.14 ip adresli cihaza bu ICMP paketini gönder diyoruz. Sonrasında inter=0.2 parametresi ile her gönderilen paket arasında 0.2 saniye kadar bekle diyoruz. Yani bu paketleri 0.2 saniye aralıkları ile gönder. verbose=False ile de, bu paketleri gönderirken ekrana gereksiz çıktı verme diyoruz. Evet bu tek satırlık kod parçası aslında network güvenliğinde ICMP Flood saldırısına olanak vermektedir. Tabi tek bir cihaz ile bu saldırıyı yapmanız oldukça zordur, fakat dağıtık bir yapıda saldırının gücü artacaktır. Aşağıdaki wireshark görüntüsü bu kodun çalışma yapısına ışık tutmaktadır.

sendp()

Bu fonksiyonumuz ise temel olarak, send() fonksiyonu ile aynı görevi üstlenmektedir. Fakat aralarındaki temel fark şudur; send() fonksiyonu ile Layer 3 düzeyinde işlemler yapabilirsiniz, Layer 2(802.3, 802.11, 802.1q, 802.15..) yani bu örnekteki Ethernet çerçevesinde değişiklik yapamazsınız, bu değerler otomatik olarak Scapy tarafından(dolaylı yoldan işletim sistemi tarafından) doldurulur. Fakat sendp() fonksiyonu ile Layer 2 katmanında da paketlerinizi manipüle edebilirsiniz. Yani Ethernet çerçevesinde istediğiniz değişikliği yapabilirsiniz. Şimdi bu teorik bilgiden sonra aşağıdaki kodumuzu inceleyelim.
  • sendp(Ether(src="aa:bb:cc:dd:ee:ff")/IP(dst="192.168.10.14")/ICMP()/"Scapy", count=10, inter=0.2, verbose=False)
Burada gördüğünüz üzere ICMP paketimizin Ethernet çervesindeki source mac adresini src değişkeni vasıtasıyla aa:bb:cc:dd:ee:ff olarak değiştirdik. Bu kodun yazılı olduğu programı çalıştırdığımız vakit, source mac adresi, ağ kartımızın default mac adresinden farklı olan bir ICMP paketi iletim ortamına salınacaktır. Peki kaç defa gönderilecektir bu paket? Tabiki 10 defa, bunu da count=10 parametresi ile sağladık.

sr()

Şimdiye kadar oluşturduğumuz paketlerimizi sadece iletim ortamına göndermekle yetindik. Fakat sadece göndermek bizim için yeterli değil, ağ kartımıza gelen paketleri de değerlendirmek en az göndermek kadar önemlidir. Aslında biz yukarıdaki örneklerde ICMP paketi gönderdirdiğimiz de, cevap olarak bize ICMP Reply paketi gelmektedir, fakat biz o ICMP Reply paketini göremedik ve dolayısıyla o ICMP Reply paketini işleyemedik. İşte bu ICMP Reply paketi gibi bizim ağ kartımızdan gönderdiğimiz pakete cevap olarak gelen paketleri sr() fonksiyonu ile işleme alabiliyoruz. Aynı zamanda sr() fonksiyonu ile paketlerimizi iletim ortamına da gönderedebiliriz. Yani ayrıca send() fonksiyonunu kullanmamıza gerek yoktur.
sr'nin açılımı send and recieve'dir

Aşağıdaki örneği inceleyelim.
  • ans, unans = sr(IP(dst="cyberkod.com")/TCP(sport=9898, dport=80, flags= 'S')) 
  • for send, recieve in ans:
  • send.show()
  • print("--")
  • recieve.show()
Çıktısı ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 64
  • proto = tcp
  • chksum = None
  • src = 192.168.10.63
  • dst = 192.30.252.153
  • \options \
  • ###[ TCP ]### 
  • sport = 9898
  • dport = http
  • seq = 0
  • ack = 0
  • dataofs = None
  • reserved = 0
  • flags = S
  • window = 8192
  • chksum = None
  • urgptr = 0
  • options = {}
--
###[ IP ]###
  • version = 4L
  • ihl = 5L
  • tos = 0x0
  • len = 44
  • id = 0
  • flags = DF
  • frag = 0L
  • ttl = 46
  • proto = tcp
  • chksum = 0xc52c
  • src = 192.30.252.153
  • dst = 192.168.10.63
  • \options \
  • ###[ TCP ]### 
  • sport = http
  • dport = 9898
  • seq = 3181249471
  • ack = 1
  • dataofs = 6L
  • reserved = 0L
  • flags = SA
  • window = 28720
  • chksum = 0xb805
  • urgptr = 0
  • options = [('MSS', 1436)]
Peki biz şimdi burada ne yaptık? Öncelikle S flagi işaretli bir TCP datagramını cyberkod.com adresine 9898 port numaralı soketten gönderdik. Bu gönderme işlemini de sr() fonksiyonunu kullanarak yaptık. Fakat dönen sonucu tek bir değişkene değilde 2 farklı değişkene atadık. Bunlardan ans, gönderilip cevap alınan paket çiftini içermektedir. unans ise, gönderilip cevap alınamayan paketin kendisini içerir. Yani bir ICMP paketi gönderdiniz ama ICMP reply paketi gelmedi, işte bu durumda unans değişkeni içinde göndermiş olduğunuz ICMP paketi olur. Diğer değişkenimiz olan ans değişkeninde ise başarılı bir şekilde gönderilmiş olan ICMP paketi ve o pakete karşılık gelen ICMP reply paketi bulunmaktadır. Bu şekilde aklınızda tutabilirsiniz. Tabi bu örnekte biz TCP datagramı gönderdiğimiz için, ans değişkeni içinde ICMP ve ICMP reply paketleri yerine TCP SYN ile TCP SYN-ACK datagramlarını ihtiva edecektir. Daha sonra bu ans değişkenini bir for döngüsüne sokarak, paketlerin içeriğini show() metodu vasıtasıyla ekrana bastırdık. Özetle sr() fonksiyonu bir paket göndermemizi ve gönderilip, alınan bu paketlerin bir değişkende toplanmasını sağlamaktadır.
sr1()

Bu fonksiyonumuz ise paket gönderip sadece dönen cevabı bir değişkene atama işlemini gerçekleştirmektedir. Yani bir ICMP paketi gönderdiniz, eğer başarılı bir şekilde paketiniz gitti ise dönen ICMP reply paketini bir değişkende saklayabilirsiniz. Yok başarılı bir şekilde gitmedi ise bundan haberdar da olamazsınız. Çünkü sr() fonksiyonunda olduğu gibi bir unans değeri döndürmez. Aşağıdaki örneği inceleyelim.
  • recieved = sr1(IP(dst="google.com")/ICMP())
  • recieved.show()
Çıktısı ise şu şekildedir.
###[ IP ]###
  • version = 4L
  • ihl = 5L
  • tos = 0x0
  • len = 28
  • id = 0
  • flags = 
  • frag = 0L
  • ttl = 54
  • proto = icmp
  • chksum = 0xfb52
  • src = 172.217.17.206
  • dst = 192.168.10.63
  • \options \
  • ###[ ICMP ]### 
  • type = echo-reply
  • code = 0
  • chksum = 0x0
  • id = 0x0
  • seq = 0x0
srp() ve srp1() fonksiyonlarını ayrı bir başlık altında incelemeyeceğim. Mantık aynı send() ve sendp()fonksiyonlarında olduğu gibidir. Yani srp() fonksiyonun sr() fonksiyonundan tek farkı Layer 2 katmınında manipülasyon yapmanıza olanak vermesidir.

sniff()

Yazının sonlarına doğru değinmezsem içimde kalır dediğim bir fonksiyondur sniff() fonksiyonu. Bu fonksiyon sayesinde ağ kartınıza gelen paketleri dinleyip bir değişkene çok kolay bir şekilde atayabilirsiniz. İçerisine gireceğiniz çeşitli filtreler ile spesifik paketleri dinleyebilirsiniz. Örnekleri inceleyelim.
  • pkts = sniff(filter="arp", count=5)
  • pkts.summary()
Çıktısı şu şekildedir.
  • Ether / ARP who has 192.168.10.147 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.148 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.149 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.150 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.151 says 192.168.10.1 / Padding
Aslında burada yaptığımız şey çok basit. Sniff() fonksiyonundan filter="arp" parametresi vasıtası ile toplam 5 adet arp paketi dinlemesini istedik. Bu fonksiyonumuzda bu paketleri dinledi ve pkts değişkenine atadı. Bu paketlere isterseniz tek tek de ulaşıp, içeriklerini aşağıdaki gibi görüntüleyebilirsiniz.
  • pkts = sniff(filter="arp", count=5)
  • pkts[0].show()
Hatta bu görüntüledeğimiz paketi sendp(pkts[0]) şeklinde gönderedebilirsiniz.

Basit Scapy Komutları

ACK Scan

Using Scapy’s powerful packet crafting facilities we can quick replicate classic TCP Scans. For example, the following string will be sent to simulate an ACK Scan:
  • >>> ans, unans = sr(IP(dst="www.slashdot.org")/TCP(dport=[80,666],flags="A")) 
We can find unfiltered ports in answered packets:
  • >>> for s,r in ans: ... if s[TCP].dport == r[TCP].sport: ... print str(s[TCP].dport) + " is unfiltered" 
Similarly, filtered ports can be found with unanswered packets:
  • >>> for s in unans: ... print str(s[TCP].dport) + " is filtered" 

Xmas Scan

Xmas Scan can be launched using the following command:
  • >>> ans, unans = sr(IP(dst="192.168.1.1")/TCP(dport=666,flags="FPU") ) 
Checking RST responses will reveal closed ports on the target.

IP Scan

A lower level IP Scan can be used to enumerate supported protocols:
  • >>> ans, unans = sr(IP(dst="192.168.1.1",proto=(0,255))/"SCAPY",retry=2) 
ARP Ping

The fastest way to discover hosts on a local ethernet network is to use the ARP Ping method:
  • >>> ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2) 
Answers can be reviewed with the following command:
  • >>> ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") ) 
Scapy also includes a built-in arping() function which performs similar to the above two commands:
  • >>> arping("192.168.1.*") 
ICMP Ping

Classical ICMP Ping can be emulated using the following command:
  • >>> ans, unans = sr(IP(dst="192.168.1.1-254")/ICMP()) 
Information on live hosts can be collected with the following request:
  • >>> ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") ) 
TCP Ping

In cases where ICMP echo requests are blocked, we can still use various TCP Pings such as TCP SYN Ping below:
  • >>> ans, unans = sr( IP(dst="192.168.1.*")/TCP(dport=80,flags="S") ) 
Any response to our probes will indicate a live host. We can collect results with the following command:
  • >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") ) 
UDP Ping

If all else fails there is always UDP Ping which will produce ICMP Port unreachable errors from live hosts. Here you can pick any port which is most likely to be closed, such as port 0:
  • >>> ans, unans = sr( IP(dst="192.168.*.1-10")/UDP(dport=0) ) 
Once again, results can be collected with this command:
  • >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") ) 
Classical attacks

Malformed packets:
  • >>> send(IP(dst="10.1.1.5", ihl=2, version=3)/ICMP()) 
Ping of death (Muuahahah):
  • >>> send( fragment(IP(dst="10.0.0.5")/ICMP()/("X"*60000)) ) 
Nestea attack:
  • >>> send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*10)) >>> send(IP(dst=target, id=42, frag=48)/("X"*116)) >>> send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*224)) 
Land attack (designed for Microsoft Windows):
  • >>> send(IP(src=target,dst=target)/TCP(sport=135,dport=135))

Traceroute açık kaynak kodlu bir ağ analizi yazılımıdır. Traceroute programı 1987 yılında Van Jacobson tarafından yazılmıştır. Traceroute programı, TCP/IP ağlarında kaynak bilgisayardan hedef bilgisayara giden paketlerin hangi rotayı takip ettiğinin anlaşılması ve bu rotalardan geçerken meydana gelen gecikmelerin görülebilmesini sağlayan bir ağ aracıdır. Traceroute programı tüm unix/Linux ve Microsoft Windows tabanlı işletim sistemlerinde bulunur. Microsoft Windows işletim sistemlerinde bu aracın adı "tracert" olarak geçmektedir. Traceroute programın çalışabilmesi için veri paketinin üzerinden geçtiği hostlarda herhangi ek özelliğin bulunmasına gerek yoktur. IPv6 desteği (traceroute6) vardır.

Çalışma sistemi

Traceroute; IP başlığındaki TTL (time-to-live) alanını ve ICMP (Internet Control Message Protocol) kullanır.

TTL, IP başlığının (IP header) dokuzuncu baytında yer alır ve 8 bitlik bir alana sahiptir. TTL'in başlangıç değeri, IP paketinin oluşturulduğu işletim sistemi tarafından belirlenir. TTL değeri işletim sisteminden işletim sistemine farklılık göstermektedir. TTL değeri, IP paketinin üzerinden geçtiği her hop tarafından "bir" azaltılır. IP başlığındaki TTL alanının amacı, IP paketlerinin ağlarda sonsuz dolaşımının önüne geçmektir. Bir yönlendirici, TTL alanı 0 ya da 1 olan bir IP paketi almış ise bu paketi düşürür, başka bir yere yönlendirmez ve kaynak bilgisayara "ICMP TTL time exceeded” mesajı gönderir. "TTL time exceeded" mesajı ICMP başlığında "Type 11" ve "Code 0" değerlerini alacak şekilde tanımlanmıştır.

Linux işletim sistemine sahip olan bilgisayarlarda "traceroute" komutu, hedef bilgisayara UDP datagramları gönderir. Linux işletim sistemine sahip bilgisayarlar bunun yanı sıra, hedef bilgisayarlara "ICMP Echo Request" mesajları ya da TCP SYN segmentleri de gönderebilirler. Windows işletim sistemine sahip olan bilgisayarlar hedef bilgisayarlara UDP datagramları yerine "ICMP Echo Request" mesajları gönderirler.

"Traceroute" programı, hedef bilgisayara ilk olarak TTL alan değeri "1" olan üç adet paket gönderir. TTL değeri "1" yapılmış olan IP paketlerini alan birinci yönlendirici, bu paketleri bir sonraki -ikinci- yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. "ICMP TTL time exceeded" mesajını alan kaynak bilgisayar bu sefer TTL değeri "2" olan üç adet IP paketini hedef bilgisayara gönderir. Bu paketleri alan birinci yönlendirici TTL değerini "1" düşürerek "1" yaparak ikinci yönlendiriciye iletir. İkinci yönlendirici TTL değeri "1" olan IP paketlerini bir sonraki yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. Kaynak bilgisayar bu sefer TTL değer "3" olan üç adet paketi hedefe gönderir. İlk iki yönlendirici, yine TTL değerlerini "1" düşürerek IP paketlerini üçüncü yönlendiriciye iletir. Üçüncü yönlendirici yönlendirici TTL değeri "1" olan IP paketlerini bir sonraki yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. Bu durum hedef bilgisayara ulaşana kadar TTL değeri "1" artırılarak devam eder. Kaynak bilgisayar tarafından üretilen üç adet IP paketi son olarak hedefe ulaştığında bu sefer hedef bilgisayar kaynak bilgisayar tarafından gönderilmiş olan bu IP paketlerine cevap verir. Bu şekilde hedef bilgisayara ulaşana kadar hangi "hop"lardan geçildiği "traceroute" ile tespit edilir.

Kaynak bilgisayar Windows işletim sistemine sahipse hedef bilgisayara "ICMP Echo Request" mesajları göndermiştir. (Type: 8, Code:0) Bu ICMP mesajları hedef bilgisayara ulaştığında hedef bilgisayar bu mesajlara ICMP Echo Reply mesajıyla cevap verir. (Type: 0, Code:0)[8]

Kaynak bilgisayar Linux işletim sistemine sahipse hedef bilgisayara, hedef portunun kullanılmadığı düşünülen bir UDP datagram'ı gönderir. (Örneğin 29082 numaralı UDP portu hedef port olarak belirlenir.) Hedef bilgisayar bu UDP datagram'ını alır. 29082 numaralı portu açık olmadığı için de kaynak bilgisayara "ICMP Destination Port Unreachable" mesajını göndrerir. (Type: 3, Code: 3)

Kullanım Yerleri

Trauceroute ağda sorun gidermek için kullanılır. Kaynak IP adresinden hedef IP adresine doğru gidilecek rota üzerinde yönlendirme problemlerinin tespit edilmesini sağlar. Ayrıca hedef IP adresine doğru giderken geçilen hostlara verilen IP adreslerini görmeye ve ağ altyapısı hakkında bilgi sahibi olmak için kullanılır.


Yük dengeleme; işi, iki ya da daha fazla bilgisayar, işlemci, sabit disk ya da diğer kaynaklar arasında paylaştırma teknolojisidir. Bu teknolojiyi kullanarak en iyi kaynak kullanımı, en yüksek işlem hacmi, en düşük cevap süresi sağlanabilir; oluşabilecek aşırı yüklemeden (overload) kurtulunabilir.
Tek bileşen kullanmak yerine, yük dengeleme ile birden fazla bileşen kullanımı yedekleme (redundancy) sayesinde güvenilirliği artırabilir.
Yük dengeleme genellikle adanmış bir yazılım ya da donanım aygıtı (DNS, Multilayer switch vb.) kullanılarak sağlanır.
Yük dengeleme genellikle bilgisayar grupları (computer cluster) arasındaki iç iletişimi sağlamak amacıyla kullanılır.
Yük dengeleme kullanılan birden fazla bileşen ile yedekliliği sağlar. Bir yönlendirici (router) belirli bir ağ için birden fazla rota öğrendiğinde, yönlendirme tablosundaki (routing table) en düşük yönetimsel uzunluk (Administrative Distance - AD) değerine sahip rotayı seçer. Yönetimsel uzunlukların eşit olması durumunda ise metriklere bakacaktır. Yönetimsel uzunluk ve metrik değerlerinin eşit olması durumunda 3. Katman yük dengeleme oluşur. Ayrıca IGRP (Interior Gateway Routing Protocol - Dahili Ağ Geçidi Yönlendirme Protokolü) ve EIGRP (Enhanced Interior Gateway Routing Protocol - Geliştirilmiş Dahili Ağ Geçidi Yönlendirme Protokolü) protokoller eşit maliyetli (cost) olmayan yük dengelemeyi de destekler.

Etherchannel Yük Dengeleme Yöntemi

Birincil ve yedek hatlar mantıksal olarak tek bir hat gibi kullanıldığı yük dengeleme yöntemi “etherchannel”dır. İki ağ cihazı arasındaki hat kapasitesini artırmaya yarar. Ağ cihazlarının etherchannel yaptırılan portları tek port gibi kullanılır.Etherchannel yapılan portlarda verinin hangi yolu tercih edeceğini belirlemek için iki yöntem vardır:
  • Yalnızca tek bir değişkene göre belirlenebilir. (Kaynak mac adresi, hedef mac adresi, kaynak IP (InternetProtocol - İnternet Protokolü) adresi, hedef IP adresi, kaynak port, hedef port)
  • İki değişkene göre belirlenebilir. (Kaynak/hedef mac adresi, kaynak/hedef IP adresi, kaynak/hedef port)

3. Katmanda Yük Dengeleme

3. katmanda yük dengeleme iki şekilde uygulanabilir:
  • Hedefe göre (per- destination) : Yönlendirici paketleri hedef adreslerine göre dağıtır. Aynı ağa 2 yol olması durumunda o ağdaki hedef1 için gelen bütün paketler ilk yoldan, hedef2 için gelen bütün paketler de diğer yoldan gönderilir ve böyle devam eder. Aynı ağdaki farklı kullanıcılar için farklı rotalar kullanılmış olur. Hedef adreslerinin fazla olması bağlantıların eşit kullanılmasını sağlar. Her adres için rota önbellek girdisi (route-cache entry) hazırlanır. Bu nedenle hedefe göre yük dengelemede hafıza ve işlem gereksinimi çok fazla olur; binlerce kullanıcıya trafik taşıyan yönlendiriciler için uygun değildir.
  • Pakete göre (per-packet) : Pakete göre yük dengelemede yönlendiriciye hedef1 için gelen ilk paket ilk yoldan, ikinci paket de ikinci yoldan vb. şekilde gönderilir. Her paketin iletim sürecinde çıkış arayüzüne bakılır ve en az kullanılmış bağlantı yönlendirme tablosundan seçilir. Bu linklerin eşit kullanımını sağlar fakat işlemci üzerinde yoğun görev ve iletim performansında düşmeye yol açar. Ayrıca paketlerin hedefe, farklı gecikme süreleri nedeniyle sırası bozulmuş olarak varmasına neden olabilir. Bu tür yük dengeleme yüksek hızlı olması gereken arayüzler için uygun değildir.
Hedefe ve pakete göre yük dengeleme ip paketleri için kullanılan anahtarlama planlarıdır. Hedefe göre yük dengeleme kullanılacak arayüzde hızlı anahtarlama uygulanması gereklidir.

İnternet Servislerinde Yük Dengeleme

Yük dengelemenin en genel kullanım alanı sunucu çiftliği olarak bilinen, birçok sunucu kullanarak bir tane internet servisi sağlamaktır. Bu internet servisi genellikle popüler web siteleri, yüksek bant genişliğine sahip dosya aktarım iletişim kuralı siteleri, NNTP sunucusu, DNS sunucusu, mali işlemler gibi çalışması kritik uygulamalardır.
Yük dengeleyici genellikle bir yazılımdır. İstemcilerle iletişime geçer ve gelen isteği cevap vermesi için herhangi bir zamanlama algoritması kullanarak seçtiği arka uç sunucusuna iletir. Sanal ip adrese (VIPs) sahiptir. Bu yöntemde istemciler arka uç sunucularla direk iletişime geçmediği için ağ yapısı ve diğer portlar üzerinde koşan bağımsız servisler üzerine gelebilecek saldırılar engellenir.
Yük dengeleyici kullanılarak oluşturulan yük dengeleme sisteminde, arka uç sunucularından birinde bir problem olduğunda sistem çalışmasına devam ederken; yük dengeleyicide bir problem olduğunda sistem tamamen çalışmaz hale gelir.
Çözümlerden bir diğeri, Round Robind DNS olarak adlandırılan, adanmış yazılım ya da donanım gerektirmeyen metotdur. Tek bir Alan adı (www.example.org) ile birden çok IP adresi eşleştirilerek gerçekleştirilir. DNS sunucusu gelen isteklere, Round Robin algoritmasını kullanarak tanımlanan sunuculardan bir tanesini atar. İstemci arka uç sunucuların varlığını bildiğinden dolayı teknolojiden haberdardır. Teknoloji DNS nin getirdiği tüm avantaj ve dezavantajlara sahiptir.

Kalıcı Veriler

Bir kullanıcının istekleri boyunca oturum bilgilerinin nasıl tutulacağı önemlidir. Eğer bilgiler yerel olarak arka uç sunuculardan birinde tutulursa, izleyen istekte diğer bir arka uç sunucusuna gittiğinde bilgiler bulunamaz. Bu, tekrar kullanılacak bilgileri saklama gereksinimini ortaya çıkarır.
Çözümlerden biri, "Persistence" olarak da bilinen aynı istemciden gelen tüm istekleri aynı sunucuya yönlendirmektir. Fakat arka uç sunucularından birinde bir problem oluştuğunda o sunucu üstündeki tüm verileri tüm veriler kaybedilir.
Diğer çözüm oturum bilgilerini veritabanında tutmaktır. Veri tabanı yükü arttıkça performans düşüşü oluştuğundan dolayı veriler kısa süreli tutulacaksa tercih edilir.

Nftables, ağ paketlerinin, ağ datagramlarının, ağ çerçevelerinin filtrelenmesini ve sınıflandırılmasını sağlayan Linux çekirdeğinin bir alt sistemidir. 
Linux çekirdeği 3.13'te çalışır. 
Iptables'in yeni sürümü olarak görülebilir ancak söz dizimi iptables'tan farklıdır. Aynı zamanda iptables komutlarının da çalıştırılmasına izin verilen bir uyumluluk modu vardır. 
En önemli yeniliği kural sayısını çok fazla azaltmasıdır.

Nftables Kurulumu
  • sudo apt-get install nftables
komutu ile kurulum gerçekleştirilir.

Nfrables Tablo(Table), Zincir(Chain), Kural(Rule) Kavramları
  • Tablo, belirli bir semantik içermeyen bir zincirler konteynırını ifade eder.
  • Bir tablodaki zincir, bir kurallar konteynırını ifade eder.
  • Kural, bir zincir içinde yapılandırılacak bir eylemi ifade eder.

Nftables Tablo İşlemleri

Tablo Oluşturmak, Silmek, Flush İşlemleri
  • nft (add | delete | flush) table [<family>] <isim>
Var Olan Tabloları Listeletmek
  • nft list tables [<family>]
  • nft list table [<family>] <name> [-n] [-a]
Family bu tablo türlerinden birine karşılık gelir: ip, arp, ip6, bridge, inet, netdev.
-n argümanı, adresleri ve diğer bilgileri gösterir. -a argümanı, handle'ı görüntülemek için kullanılır.

Nftables Zincir İşlemleri

Zincir Ekleme ve Oluşturma
  • nft (add | create) chain [<family>] <table> <name> [ { type <type> hook <hook> [device <device>] priority <priority> \; [policy <policy> \;] } ] 
Zincir Silme ve Var Olan Zicirleri Listeleme
  • nft (delete | list | flush) chain [<family>] <table> <name> 
Zincirin İsmini Değiştirme
  • nft rename chain [<family>] <table> <name> <newname>

type parametresi oluşturulacak zincirin türünü belirtir.
  • filter : Arp, bridge, IP, IPv6 ve inet tarafından desteklenir.
  • route : Çıkış işlemleri için kullanılır. IP VE IPv6 tarafından desteklenir.
  • nat : Ağ adresi çevirisi gerçekleştirmek için kullanılır. IP ve IPv6 tarafından desteklenir.
hook parametresi çekirdekte işlenecek paketlerin aşamasını belirtir.
  • IP, IPv6 ve inet için hook, prerouting, input, forward, output, postrouting.
  • Arp için hook, input, output.
  • Bridge için hook, köprü aygıtlarını geçen ethernet paketlerini yönetir.
  • Netdev için hook, ingress.
priority, Zincirleri sipariş etmek veya bazı Netfilter işlemleri arasında ayarlamak için kullanılan bir numarayı belirtir. Olası değerler:
  • NF_IP_PRI_CONNTRACK_DEFRAG (-400)
  • NF_IP_PRI_RAW (-300)
  • NF_IP_PRI_SELINUX_FIRST (-225)
  • NF_IP_PRI_CONNTRACK (-200)
  • NF_IP_PRI_MANGLE (-150)
  • NF_IP_PRI_NAT_DST (-100)
  • NF_IP_PRI_FILTER (0)
  • NF_IP_PRI_SECURITY (50)
  • NF_IP_PRI_NAT_SRC (100)
  • NF_IP_PRI_SELINUX_LAST (225)
  • NF_IP_PRI_CONNTRACK_HELPER (300)
policy, parametresi zincirde ki paketlere ne yapılacağını belirtir. Olası değerler:
  • accept (Kabul Et)
  • drop (DÜşür)
  • queue (Kuyruk)
  • continue (Devam)
  • return (Geri Dön)

Nftables Kural İşlemleri

Kural Ekleme
  • nft add rule [<family>] <table> <chain> <matches> <statements> 
Araya Kural Ekleme
  • nft insert rule [<family>] <table> <chain> [position <position>] <matches> <statements> 
Kural Değiştirme
  • nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements> 
Kural Silme
  • nft delete rule [<family>] <table> <chain> [handle <handle>]
handle parametresi belirli bir kuralı tanımlayan dahili bir sayıdır.

position parametresi belirli bir handle'dan önce bir kural eklemek için kullanılan dahili bir sayıdır.

Matches Parametresi

Ip
ip match
dscp <value>
ip dscp cs1
ip dscp != cs1
ip dscp 0x38
ip dscp != 0x20
ip dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, 
af22, af23, af31, af32, af33, af41, af42, af43, ef}
length <length>Total packet length
ip length 232
ip length != 233
ip length 333-435
ip length != 333-453
ip length { 333, 553, 673, 838}
id <id>IP ID
ip id 22
ip id != 233
ip id 33-45
ip id != 33-45
ip id { 33, 55, 67, 88 }
frag-off <value>Fragmentation offset
ip frag-off 222
ip frag-off != 233
ip frag-off 33-45
ip frag-off != 33-45
ip frag-off { 33, 55, 67, 88 }
ttl <ttl>Time to live
ip ttl 0
ip ttl 233
ip ttl 33-55
ip ttl != 45-50
ip ttl { 43, 53, 45 }
ip ttl { 33-55 }
protocol <protocol>Upper layer protocol
ip protocol tcp
ip protocol 6
ip protocol != tcp
ip protocol { icmp, esp, ah, comp, udp, udplite, tcp, dccp, sctp }
checksum <checksum>IP header checksum
ip checksum 13172
ip checksum 22
ip checksum != 233
ip checksum 33-45
ip checksum != 33-45
ip checksum { 33, 55, 67, 88 }
ip checksum { 33-55 }
saddr <ip source address>Source address
ip saddr 192.168.2.0/24
ip saddr != 192.168.2.0/24
ip saddr 192.168.3.1 ip daddr 192.168.3.100
ip saddr != 1.1.1.1
ip saddr 1.1.1.1
ip saddr & 0xff == 1
ip saddr & 0.0.0.255 < 0.0.0.127
daddr <ip destination address>Destination address
ip daddr 192.168.0.1
ip daddr != 192.168.0.1
ip daddr 192.168.0.1-192.168.0.250
ip daddr 10.0.0.0-10.255.255.255
ip daddr 172.16.0.0-172.31.255.255
ip daddr 192.168.3.1-192.168.4.250
ip daddr != 192.168.0.1-192.168.0.250
ip daddr { 192.168.0.1-192.168.0.250 }
ip daddr { 192.168.5.1, 192.168.5.2, 192.168.5.3 }
version <version>Ip Header version
ip version 4
hdrlength <header length>IP header length
ip hdrlength 0
ip hdrlength 15

Ip6

ip6 match
dscp <value>
ip6 dscp cs1
ip6 dscp != cs1
ip6 dscp 0x38
ip6 dscp != 0x20
ip6 dscp {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, af11, af12, af13, af21, af22, af23, af31, af32, af33, af41, af42, af43, ef}
flowlabel <label>Flow label
ip6 flowlabel 22
ip6 flowlabel != 233
ip6 flowlabel { 33, 55, 67, 88 }
ip6 flowlabel { 33-55 }
length <length>Payload length
ip6 length 232
ip6 length != 233
ip6 length 333-435
ip6 length != 333-453
ip6 length { 333, 553, 673, 838}
nexthdr <header>Next header type (Upper layer protocol number)
ip6 nexthdr {esp, udp, ah, comp, udplite, tcp, dccp, sctp, icmpv6}
ip6 nexthdr esp
ip6 nexthdr != esp
ip6 nexthdr { 33-44 }
ip6 nexthdr 33-44
ip6 nexthdr != 33-44
hoplimit <hoplimit>Hop limit
ip6 hoplimit 1
ip6 hoplimit != 233
ip6 hoplimit 33-45
ip6 hoplimit != 33-45
ip6 hoplimit {33, 55, 67, 88}
ip6 hoplimit {33-55}
saddr <ip source address>Source Address
ip6 saddr 1234:1234:1234:1234:1234:1234:1234:1234
ip6 saddr ::1234:1234:1234:1234:1234:1234:1234
ip6 saddr ::/64
ip6 saddr ::1 ip6 daddr ::2
daddr <ip destination address>Destination Address
ip6 daddr 1234:1234:1234:1234:1234:1234:1234:1234
ip6 daddr != ::1234:1234:1234:1234:1234:1234:1234-1234:1234::1234:1234:1234:1234:1234
version <version>IP header version
ip6 version 6

Tcp

tcp match
dport <destination port>Destination port
tcp dport 22
tcp dport != 33-45
tcp dport { 33-55 }
tcp dport {telnet, http, https }
tcp dport vmap { 22 : accept, 23 : drop }
tcp dport vmap { 25:accept, 28:drop }
sport < source port>Source port
tcp sport 22
tcp sport != 33-45
tcp sport { 33, 55, 67, 88}
tcp sport { 33-55}
tcp sport vmap { 25:accept, 28:drop }
tcp sport 1024 tcp dport 22
sequence <value>Sequence number
tcp sequence 22
tcp sequence != 33-45
ackseq <value>Acknowledgement number
tcp ackseq 22
tcp ackseq != 33-45
tcp ackseq { 33, 55, 67, 88 }
tcp ackseq { 33-55 }
flags <flags>TCP flags
tcp flags { fin, syn, rst, psh, ack, urg, ecn, cwr}
tcp flags cwr
tcp flags != cwr
window <value>Window
tcp window 22
tcp window != 33-45
tcp window { 33, 55, 67, 88 }
tcp window { 33-55 }
checksum <checksum>IP header checksum
tcp checksum 22
tcp checksum != 33-45
tcp checksum { 33, 55, 67, 88 }
tcp checksum { 33-55 }
urgptr <pointer>Urgent pointer
tcp urgptr 22
tcp urgptr != 33-45
tcp urgptr { 33, 55, 67, 88 }
doff <offset>Data offset
tcp doff 8

Udp

udp match
dport <destination port>Destination port
udp dport 22
udp dport != 33-45
udp dport { 33-55 }
udp dport {telnet, http, https }
udp dport vmap { 22 : accept, 23 : drop }
udp dport vmap { 25:accept, 28:drop }
sport < source port>Source port
udp sport 22
udp sport != 33-45
udp sport { 33, 55, 67, 88}
udp sport { 33-55}
udp sport vmap { 25:accept, 28:drop }
udp sport 1024 tcp dport 22
length <length>Total packet length
udp length 6666
udp length != 50-65
udp length { 50, 65 }
udp length { 35-50 }
checksum <checksum>UDP checksum
udp checksum 22
udp checksum != 33-45
udp checksum { 33, 55, 67, 88 }
udp checksum { 33-55 }

Udplite

udplite match
dport <destination port>Destination port
udplite dport 22
udplite dport != 33-45
udplite dport { 33-55 }
udplite dport {telnet, http, https }
udplite dport vmap { 22 : accept, 23 : drop }
udplite dport vmap { 25:accept, 28:drop }
sport < source port>Source port
udplite sport 22
udplite sport != 33-45
udplite sport { 33, 55, 67, 88}
udplite sport { 33-55}
udplite sport vmap { 25:accept, 28:drop }
udplite sport 1024 tcp dport 22
checksum <checksum>Checksum
udplite checksum 22
udplite checksum != 33-45
udplite checksum { 33, 55, 67, 88 }
udplite checksum { 33-55 }

Sctp

sctp match
dport <destination port>Destination port
sctp dport 22
sctp dport != 33-45
sctp dport { 33-55 }
sctp dport {telnet, http, https }
sctp dport vmap { 22 : accept, 23 : drop }
sctp dport vmap { 25:accept, 28:drop }
sport < source port>Source port
sctp sport 22
sctp sport != 33-45
sctp sport { 33, 55, 67, 88}
sctp sport { 33-55}
sctp sport vmap { 25:accept, 28:drop }
sctp sport 1024 tcp dport 22
checksum <checksum>Checksum
sctp checksum 22
sctp checksum != 33-45
sctp checksum { 33, 55, 67, 88 }
sctp checksum { 33-55 }
vtag <tag>Verification tag
sctp vtag 22
sctp vtag != 33-45
sctp vtag { 33, 55, 67, 88 }
sctp vtag { 33-55 }

Dccp

dccp match
dport <destination port>Destination port
dccp dport 22
dccp dport != 33-45
dccp dport { 33-55 }
dccp dport {telnet, http, https }
dccp dport vmap { 22 : accept, 23 : drop }
dccp dport vmap { 25:accept, 28:drop }
sport < source port>Source port
dccp sport 22
dccp sport != 33-45
dccp sport { 33, 55, 67, 88}
dccp sport { 33-55}
dccp sport vmap { 25:accept, 28:drop }
dccp sport 1024 tcp dport 22
type <type>Type of packet
dccp type {request, response, data, ack, dataack, closereq, close, reset, sync, syncack}
dccp type request
dccp type != request

Ah

ah match
hdrlength <length>AH header length
ah hdrlength 11-23
ah hdrlength != 11-23
ah hdrlength {11, 23, 44 }
reserved <value>
ah reserved 22
ah reserved != 33-45
ah reserved {23, 100 }
ah reserved { 33-55 }
spi <value>
ah spi 111
ah spi != 111-222
ah spi {111, 122 }
sequence <sequence>Sequence Number
ah sequence 123
ah sequence {23, 25, 33}
ah sequence != 23-33

Esp

esp match
spi <value>
esp spi 111
esp spi != 111-222
esp spi {111, 122 }
sequence <sequence>Sequence Number
esp sequence 123
esp sequence {23, 25, 33}
esp sequence != 23-33

Comp

comp match
nexthdr <protocol>Next header protocol (Upper layer protocol)
comp nexthdr != esp
comp nexthdr {esp, ah, comp, udp, udplite, tcp, tcp, dccp, sctp}
flags <flags>Flags
comp flags 0x0
comp flags != 0x33-0x45
comp flags {0x33, 0x55, 0x67, 0x88}
cpi <value>Compression Parameter Index
comp cpi 22
comp cpi != 33-45
comp cpi {33, 55, 67, 88}

Icmp

icmp match
type <type>ICMP packet type
icmp type {echo-reply, destination-unreachable, source-quench, redirect, echo-request, time-exceeded, parameter-problem, timestamp-request, timestamp-reply, info-request, info-reply, address-mask-request, address-mask-reply, router-advertisement, router-solicitation}
codeICMP packet code
icmp code 111
icmp code != 33-55
icmp code { 2, 4, 54, 33, 56}
checksum <value>ICMP packet checksum
icmp checksum 12343
icmp checksum != 11-343
icmp checksum { 1111, 222, 343 }
id <value>ICMP packet id
icmp id 12343
icmp id != 11-343
icmp id { 1111, 222, 343 }
sequence <value>ICMP packet sequence
icmp sequence 12343
icmp sequence != 11-343
icmp sequence { 1111, 222, 343 }
mtu <value>ICMP packet mtu
icmp mtu 12343
icmp mtu != 11-343
icmp mtu { 1111, 222, 343 }
gateway <value>ICMP packet gateway
icmp gateway 12343
icmp gateway != 11-343
icmp gateway { 1111, 222, 343 }

Icmpv6

icmpv6 match
type <type>ICMPv6 packet type
icmpv6 type {destination-unreachable, packet-too-big, time-exceeded, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, nd-redirect, parameter-problem, router-renumbering}
code <code>ICMPv6 packet code
icmpv6 code 4
icmpv6 code 3-66
icmpv6 code {5, 6, 7}
checksum <value>ICMPv6 packet checksum
icmpv6 checksum 12343
icmpv6 checksum != 11-343
icmpv6 checksum { 1111, 222, 343 }
id <value>ICMPv6 packet id
icmpv6 id 12343
icmpv6 id != 11-343
icmpv6 id { 1111, 222, 343 }
sequence <value>ICMPv6 packet sequence
icmpv6 sequence 12343
icmpv6 sequence != 11-343
icmpv6 sequence { 1111, 222, 343 }
mtu <value>ICMPv6 packet mtu
icmpv6 mtu 12343
icmpv6 mtu != 11-343
icmpv6 mtu { 1111, 222, 343 }
max-delay <value>ICMPv6 packet max delay
icmpv6 max-delay 33-45
icmpv6 max-delay != 33-45
icmpv6 max-delay {33, 55, 67, 88}

Ether

ether match
saddr <mac address>Source mac address
ether saddr 00:0f:54:0c:11:04
type <type>
ether type vlan

Dst

dst match
nexthdr <proto>Next protocol header
dst nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp}
dst nexthdr 22
dst nexthdr != 33-45
hdrlength <length>Header Length
dst hdrlength 22
dst hdrlength != 33-45
dst hdrlength { 33, 55, 67, 88 }

Frag

frag match
nexthdr <proto>Next protocol header
frag nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp, icmp}
frag nexthdr 6
frag nexthdr != 50-51
reserved <value>
frag reserved 22
frag reserved != 33-45
frag reserved { 33, 55, 67, 88}
frag-off <value>
frag frag-off 22
frag frag-off != 33-45
frag frag-off { 33, 55, 67, 88}
more-fragments <value>
frag more-fragments 0
frag more-fragments 0
id <value>
frag id 1
frag id 33-45

Hbh

hbh match
nexthdr <proto>Next protocol header
hbh nexthdr { udplite, comp, udp, ah, sctp, esp, dccp, tcp, icmpv6}
hbh nexthdr 22
hbh nexthdr != 33-45
hdrlength <length>Header Length
hbh hdrlength 22
hbh hdrlength != 33-45
hbh hdrlength { 33, 55, 67, 88 }

Mh

mh match
nexthdr <proto>Next protocol header
mh nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }
mh nexthdr 22
mh nexthdr != 33-45
hdrlength <length>Header Length
mh hdrlength 22
mh hdrlength != 33-45
mh hdrlength { 33, 55, 67, 88 }
type <type>
mh type {binding-refresh-request, home-test-init, careof-test-init, home-test, careof-test, binding-update, binding-acknowledgement, binding-error, fast-binding-update, fast-binding-acknowledgement, fast-binding-advertisement, experimental-mobility-header, home-agent-switch-message}
mh type home-agent-switch-message
mh type != home-agent-switch-message
reserved <value>
mh reserved 22
mh reserved != 33-45
mh reserved { 33, 55, 67, 88}
checksum <value>
mh checksum 22
mh checksum != 33-45
mh checksum { 33, 55, 67, 88}

Rt

rt match
nexthdr <proto>Next protocol header
rt nexthdr { udplite, ipcomp, udp, ah, sctp, esp, dccp, tcp, ipv6-icmp }
rt nexthdr 22
rt nexthdr != 33-45
hdrlength <length>Header Length
rt hdrlength 22
rt hdrlength != 33-45
rt hdrlength { 33, 55, 67, 88 }
type <type>
rt type 22
rt type != 33-45
rt type { 33, 55, 67, 88 }
seg-left <value>
rt seg-left 22
rt seg-left != 33-45
rt seg-left { 33, 55, 67, 88}

Vlan

vlan match
id <value>Vlan tag ID
vlan id 4094
vlan id 0
cfi <value>
vlan cfi 0
vlan cfi 1
pcp <value>
vlan pcp 7
vlan pcp 3

Arp

arp match
ptype <value>Payload type
arp ptype 0x0800
htype <value>Header type
arp htype 1
arp htype != 33-45
arp htype { 33, 55, 67, 88}
hlen <length>Header Length
arp hlen 1
arp hlen != 33-45
arp hlen { 33, 55, 67, 88}
plen <length>Payload length
arp plen 1
arp plen != 33-45
arp plen { 33, 55, 67, 88}
operation <value>
arp operation {nak, inreply, inrequest, rreply, rrequest, reply, request}

Ct

ct match
state <state>State of the connection
ct state { new, established, related, untracked }
ct state != related
ct state established
ct state 8
direction <value>Direction of the packet relative to the connection
ct direction original
ct direction != original
ct direction {reply, original}
status <status>Status of the connection
ct status expected
ct status != expected
ct status {expected,seen-reply,assured,confirmed,snat,dnat,dying}
mark [set]Mark of the connection
ct mark 0
ct mark or 0x23 == 0x11
ct mark or 0x3 != 0x1
ct mark and 0x23 == 0x11
ct mark and 0x3 != 0x1
ct mark xor 0x23 == 0x11
ct mark xor 0x3 != 0x1
ct mark 0x00000032
ct mark != 0x00000032
ct mark 0x00000032-0x00000045
ct mark != 0x00000032-0x00000045
ct mark {0x32, 0x2222, 0x42de3}
ct mark {0x32-0x2222, 0x4444-0x42de3}
ct mark set 0x11 xor 0x1331
ct mark set 0x11333 and 0x11
ct mark set 0x12 or 0x11
ct mark set 0x11
ct mark set mark
ct mark set mark map { 1 : 10, 2 : 20, 3 : 30 }
expirationConnection expiration time
ct expiration 30
ct expiration 30s
ct expiration != 233
ct expiration != 3m53s
ct expiration 33-45
ct expiration 33s-45s
ct expiration != 33-45
ct expiration != 33s-45s
ct expiration {33, 55, 67, 88}
ct expiration { 1m7s, 33s, 55s, 1m28s}
helper "<helper>"Helper associated with the connection
ct helper "ftp"
[original | reply] bytes <value>
ct original bytes > 100000
ct bytes > 100000
[original | reply] packets <value>
ct reply packets < 100
[original | reply] saddr <ip source address>
ct original saddr 192.168.0.1
ct reply saddr 192.168.0.1
ct original saddr 192.168.1.0/24
ct reply saddr 192.168.1.0/24
[original | reply] daddr <ip destination address>
ct original daddr 192.168.0.1
ct reply daddr 192.168.0.1
ct original daddr 192.168.1.0/24
ct reply daddr 192.168.1.0/24
[original | reply] l3proto <protocol>
ct original l3proto ipv4
[original | reply] protocol <protocol>
ct original protocol 6
[original | reply] proto-dst <port>
ct original proto-dst 22
[original | reply] proto-src <port>
ct reply proto-src 53

Meta

meta match
iifname <input interface name>Input interface name
meta iifname "eth0"
meta iifname != "eth0"
meta iifname {"eth0", "lo"}
meta iifname "eth*"
oifname <output interface name>Output interface name
meta oifname "eth0"
meta oifname != "eth0"
meta oifname {"eth0", "lo"}
meta oifname "eth*"
iif <input interface index>Input interface index
meta iif eth0
meta iif != eth0
oif <output interface index>Output interface index
meta oif lo
meta oif != lo
meta oif {eth0, lo}
iiftype <input interface type>Input interface type
meta iiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}
meta iiftype != ether
meta iiftype ether
oiftype <output interface type>Output interface hardware type
meta oiftype {ether, ppp, ipip, ipip6, loopback, sit, ipgre}
meta oiftype != ether
meta oiftype ether
length <length>Length of the packet in bytes
meta length 1000
meta length != 1000
meta length > 1000
meta length 33-45
meta length != 33-45
meta length { 33, 55, 67, 88 }
meta length { 33-55, 67-88 }
protocol <protocol>ethertype protocol
meta protocol ip
meta protocol != ip
meta protocol { ip, arp, ip6, vlan }
nfproto <protocol>
meta nfproto ipv4
meta nfproto != ipv6
meta nfproto { ipv4, ipv6 }
l4proto <protocol>
meta l4proto 22
meta l4proto != 233
meta l4proto 33-45
meta l4proto { 33, 55, 67, 88 }
meta l4proto { 33-55 }
mark [set] <mark>Packet mark
meta mark 0x4
meta mark 0x00000032
meta mark and 0x03 == 0x01
meta mark and 0x03 != 0x01
meta mark != 0x10
meta mark or 0x03 == 0x01
meta mark or 0x03 != 0x01
meta mark xor 0x03 == 0x01
meta mark xor 0x03 != 0x01
meta mark set 0xffffffc8 xor 0x16
meta mark set 0x16 and 0x16
meta mark set 0xffffffe9 or 0x16
meta mark set 0xffffffde and 0x16
meta mark set 0x32 or 0xfffff
meta mark set 0xfffe xor 0x16
skuid <user id>UID associated with originating socket
meta skuid {bin, root, daemon}
meta skuid root
meta skuid != root
meta skuid lt 3000
meta skuid gt 3000
meta skuid eq 3000
meta skuid 3001-3005
meta skuid != 2001-2005
meta skuid { 2001-2005 }
skgid <group id>GID associated with originating socket
meta skgid {bin, root, daemon}
meta skgid root
meta skgid != root
meta skgid lt 3000
meta skgid gt 3000
meta skgid eq 3000
meta skgid 3001-3005
meta skgid != 2001-2005
meta skgid { 2001-2005 }
rtclassid <class>Routing realm
meta rtclassid cosmos
pkttype <type>Packet type
meta pkttype broadcast
meta pkttype != broadcast
meta pkttype { broadcast, unicast, multicast}
cpu <cpu index>CPU ID
meta cpu 1
meta cpu != 1
meta cpu 1-3
meta cpu != 1-2
meta cpu { 2,3 }
meta cpu { 2-3, 5-7 }
iifgroup <input group>Input interface group
meta iifgroup 0
meta iifgroup != 0
meta iifgroup default
meta iifgroup != default
meta iifgroup {default}
meta iifgroup { 11,33 }
meta iifgroup {11-33}
oifgroup <group>Output interface group
meta oifgroup 0
meta oifgroup != 0
meta oifgroup default
meta oifgroup != default
meta oifgroup {default}
meta oifgroup { 11,33 }
meta oifgroup {11-33}
cgroup <group>
meta cgroup 1048577
meta cgroup != 1048577
meta cgroup { 1048577, 1048578 }
meta cgroup 1048577-1048578
meta cgroup != 1048577-1048578
meta cgroup {1048577-1048578}


Statements

Statement, paket kuralla eşleştiğinde gerçekleştirilen eylemdir. Terminal ve terminal dışı olabilir. Belli bir kuralda, birkaç terminal dışı ifadeyi düşünebiliriz, yalnızca tek bir terminal bildirimi düşünebilirsiniz.
Statement, kural setindeki akış kontrolünü değiştirir ve paketler için politika kararları verir.
  • accept: Paketi kabul et ve kalıcı kurallar değerlendirmesini durdur.
  • drop: Paketi düşür ve kalan kuralların değerlendirmesini durdurun.
  • queue: Paketi kuyruğa al ve kalan kural değerlendirmesini durdurun.
  • continue: Bir sonraki kuralla kural seti değerlendirmesine devam edin.
  • return: Geçerli zincirden dönün ve son zincirin bir sonraki kuralı ile devam edin. Base zincirinde accept ile eş değerdir.
  • jump <chain>: <chain> ile belirtilen zincirin ilk kuralıyla devam edin. İade ifadesinin yayınlanmasının ardından bir sonraki kuralda devam edecektir.
  • goto <chain>: Jump'a benzer, ancak yeni zincirden sonra değerlendirme, goto deyimini içeren son zincirde devam edecektir.
Log
log statement
level [over] <value> <unit> [burst <value> <unit>]Log level
log
log level emerg
log level alert
log level crit
log level err
log level warn
log level notice
log level info
log level debug
group <value> [queue-threshold <value>] [snaplen <value>] [prefix "<prefix>"]
log prefix aaaaa-aaaaaa group 2 snaplen 33
log group 2 queue-threshold 2
log group 2 snaplen 33

Reject
reject statement
with <protocol> type <type>
reject
reject with icmp type host-unreachable
reject with icmp type net-unreachable
reject with icmp type prot-unreachable
reject with icmp type port-unreachable
reject with icmp type net-prohibited
reject with icmp type host-prohibited
reject with icmp type admin-prohibited
reject with icmpv6 type no-route
reject with icmpv6 type admin-prohibited
reject with icmpv6 type addr-unreachable
reject with icmpv6 type port-unreachable
ip protocol tcp reject with tcp reset
reject with icmpx type host-unreachable
reject with icmpx type no-route
reject with icmpx type admin-prohibited
reject with icmpx type port-unreachable

Counter
counter statement
packets <packets> bytes <bytes>
counter
counter packets 0 bytes 0

Limit
limit statement
rate [over] <value> <unit> [burst <value> <unit>]Rate limit
limit rate 400/minute
limit rate 400/hour
limit rate over 40/day
limit rate over 400/week
limit rate over 1023/second burst 10 packets
limit rate 1025 kbytes/second
limit rate 1023000 mbytes/second
limit rate 1025 bytes/second burst 512 bytes
limit rate 1025 kbytes/second burst 1023 kbytes
limit rate 1025 mbytes/second burst 1025 kbytes
limit rate 1025000 mbytes/second burst 1023 mbytes
Nat
nat statement
dnat <destination address>Destination address translation
dnat 192.168.3.2
dnat ct mark map { 0x00000014 : 1.2.3.4}
snat <ip source address>Source address translation
snat 192.168.3.2
snat 2001:838:35f:1::-2001:838:35f:2:::100
masquerade [<type>] [to :<port>]Masquerade
masquerade
masquerade persistent,fully-random,random
masquerade to :1024
masquerade to :1024-2048
Queue
queue statement
num <value> <scheduler>
queue
queue num 2
queue num 2-3
queue num 4-5 fanout bypass
queue num 4-5 fanout
queue num 4-5 bypass

Olayları İzleme
  • nft monitor [new | destroy]  [tables | chains | sets | rules | elements]  [xml | json]
komutu ile filtreleme olaylarını izleyebilirsiniz.


Basit IP / IPv6 Güvenlik Duvarı Örneği


flush ruleset

table firewall {
  chain incoming {
    type filter hook input priority 0; policy drop;

    # established/related connections
    ct state established,related accept

    # loopback interface
    iifname lo accept

    # icmp
    icmp type echo-request accept

    # open tcp ports: sshd (22), httpd (80)
    tcp dport {ssh, http} accept
  }
}

table ip6 firewall {
  chain incoming {
    type filter hook input priority 0; policy drop;

    # established/related connections
    ct state established,related accept

    # invalid connections
    ct state invalid drop

    # loopback interface
    iifname lo accept

    # icmp
    # routers may also want: mld-listener-query, nd-router-solicit
    icmpv6 type {echo-request,nd-neighbor-solicit} accept

    # open tcp ports: sshd (22), httpd (80)
    tcp dport {ssh, http} accept
  }
}