Zetknąłem się z sytuacją, w której klient musi umieścić na czarnej liście zestaw nieco poniżej 1 miliona pojedynczych adresów IP (bez podsieci), a wydajność sieci stanowi problem. Chociaż przypuszczam, że reguły IPTables będą miały mniejszy wpływ na wydajność niż trasy, to tylko przypuszczenie.
Czy ktoś ma jakieś solidne dowody lub inne uzasadnienie faworyzowania IPTables lub zerowego routingu jako rozwiązania dla czarnej listy długich list adresów IP? W tym przypadku wszystko jest zautomatyzowane, więc łatwość użytkowania nie jest tak naprawdę problemem.
EDYCJA 26-lis-11
Po kilku testach i pracach rozwojowych wydaje się, że żadna z tych opcji nie jest wykonalna. Wygląda na to, że zarówno przeszukiwanie trasy, jak i iptables przeszukują liniowo zestaw reguł, a przetworzenie tak wielu reguł zajmuje zbyt długo. Na nowoczesnym sprzęcie umieszczenie 1 mln pozycji na czarnej liście iptables spowalnia serwer do około 2 tuzinów pakietów na sekundę. Więc IPTables i trasy zerowe są niedostępne.
ipset
, jak zaleca Jimmy Hedman, byłoby świetnie, z tym wyjątkiem, że nie pozwala ci śledzić więcej niż 65536 adresów w zestawie, więc nie mogę nawet próbować go używać, chyba że ktoś ma jakieś pomysły.
Najwyraźniej jedynym rozwiązaniem blokującym tak wiele adresów IP jest indeksowane wyszukiwanie w warstwie aplikacji. Czy to nie tak?
Więcej informacji:
Przypadkiem użycia w tym przypadku jest blokowanie listy adresów IP znanych przestępców przed dostępem do zawartości statycznej na serwerze sieciowym. FWIW, blokowanie przez Apache'a Deny from
jest równie powolne (jeśli nie bardziej), ponieważ wykonuje również skanowanie liniowe.
FYI: Ostatnim działającym rozwiązaniem było użycie mod_rewrite apache w połączeniu z mapą DB Berkeley do wyszukiwania na czarnej liście. Zindeksowana natura baz danych Berkeley pozwoliła na skalowanie listy z wydajnością O (log N).
Odpowiedzi:
spróbuj użyć iptables i zbuduj drzewo wielopoziomowe, aby zmniejszyć liczbę wyszukiwań.
i tak dalej - dodawanie poziomów zagnieżdżania; oczywiście potrzebujesz automatycznego sposobu budowania reguł i powinieneś mieć łańcuchy tylko dla sieci, w których masz jednego lub więcej przestępców - w ten sposób możesz zmniejszyć liczbę wyszukiwań, które trzeba wykonać dość znacząco i myślę, że może faktycznie działa.
źródło
Właśnie po to
ipset
jest.Ze strony internetowej http://ipset.netfilter.org/ :
Jeśli chcesz
ipset może być dla Ciebie odpowiednim narzędziem.
Jest napisany przez członka zespołu podstawowego filtra sieci Jozsefa Kadlecsika (który również napisał cel REJECT), więc jest to najlepszy wybór, jaki mogę wymyślić.
Jest nawet zawarty w najnowszych jądrach.
źródło
H * 40byte + (N/4 + N%4) * 4 * element size
około 64 MB dla 1M adresów w mieszaniu 1,5-milimetrowym. Korzystanie z rozwiązania apache / berkdb przechowuje dane na dysku i ładuje tylko strony aktywnych adresów.Sam tego nie testowałem, ale kiedy usłyszałem opis twojego problemu, natychmiast pomyślałem „
pf
” (jak z OpenBSD).pf
ma pojęcie tabel adresowych, które mogą być właśnie tym, czego szukasz.Według niektórych bardzo pobieżnego badania zrobiłem, wydaje się, że ma potencjał do skali lepiej niż
ipset
. Według rozdziału PF FAQ na temat opcji środowiska wykonawczego , po wyjęciu z pudełka bez dostrajania, pf obsługuje w sumie 1000 tabel, domyślnie łącznie 200 000 wpisów we wszystkich tabelach. (100 000, jeśli system ma <100 MB pamięci fizycznej). To prowadzi mnie do przekonania, że warto przynajmniej spróbować przetestować to, aby sprawdzić, czy działa na jakimkolwiek użytecznym poziomie.Oczywiście zakładam, że używasz swoich serwerów w systemie Linux, więc będziesz musiał mieć oddzielne zapory ogniowe z systemem operacyjnym z pf (takim jak OpenBSD lub FreeBSD). Możesz także poprawić przepustowość, eliminując w ogóle wszelkiego rodzaju stanowe filtrowanie pakietów.
źródło
Czy korzystałeś z FIB_TRIE zamiast FIB_HASH.
FIB_TRIE powinien skalować się znacznie lepiej dla liczby prefiksów. (/ 32s trasy zerowe są nadal prefiksami, tylko bardzo specyficzne)
Może być konieczne skompilowanie własnego jądra, aby z niego korzystać, ale to pomaga.
FIB_TRIE Notes
źródło
Dla potomnych: zgodnie z
ipset
dokumentami domyślny rozmiar zestawu to 65536, można to zmienić za pomocą opcji.Umieściłem to tutaj, ponieważ nie mogę jeszcze komentować.
źródło
Kilka przydatnych uwag dla każdego, kto natknie się na ten problem w przyszłości:
Przede wszystkim nie analizuj ruchu, którego nie potrzebujesz. Jeśli na przykład blokujesz ruch TCP, filtruj tylko pakiety SYN, w ten sposób filtrujesz tylko raz dla każdego połączenia. Możesz użyć,
-m state
jeśli chcesz, ale śledzenie połączeń ma swój własny narzut, którego możesz uniknąć, jeśli problem stanowi wydajność.Po drugie, umieszczenie miliona reguł w iptables zajmuje dużo czasu: kilka minut. Jeśli chcesz śledzić tak wiele podmiotów, prawdopodobnie najlepiej trzymaj to z dala od netfliter. Sama wielkość zestawu reguł robi różnicę.
Po trzecie, celem jest uniknięcie skanowania liniowego; ale niestety zarówno iptables, jak i iproute2 są z natury liniowe. Możesz podzielić swoje reguły w stylu drzewa binarnego na dużą liczbę łańcuchów, co ogranicza liczbę reguł, z którymi musisz się zapoznać, ale nawet iptables nie są odpowiednie dla tego rozmiaru problemu. To będzie działać , ale to strata cennych zasobów.
Po czwarte, a co najważniejsze, przeniesienie obciążenia do przestrzeni użytkownika nie jest złym pomysłem. Umożliwia to pisanie własnego ścisłego kodu lub korzystanie z gotowego rozwiązania dostosowanego do zestawu problemów. Moje własne rozwiązanie tego problemu, jak wspomniano, polegało na użyciu wyszukiwania BDB wyzwalanego przez system mod_rewrite Apache. Dało to dodatkową korzyść polegającą na uruchamianiu tylko jednego wyszukiwania na sesję i dopiero po przesłaniu prawidłowego żądania. W tym przypadku wydajność była bardzo szybka, a koszt listy bloków był prawie znikomy.
Możesz wykonywać podobne operacje w przestrzeni użytkownika za pomocą iptables, używając
-j QUEUE
celu w połączeniu zlibnetfilter_queue
. To narzędzie jest wydajne, proste i słabo udokumentowane. Poleciłbym przeczytać jak najwięcej z jak największej liczby źródeł, ponieważ w sieci jest wiele interesujących materiałów, które nie są częścią żadnej oficjalnej dokumentacji.źródło