Yaklaşık 1 milyon IP adresini kara listeye almak için IPtables veya null yolunu kullan?


22

Bir müşterinin 1 milyondan az IP adresini (alt ağ yok) bir kara listeye koyması gereken bir durumla karşılaştım ve ağ performansı bir endişe kaynağı. IPTables kurallarının rotalardan daha az performans etkisine sahip olacağını varsaysam da, bu sadece bir varsayım.

IP adreslerini veya uzun IP adres listelerini kara listeye almak için null yönlendirme yapmak için herhangi bir sağlam kanıtı veya başka bir gerekçesi var mı? Bu durumda her şey otomatik, kullanım kolaylığı gerçekten bir sorun değil.

EDIT 26-Kasım-11

Bazı test ve geliştirmelerden sonra, bu seçeneklerden hiçbirinin işe yaramadığı anlaşılıyor. Hem rota aramalarının hem de iptables'ın kurallar arasında doğrusal aramalar yaptığı ve bu kadar fazla kuralı işlemesi çok uzun sürdüğü anlaşılıyor. Modern donanımda, 1M öğelerini iptables kara listesine koymak, sunucuyu saniyede yaklaşık 2 düzine pakete düşürüyor. Yani IPTable'lar ve boş yollar açık.

ipsetJimmy Hedman'ın önerdiği gibi, bir sette 65536'dan fazla adresi izlemenize izin vermemesi haricinde, harika olurdu, bu yüzden birisi hakkında hiçbir fikri olmadığı sürece kullanmaya bile çalışamıyorum.

Görünüşe göre bu kadar çok IP'yi engellemenin tek çözümü, uygulama katmanında dizine alınmış bir arama yapmak. Öyle değil mi?


Daha fazla bilgi:

Bu örnekte kullanım durumu, "bilinen suçluların" bir IP adresi listesinin bir web sunucusundaki statik içeriğe erişmesini engelliyor. FWIW, Apache'leri kullanarak engelleme yapmak Deny fromda aynı derecede yavaş (eğer değilse) doğrusal bir tarama yapıyor.


FYI: Son çalışma çözümü, kara listeye karşı arama yapmak için apache'nin mod_rewrite'ını bir berkeley DB haritası ile birlikte kullanmaktı. Berkeley DB'lerin endekslenmiş yapısı, listenin O (log N) performansı ile ölçeklenmesini sağladı.


5
İpset ( ipset.netfilter.org ) bu tür problemlerle başa çıkmak için daha az tasarlanmamış mı?
Jimmy Hedman

@JimmyHedman: Bunu bir cevap haline getirmelisin. Ve daha sonra her 3 yoldan bunu yaparken kıyaslama bir öneri ekleyin :)
MikeyB

Çözmeye çalıştığınız sorun hakkında biraz daha bilgi verebilir misiniz merak ediyorum? Belki 1M IP adreslerini engellemek, sorunu çözmenin yolu değildir?
SpacemanSpiff

Bu kadar adresi neden engellemek istediğinizi ve INPUT veya FORWARD trafiğini filtrelemek isteyip istemediğinizi bilmek çok yardımcı olacaktır.
Juliano

Burada ipset'in iptables kurallarını normal iptables kurallarından 11 kat daha hızlı hale getirdiğini görebilirsiniz. daemonkeeper.net/781/mass-blocking-ip-addresses-with-ipset Bu yardımın umuduyla .
Alien Torres

Yanıtlar:


15

iptables kullanmayı ve arama sayısını azaltmak için çok seviyeli bir ağaç oluşturmayı deneyin.

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

ve benzeri - iç içe geçme düzeyleri ekleme; Açıkçası, kuralları oluşturmak için otomatik bir yol gerekecektir ve yalnızca bir ya da daha fazla suçluya sahip olduğunuz ağlar için zincirlere sahip olmalısınız - bu sayede oldukça fazla yapılması gereken arama sayısını azaltabilirsiniz ve bence aslında işe yarıyor.


Güvenlik duvarı kuralı aramasının O (n) 'den O (log n)' e kadar olan zaman karmaşıklığını etkili bir şekilde azaltarak, etkili bir şekilde iptables 'da bir arama ağacı oluştururken etkili olabilir.
Zweigbergk

