Showing posts with label veri haberleşmesi. Show all posts
Showing posts with label veri haberleşmesi. Show all posts
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.
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:
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 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.
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)
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)
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.
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.
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.
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.
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.
- 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.
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.
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.
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.
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.
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'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
Paket Günlükleme modu (packet logger): paketleri diske yazar. Komut satırında
- ./snort -dev -l ./log
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
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ı 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.
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!";)
- 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 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ı
- from scapy.all import *
Yazının bu aşaması artık tamamen örnekler üzerinden gidecektir.
- ethernet_frame = Ether()
- ethernet_frame.show()
###[ Ethernet ]###
- dst = ff:ff:ff:ff:ff:ff
- src = xx:xx:xx:cb:ed:cd
- type = LOOP
- ethernet_frame = Ether()
- ethernet_frame.src = "aa:bb:cc:dd:ee:ff"
- ethernet_frame.show()
###[ Ethernet ]###
- dst = ff:ff:ff:ff:ff:ff
- src = aa:bb:cc:dd:ee:ff #değişen kısım
- type = LOOP
- ip_packet = IP()
- ip_packet = show()
###[ 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 \
- ip_packet = IP()
- ip_packet.src = "192.168.1.2"
- ip_packet.dst = "192.168.1.11"
- ip_packet.ttl = 128
- ip_packet.show()
###[ 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 \
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()
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")
- .
- Sent 1 packets.
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)
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.
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)
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()
###[ IP ]###
###[ 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)]
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.
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()
###[ 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
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()
- 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
- pkts = sniff(filter="arp", count=5)
- pkts[0].show()
Basit Scapy Komutları
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"))
- >>> for s,r in ans: ... if s[TCP].dport == r[TCP].sport: ... print str(s[TCP].dport) + " is unfiltered"
- >>> for s in unans: ... print str(s[TCP].dport) + " is filtered"
Xmas Scan can be launched using the following command:
- >>> ans, unans = sr(IP(dst="192.168.1.1")/TCP(dport=666,flags="FPU") )
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)
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)
- >>> ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") )
- >>> arping("192.168.1.*")
Classical ICMP Ping can be emulated using the following command:
- >>> ans, unans = sr(IP(dst="192.168.1.1-254")/ICMP())
- >>> ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )
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") )
- >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") )
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) )
- >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") )
Malformed packets:
- >>> send(IP(dst="10.1.1.5", ihl=2, version=3)/ICMP())
- >>> send( fragment(IP(dst="10.0.0.5")/ICMP()/("X"*60000)) )
- >>> 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))
- >>> 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.
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)
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.
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:
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.
İ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ı
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
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)
- 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
Statements
| 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}
| |||
code | ICMP 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 }
| |||
| expiration | Connection 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
Reject
Counter
Limit
Nat
Queue
| 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 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 statement | |||||
|---|---|---|---|---|---|
| packets <packets> bytes <bytes> | counter
counter packets 0 bytes 0
| ||||
| 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 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 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 } }









