Używanie białej listy i czarnej listy w iptables
#!/bin/bash
WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt
#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F
#
## Whitelist
#
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Permitting $x..."
$IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done
#
## Blacklist
#
for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
echo "Denying $x..."
$IPTABLES -A INPUT -t filter -s $x -j DROP
done
Skrypt do otwierania portów
#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"
#
## Permitted Ports
#
for port in $ALLOWEDTCP; do
echo "Accepting port TCP $port..."
$IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
for port in $ALLOWEDUDP; do
echo "Accepting port UDP $port..."
$IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done
Blokowanie portówcan
# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
# Once the day has passed, remove them from the portscan list
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove
# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
Sfałszowane / nieprawidłowe pakiety
# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP
#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP
# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
Blokuj ataki Smerfa
# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP
# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
Blokuj ICMP (inaczej ping)
# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
iptables
w linii 8, a$IPTABLES
później. Czy wystarczy używaćiptables
wszędzie? W przeciwnym razie przypuszczam, że musisz przypisać coś takiego,IPTABLES=/sbin/iptables
prawda?Zoptymalizuj wydajność netfiltera za pomocą
ipset
Jeśli piszesz wiele podobnych reguł na podstawie samego adresu IP, portu lub obu, rozważ użycie
ipset
optymalizującego wydajność netfiltera.Na przykład:
Oznacza to, że pakiet o adresie źródłowym 192.168.251.177 musi najpierw przejść setki reguł, zanim będzie mógł uzyskać werdykt AKCEPTUJ.
Oczywiście doświadczeni administratorzy podzielą reguły według podsieci. Ale to wciąż oznacza setki zasad.
ipset
na pomoc!Najpierw zdefiniuj zestaw IP
ipmap
typu:Następnie wypełnij go adresami:
Na koniec zastąp setki powyższych reguł iptables jedną regułą:
Kiedy nadejdzie pakiet, netfilter wykona bardzo szybkie wyszukiwanie bitmapy dla źródłowego (src) adresu IP względem
Allowed_Hosts
zestawu adresów IP. Wszystkie pakiety pochodzące od 192.168.0.0/16 będą podlegały jednej regule. I wierzcie mi, że wyszukiwanie mapy bitowej jest o co najmniej dwa rzędy wielkości szybsze niż przeprowadzanie setek sprawdzania reguł w iptables.ipset
nie jest ograniczony do adresów IP. Może także dopasowywać na podstawie portów, krotki portu IP, adresów sieci / podsieci, krotki IP-MAC i tak dalej. I może pasować do tych kryteriów jako źródła lub celu lub kombinacji obu (w przypadku krotek).I na koniec,
ipset
możesz automatycznie umieszczać adresy IP na czarnych listach / białych listach. Te czarne listy / białe listy mogą również „starzeć się”, a tym samym automatycznie usuwać adres IP po upływie określonego czasu.Więcej informacji można znaleźć na
ipset
stronie podręcznika użytkownika.BARDZO WAŻNA UWAGA:
Niektóre dystrybucje Linuksa mogą nie mieć gotowej obsługi
ipset
(np. Ten problem miał Ubuntu 10.04). W tych systemach jedną metodą jest instalacjaipset
z kodu źródłowego.Zamiast tego pobierz
ipset
źródło ze strony internetowej: http://ipset.netfilter.org/install.htmlAlternatywnie, jeśli używasz
xtables-addons
, ipset znajduje się w jego źródle: http://xtables-addons.sourceforge.net/źródło
Dodaj komentarze do swoich zasad:
źródło
Blokuj dobrze znane ataki TCP
Dodaj następujące reguły, najlepiej w
-t raw -A PREROUTING
Blokowane ataki to odpowiednio:
(możesz edytować nazwy powyższych ataków)
źródło
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
Mogą być usunięte, ponieważ-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
złapie każdy pakiet może zablokować.Włączanie NAT
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Krok 1 ustawia parametr jądra, aby umożliwić przekazywanie ip, krok 2 ustanawia regułę iptables, która włącza NAT na interfejsie eth0.
źródło
/etc/sysctl.conf
net.ipv4.ip_forward = 1
. (Zakładając, że Red Hat lub pochodna.)Blokuj ataki ICMP
Dodaj następujące reguły, najlepiej w
-t raw -A PREROUTING
Pierwsza reguła blokuje wszystkie pakiety ICMP, których „flaga fragmentacji” nie jest równa 0. (ICMP nigdy nie powinien być fragmentowany; powinny one przenosić małe ładunki)
Druga reguła blokuje duże niefragmentowane pakiety ICMP.
źródło
za pomocą FireHOL - wygodnego opakowania iptables
Uważam, że jest to o wiele bardziej intuicyjne niż bezpośrednie polecenia iptables. Szczególnie dla osób z przeszłymi doświadczeniami z innymi zaporami ogniowymi:
źródło
(z mojego pliku iptables_tricks.txt, skompilowanego z wielu miejsc: P)
Sprawia, że iptables czeka 15 sekund między nowymi połączeniami z tego samego adresu IP na porcie 22 (SSH):
źródło
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
Samouczki wideo IPTABLES
Odcinek 1 http://www.youtube.com/watch?v=ldB8kDEtTZA&feature=player_embedded
Odcinek 2 http://www.youtube.com/watch?v=aDaEXxRHeXY&feature=related
Ostatni odcinek
http://www.youtube.com/watch?v=JojqHKcSxpo&feature=player_embedded
Będzie dobrym początkiem dla każdego początkującego.
źródło
Powtórzono zestawy adresów IP
Odpowiedź już wspomina o zestawach adresów IP. Jest jednak raczej jednowymiarowy, ponieważ koncentruje się na wzroście wydajności w porównaniu z klasycznymi regułami oraz na tym, że zestawy IP łagodzą problem z wieloma indywidualnymi adresami IP, których nie można łatwo wyrazić jako podsieć w notacji CIDR.
Notacja używana poniżej
Dla
ipset
będę używać notacji odczytywane przezipset restore
scenariuszipset save
.Odpowiednio do
iptables
(iip6tables
) reguł użyję notacji odczytanejiptables-restore
i napisanej przeziptables-save
. To sprawia, że notacja jest krótsza i pozwala mi wyróżnić potencjalne reguły tylko dla IPv4 (z prefiksem-4
) lub tylko z IPv6 (z prefiksem-6
).W niektórych przykładach przekierujemy przepływ pakietów na inny łańcuch. Zakłada się, że łańcuch istnieje w tym momencie, więc linie do tworzenia łańcuchów nie są tworzone (nie wymieniono też nazwy tabeli ani poleceń
COMMIT
na końcu).Zaawansowane zestawy adresów IP
Zestawy IP mogą zrobić znacznie więcej niż zostało wspomniane w drugiej odpowiedzi i zdecydowanie powinieneś przeczytać dokumentację zestawu IP (
ipset(8)
) oraziptables-extensions(8)
oprócz tego krótkiego wpisu tutaj.Na przykład skupię się głównie na trzech ustawionych typów:
hash:ip
,hash:net
ilist:set
, ale jest więcej niż tych, a wszystkie one mają ważne przypadki użycia.Możesz na przykład dopasować również numery portów, a nie tylko adresy IP .
Zapisywanie i przywracanie zestawów adresów IP jak przy pomocy
iptables-save
iiptables-restore
Można tworzyć zbiorcze deklaracje zestawu adresów IP i importować je, przesyłając je do pipety
ipset restore
. Jeśli chcesz, aby twoje polecenie było bardziej odporne na już istniejące wpisy, użyjipset -exist restore
.Jeśli Twoje reguły znajdują się w pliku o nazwie,
default.set
możesz użyć:Taki plik może zawierać wpisy do
create
zestawów iadd
wpisów do nich. Ale generalnie większość poleceń z wiersza poleceń wydaje się mieć odpowiednią wersję w plikach. Przykład (tworzenie zestawu serwerów DNS):Tutaj tworzony jest jeden zestaw dla IPv4 (
dns4
), a drugi dla IPv6 (dns6
).Przekroczono limity czasu w zestawach adresów IP
Limity czasu w zestawach IP można ustawić domyślnie dla każdego zestawu, a także dla jednego wpisu. Jest to bardzo przydatne w scenariuszach, w których chcesz tymczasowo zablokować kogoś (np. Podczas skanowania portów lub próby brutalnego użycia serwera SSH).
Sposób działania jest następujący (domyślny podczas tworzenia zestawów adresów IP):
Wrócimy do tych konkretnych zestawów poniżej i uzasadnienia, dlaczego są ustawione takimi, jakimi są.
Jeśli chcesz ustawić limit czasu dla określonego adresu IP, możesz po prostu powiedzieć:
Aby zablokować IP 1.2.3.4 na dwie godziny zamiast (ustawionego) domyślnego pół godziny.
Jeśli spojrzysz na to
ipset save ssh_dynblock4
po chwili, zobaczysz coś w rodzaju:Ograniczenia dotyczące limitu czasu
Kernel error received: Unknown error -1
.).sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))
Sprawdzanie, czy istnieje wpis w danym zestawie adresów IP
Wewnątrz skryptów przydatne może być sprawdzenie, czy pozycja już istnieje. Można to osiągnąć, przy pomocy
ipset test
którego zwracane jest zero, jeśli pozycja istnieje, a w przeciwnym razie niezerowa. Tak więc zwykłe kontrole można zastosować w skrypcie:Jednak w wielu przypadkach wolisz użyć
-exist
przełącznika, abyipset
nakazać mu nie narzekać na istniejące wpisy.Wypełnianie zestawów adresów IP z
iptables
regułTo, moim zdaniem, jest jedną z zabójczych cech zestawów IP. Nie tylko możesz dopasować do wpisów zestawu IP, ale możesz także dodawać nowe wpisy do istniejącego zestawu IP.
Na przykład w tej odpowiedzi na to pytanie masz:
... z zamiarem ograniczenia prób połączenia z SSH (port TCP 22). Używany moduł
recent
śledzi ostatnie próby połączenia. Zamiaststate
modułu wolę jednakconntrack
moduł.W tym przypadku przekierowuję przepływ do
SSH
łańcucha, tak że nie muszę powtarzać się-p tcp --dport ssh
dla każdej reguły.Powtarzać:
-m set
sprawia, żeiptables
zdaje sobie sprawę, że jesteśmy za pomocą przełączników zset
modułu (który obsługuje zestawy IP)--match-set ssh_dynblock4 src
mówi,iptables
aby dopasować adres source (src
) do nazwanego set (ssh_dynblock4
)sudo ipset test ssh_dynblock4 $IP
(gdzie$IP
zawiera źródłowy adres IP pakietu)-j SET --add-set ssh_dynblock4 src --exist
dodaje lub aktualizuje adres source (src
) z pakietu do zestawu IPssh_dynblock4
. Jeśli pozycja istnieje (--exist
), zostanie po prostu zaktualizowana.sudo ipset -exist add ssh_dynblock4 $IP
(gdzie$IP
zawiera źródłowy adres IP pakietu)Jeśli zamiast tego chcesz dopasować adres docelowy / docelowy, użyj
dst
zamiast niegosrc
. Więcej informacji znajdziesz w instrukcji obsługi.Zestawy zestawów
Zestawy IP mogą zawierać inne zestawy. Teraz, jeśli śledziłeś ten artykuł do tej pory, zastanawiasz się, czy można łączyć zestawy. I oczywiście tak jest. Dla zestawów IP z góry możemy utworzyć dwa zestawy wspólne
ssh_dynblock
issh_loggedon
odpowiednio zawierać tylko zestawy IPv4 i tylko IPv6:Kolejne pytanie, które powinno pojawić się w twojej głowie, brzmi: czy pozwala nam to dopasowywać i manipulować zestawami adresów IP w sposób niezależny od wersji IP.
Odpowiedź na to brzmi: TAK! (niestety, nie było to wyraźnie udokumentowane podczas ostatniej kontroli)
W związku z tym można przepisać zasady z poprzedniej sekcji, aby przeczytać:
co jest o wiele bardziej zwięzłe. I tak, jest to wypróbowane i przetestowane i działa jak urok.
Wszystko razem: obrona SSH przed brutalną siłą
Na moich serwerach mam skrypt uruchamiany jako
cron
zadanie, które pobiera kilka nazw hostów i przetwarza je na adresy IP, a następnie podaje je do zestawu adresów IP dla „zaufanych hostów”. Chodzi o to, że zaufani gospodarze podejmują więcej prób zalogowania się na serwerze i niekoniecznie są blokowani tak długo, jak inni.I odwrotnie, mam zablokowane całe kraje z łączeniem się z moim serwerem SSH, z (potencjalnym) wyjątkiem zaufanych hostów (tj. Kolejność reguł ma znaczenie).
Pozostaje to jednak ćwiczeniu dla czytelnika. W tym miejscu chciałbym dodać porządne rozwiązanie, które wykorzysta zestawy zawarte w
ssh_loggedon
zestawie, aby umożliwić przekazywanie kolejnych prób połączenia i nie podlegać takiej samej kontroli, jak inne pakiety.Ważne jest, aby pamiętać o domyślnych limitach czasu 90 minut
ssh_loggedon
i 30 minut dlassh_dynblock
następującychiptables
zasad:Do tej pory powinieneś zadać sobie pytanie, w jaki sposób łączący adres IP kończy się w
ssh_loggedon
podzestawach. Więc czytaj dalej ...Bonus: dodanie adresu IP, z którego logujesz się podczas logowania SSH
Jeśli eksperymentowałeś z
sshrc
przyjaciółmi i dowiesz się o ich wadach. Ale PAM przybywa na ratunek. Moduł o nazwiepam_exec.so
pozwala nam wywoływać skrypt podczas logowania SSH w punkcie, w którym wiemy, że użytkownik jest dopuszczony.W
/etc/pam.d/sshd
poniżejpam_env
ipam_selinux
wpisy dodać następujący wiersz:i upewnij się, że twoja wersja skryptu (
/path/to/your/script
powyżej) istnieje i jest wykonywalna.PAM używa zmiennych środowiskowych do komunikowania o tym, co się dzieje, dzięki czemu możesz użyć prostego skryptu takiego jak ten:
Niestety
ipset
narzędzie nie ma wbudowanych inteligentnych funkcji netfiltera. Musimy więc odróżnić IPv4 od IPv6 IP set podczas dodawania naszego wpisu. W przeciwnym razieipset
założymy, że chcemy dodać kolejny zestaw do zestawu, zamiast adresu IP. I oczywiście jest mało prawdopodobne, aby istniał zestaw nazwany na podstawie adresu IP :)Sprawdzamy więc
:
adres IP i dołączamy6
do nazwy zestawu w takim przypadku i w4
innym przypadku.Koniec.
źródło
Innym GUI, którego można użyć do skonfigurowania iptables, jest Firewall Builder . Umożliwia użytkownikom tworzenie elementów reguł jako obiektów w bazie danych, a następnie przeciąganie i upuszczanie tych obiektów w edytorze reguł w celu utworzenia pożądanych zasad zapory. Następnie aplikacja generuje plik skryptu ze wszystkimi poleceniami iptables wymaganymi do wdrożenia reguł.
W przeciwieństwie do niektórych innych rozwiązań GUI iptables, w których możesz zarządzać tylko jedną konfiguracją iptables na raz, za pomocą Firewall Builder możesz zarządzać dużą liczbą konfiguracji iptables za pomocą jednej aplikacji. Firewall Builder działa na systemach Linux, Windows i Mac OS X, istnieje już od ponad 10 lat i ma tysiące aktywnych użytkowników na całym świecie.
Pełne ujawnienie informacji - jestem współzałożycielem NetCitadel, firmy rozwijającej Firewall Builder.
źródło
rejestruj połączenie wychodzące z identyfikatorem użytkownika
przekierowanie portów / połączeń:
źródło
NFLOG
cel. Pozwala na dłuższy prefiks linii, a demon trybu użytkownika może również logować się do baz danych.Dopasuj kilka nazw interfejsów do znaku wieloznacznego
Przykład: masz
eth0
ieth1
i chciałby, aby umożliwić żadnego ruchu pomiędzy nimi?Użyłem tego w przeszłości, aby dopasować
veth<something>
interfejsy dynamicznie tworzone i nazywane przez LXC. Więc mogę dopasować wszystko narazveth+
.Celowo nazwałem też niektóre interfejsy
_<something>
, aby się z nimi równać_+
.źródło
Blokuj nietypowe wartości MSS
SYNPROXY target dla ochrony DDos
Ustaw pakiety syn do tabeli śledzenia połączeń w surowej tabeli
Włącz synproxy dla serwera http:
Zasób: cel SYNPROXY z bloga RHEL
źródło
Ograniczanie wszystkich indywidualnych adresów IP do limitu przepustowości wychodzącej za pomocą zestawów IP
Możesz skonfigurować serwer tak, aby zezwalał tylko na każdy indywidualny stopień wykorzystania przepustowości IP 15GiB miesięcznie, w nadziei, że odzwierciedli lub uniknie ataku wykorzystania przepustowości, być może dla twojego zmierzonego limitu przepustowości u twojego dostawcy usług internetowych. Można to osiągnąć w następujący sposób:
Najpierw utwórz zestawy adresów IP dla IPv4 i IPv6:
Teraz dodaj swoje reguły iptables. Pierwszy wiersz doda adres IP do zestawu, jeśli jeszcze go nie ma. Drugi wiersz nie będzie pasował, jeśli bajty przesłane dla adresu IP w zestawie są większe niż określona liczba. To samo dzieje się w przypadku IPv6.
Zapobiegnie to atakom, takim jak użytkownik żądający dużego pliku z serwera przez długi czas lub z jakiejkolwiek usługi w tym zakresie. To samo można zrobić dla łańcucha INPUT.
źródło
Coś, co robię, głównie z powodu mojej niewiedzy o bardziej eleganckim rozwiązaniu, to ręczne sprawdzanie moich dzienników Nginx co 4 godziny, a serwer poczty loguje się co 2 minuty pod kątem nadmiernego dostępu przez poszczególne adresy IP. Uruchomiłem razem kilka skryptów, które:
access.log
listę 10 najlepszych adresów IP uporządkowanych według liczby trafień na serweriptables.save
Oto jak to wygląda:
autoBanIPs_mail.sh checkBadIPs_mail.shJedną z rzeczy, które BARDZO ważne jest, aby zauważyć tutaj, że POTRZEBUJESZ ustawić białą listę lub zaczniesz blokować wiele autentycznych adresów IP z serwerów, z których otrzymujesz dużo wiadomości e-mail z lub w przypadku innych dzienników, adresy IP, które po prostu dużo uderzaj w serwer z uzasadnionych powodów. Moja biała lista jest właśnie wbudowana w ten skrypt, dodając rury grep zaraz po | grep ']' | które wyglądają mniej więcej tak: „grep -v 127.0 |” .
BlockIPMusisz poświęcić trochę czasu, aby nauczyć serwer, które adresy IP o dużym natężeniu ruchu są prawidłowe, a które nie. Dla mnie oznaczało to, że musiałem spędzić mniej więcej pierwszy tydzień, sprawdzając ręcznie moje logi co kilka godzin, szukając ip o dużym natężeniu ruchu na iplocation.net, a następnie dodając te legalne, takie jak amazon, box.com, a nawet mój dom / biuro Zakresy adresów IP do tej białej listy. Jeśli tego nie zrobisz, prawdopodobnie zostaniesz zablokowany na własnym serwerze lub zaczniesz blokować legalne serwery poczty / sieci i powodować zakłócenia w ruchu e-mail lub ruchu.
Znów wiem, że jest to prymitywne jak diabli, i prawdopodobnie istnieje ładny, czysty, skuteczny protokół, który to wszystko robi, ale nie wiedziałem o tym i ta sprawa trwa już rok lub dwa i powstrzymuje złych facetów. Jedyną rzeczą, którą bardzo POWAŻNIE polecam, jest posiadanie serwera proxy lub innego serwera w skrzydłach, którego można użyć do uzyskania dostępu do głównego serwera. Powodem jest to, że jeśli robisz tworzenie stron internetowych nieoczekiwanie, a ty pinguj siebie 2000 razy w ciągu 5 godzin, aby wykonać pewne testy, które można zablokować bez możliwości powrotu, z wyjątkiem serwera proxy.
Widać, że w
checkBadIPs.sh
umieściłem grep -v 127.0, aw moich rzeczywistych plikach mam mnóstwo reguł ignorowania dla moich własnych adresów IP i innych zaufanych zakresów adresów IP, ale czasami twoje adresy IP się zmieniają, zapominasz o aktualizacji, a następnie jesteś zablokowany z własnego serwera.W każdym razie, mam nadzieję, że to pomaga.
AKTUALIZACJA
Trochę zmieniłem rzeczy, więc teraz zamiast sprawdzania co kilka godzin sprawdzam niektóre logi co 2 minuty, głównie mój dziennik uwierzytelniania ssh i dziennik poczty, gdy były walone :(.
Konfiguruję określone skrypty dla każdego pliku dziennika, chociaż byłoby to łatwe z ręcznego skryptu, którego używam sam, gdy chcę sprawdzać dzienniki. Wygląda tak:
Wymaga to 2 danych wejściowych podczas uruchamiania, pliku dziennika, który chcesz przeskanować, i jak daleko wstecz chcesz skanować.
Więc jeśli chciałbym sprawdzić mail.log pod kątem liczby adresów IP, powiedz 75 minut w przeszłość, uruchomiłbym:
źródło
ipset
raczej wydłużać łańcuch iptables, ale pomysł jest świetny i myślę, że zastosuję je na moich serwerach produkcyjnych. Dzięki za udostępnienie!Zgadzam się z komentarzami na temat ipsetów i flag tcp, ale wciąż wiele brakuje:
Używaj dopasowania geograficznego xtables-addons zamiast ipset dla list krajów. Regularnie aktualizuj dane geograficzne (co najmniej raz w miesiącu). Dane są bardziej dynamiczne niż lista ipset ognia i zapomnienia.
Rozważ śledzenie stanu połączenia za pomocą flag tcp. Na przykład RST lub ACK tcp ma sens tylko dla ustanowionego połączenia. SYN ma sens tylko dla nowych i powiązanych połączeń. SYN dla ustanowionego połączenia oznacza utratę SYN + ACK lub próbę włamania i powinien zostać zresetowany, ponieważ obie strony połączenia nie zgadzają się co do stanu.
Chociaż żaden, SYN + RST i FIN + RST nie są niedozwolonymi kombinacjami, SYN + FIN jest teraz ważny w ramach szybkiego otwierania TCP (opcja TCP 34), szczególnie w przypadku DNS. Pakiety SYN, nawet z szybkim otwieraniem, nie powinny być pofragmentowane. Nie uważam reguł z flagami PSH i URG za przydatne. Nie pomyl stanu śledzenia połączenia ze stanem TCP: Reakcja RST na pakiet SYN jest ustalana na potrzeby śledzenia.
SYNPROXY jest przeznaczony dla pakietów przesyłanych dalej i nie dodaje nic dla pakietów dostarczanych lokalnie poza obsługą syncookie.
Pakiety błędów ICMP zawsze będą w stanie pokrewnym i będą miały długość 48: 576, jeśli są poprawne. Długość 84: 1280 dla IPv6. Wszystkie pozostałe należy zignorować. Ponieważ ich maksymalny rozmiar jest również minimalnym MTU, nigdy nie należy ich fragmentować. Żądania ICMP (pingi, znaczniki czasu itp.) Zawsze będą nowe i odpowiedzi zostaną ustalone. Upuść pakiety ICMP w innych stanach.
Podobnie jak w przypadku przykładu SSH z niedawną listą i akceptującego tylko kolejne pakiety SYN, to samo należy zrobić dla SMTP i jest podobne do „szarej listy” tylko w odniesieniu do adresu IP.
W tabeli filtrów pierwsza (lub druga, jeśli najpierw akceptujesz ustanowione pakiety stanów) w łańcuchach wejściowych i wyjściowych powinna akceptować wszystko w interfejsie sprzężenia zwrotnego. Powinieneś zaufać własnym pakietom wewnętrznym. Jeśli nie możesz, masz większe problemy poza rozwiązaniem zapory ogniowej.
Wreszcie, nie ślepo kopiuj reguł, chyba że naprawdę rozumiesz, co oni robią. Robi to wiele podobnych list reguł i przez większość czasu wynik jest śmieszny.
źródło
źródło