Bu rotaya gitmeye karar verirseniz, IP adresleri listesinden dengeli bir ikili arama ağacı oluşturmak için bir algoritma kullanmak ve ardından bu arama ağacının yapısını bir IPtables kuralı kümesi olarak bırakmak faydalı olacaktır.
Zweigbergk

@Per von Zweigbergk - gerçekten ... ya da sadece daha derin aramalar yapmanın gerekmediği ağacı erken budamak. Her ne kadar çok fazla kural yüklemeye rağmen çok zaman alacak.
pQd

Bu çok iyi bir yaklaşım. Açıkçası korumak için biraz işlem gerektiriyor, ama doğru fikir, sanırım.
tylerl

3
iptables ve ark.nın önceki hatalarından sonra pQd , Berkeley veritabanına sahip bir RewriteMap kullanarak apache'de bir çözüm uyguladım . Ama benim en hızlı mekanizmam, iptables kullanarak saniyede yaklaşık 100 kural yüklerken bir döngüde iptables kullanıyordu, ancak iptables-restore tüm kümeyi 4 saniye içinde tamamladı. Bu, birinci sınıf bir masaüstü bilgisayarda. RewriteMap mekanizması performans üzerinde belirsiz bir şekilde düşük etkiye sahiptir.
tylerl

11

Bu tam olarak ne ipsetiçindir.

Web sitesinden http://ipset.netfilter.org/ :

Eğer istersen

  • Birden fazla IP adresini veya port numaralarını saklayın ve bir dokunuşta iptables ile koleksiyonla eşleştirin;
  • iptables kurallarını performans cezası olmadan IP adreslerine veya portlara karşı dinamik olarak güncellemek;
  • Tek bir iptables kuralıyla karmaşık IP adresini ve port temelli kuralları tanımlayın ve IP kümelerinin hızından yararlanın

o zaman ipset sizin için uygun bir araç olabilir.

Netfilter çekirdek ekibi üyesi Jozsef Kadlecsik (REJECT hedefini de yazan kişi) tarafından yazılmıştır, bu yüzden aklıma gelen en iyi seçenek budur.

Son çekirdeğe bile dahil edilmiştir.


Gördüğüm kadarıyla, ipset 65k IP adreslerinde göze çarpıyor. 1M girişlerini işleyebilecek herhangi bir set türü var mı?
tylerl

7
Hash: ip set türünü kullanırsanız çok sayıda adrese sahip olabilirsiniz. 1000000'ü denedim ve performans oldukça iyiydi. Setinizi kontrol etmeden önce bir -m state --state ESTABLISHED kuralı kurarsanız, sadece çok sayıda paketle uğraşırken performansı artıracak yeni bağlantılarda seti kontrol etmenizi sağlayabilirsiniz.
Matthew Ife

Yine de, 1M adresli bir ipset'in bellek kullanımının artmaya başladığını söylemeye değer. Göre netfilter posta listesinde bu yazı ipset karma boyutu için geçerli 2015 formülü H * 40byte + (N/4 + N%4) * 4 * element sizebir 1.5m yuvası karma içinde 1M adresleri için 64MB yaklaşık geldiği. Apache / berkdb çözümünün kullanılması verileri diskte depolar ve yalnızca etkin adreslerin sayfalarını yükler.
M Conrad,

5

Bunu kendim test etmedim, ancak sorun tanımınızı duyduğumda anında " pf" (OpenBSD'den itibaren) diye düşündüm .

pfSadece aradığınız şey olabilir adres tabloları kavramı vardır .

Yaptığım çok lanetli araştırmalara göre , bunun daha iyi ölçeklendirme potansiyeline sahip görünüyor ipset. Göre Runtime Seçenekleri PF SSS bölüm ayar yapmadan kutunun, dışarı, pf destekler, varsayılan olarak tüm tablolar arasında 200.000 girişlerinin toplam 1.000 tablolar olmak üzere toplam. (Sistem <100 MB fiziksel belleğe sahipse 100,000). Bu, en azından herhangi bir faydalı düzeyde çalışıp çalışmadığını görmek için bunu denemeyi düşünmeye değer olduğuna inanmamı sağlıyor.

Tabii ki, sunucularınızı Linux üzerinde çalıştırdığınızı farz ediyorum, bu nedenle bazı işletim sistemlerini pf ile çalıştıran ayrı bir güvenlik duvarı kutusu (OpenBSD veya FreeBSD gibi) olması gerekir. Ayrıca, herhangi bir durumsal paket filtrelemeyi ortadan kaldırarak verimi artırabilirsiniz.


Müşterinin sunucu mimarisini BSD'ye dönüştürmek gerçekten bir seçenek değil. En azından kutudan düşünmek.
tylerl

2
Tüm sunucu mimarisini BSD'ye dönüştürmek zorunda kalmazsınız, gerçek sunucunun önüne koymak için bir güvenlik duvarı oluşturmak yeterli olacaktır. (Bir
VM'de

2

FIB_HASH yerine FIB_TRIE kullanarak araştırma yaptınız mı?

FIB_TRIE, ön ek sayılarınız için çok daha iyi ölçeklendirilmelidir. (/ 32'ler boş yollar hala öneklerdir, sadece çok özeldir)

Kullanmak için kendi çekirdeğinizi derlemeniz gerekebilir, ancak yardımcı olabilir.

FIB_TRIE Notları


2

Posterity için: ipsetdocs göre bir setin varsayılan boyutu 65536'dır, bu seçeneklerle değiştirilebilir.

maxelem Bu parametre tüm karma tipi setlerinin create komutu için geçerlidir. Sette saklanabilecek azami eleman sayısını belirler, varsayılan 65536. Örnek:ipset create test hash:ip maxelem 2048.

Bunu buraya henüz yorum yapamadığım için koydum.


1

Gelecekte bu sorunla karşılaşan herkes için bazı faydalı notlar:

Her şeyden önce, ihtiyacınız olmayan hiçbir trafiği analiz etmeyin. Örneğin, TCP trafiğini engelliyorsanız, yalnızca SYN paketlerini filtreleyin, böylece bağlantıya yalnızca bir kez filtre uygulayın. İsterseniz kullanabilirsiniz -m state, ancak bağlantı izlemenin performansın bir sorun olması durumunda önlemek isteyebileceğiniz kendi ek yükü vardır.

İkincisi, bir milyon kuralı iptables içine koymak uzun zaman alıyor: birkaç dakika. Bu kadar fazla varlığı izlemeniz gerekirse, muhtemelen netfliter'dan uzak tutmalısınız. Kuralların büyüklüğü fark yaratır.

Üçüncüsü, amaç doğrusal taramalardan kaçınmaktır; Fakat ne yazık ki, hem iptables hem de iproute2 doğal olarak doğrusaldır. Kurallarınızı ikili ağaç stiline bölerek çok sayıda zincire ayırabilirsiniz, bu da danışmanız gereken kural sayısını sınırlar ancak yine de iptables bu sorun için uygun değildir. İşe yarayacak , ancak değerli kaynakların kaybı.

Dördüncü ve en önemlisi, iş yükünüzü kullanıcı alanına zorlamak kötü bir fikir değil. Bu, kendi sıkı kodunuzu yazmanıza veya problem setinize göre ayarlanmış hazır bir çözüm kullanmanıza olanak sağlar. Bu soruna kendi çözümüm, belirtildiği gibi, apache'nin mod_rewrite sistemi ile tetiklenen BDB aramalarını kullanmaktı. Bu, oturum başına yalnızca bir aramayı tetikleme ve yalnızca geçerli bir istek gönderildikten sonra ek fayda sağlamıştır. Bu durumda, performans son derece hızlıydı ve engelleme listesinin maliyeti neredeyse yok denecek kadar azdı.

-j QUEUEHedefi ile birlikte kullanarak iptables ile benzer kullanıcı alanı işlemlerini yapabilirsiniz libnetfilter_queue. Bu araç, güçlü, basit ve kötü belgelenmiş. Herhangi bir resmi belgenin parçası olmayan, web üzerinde dağılmış çok sayıda ilginç materyal bulunduğundan, bulabildiğiniz kadar kaynaktan okumaya devam etmenizi öneririm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.