370 likes | 504 Views
FILTR PAKIETOWY - NETFILTER. Co to jest Netfilter?.
E N D
Co to jest Netfilter? Użytkownik podłączony do sieci rzadko, kiedy musi martwić się o przychodzące do niego pakiety. W zupełnie innej sytuacji jest administrator. Z nie zaufanych sieci, takich jak Internet, mogą przybywać pakiety tworzone przez sieciowych włamywaczy, których celem jest zbadanie struktury sieci bądź przeprowadzenie ataku. Ponadto potrzebne mogą być mechanizmy transakcji adresów – NAT (Network Address Translator), aby zezwolić użytkownikom sieci wewnętrznej na dostęp do Internetu lub umieścić klika serwerów pod jednym internetowym adresem IP. Potrzebny jest, więc mechanizm, który będzie w stanie analizować zawartość pakietów sieciowych i na jego podstawie decydować o losie pakietów. Mechanizm taki nazywa się filtrem pakietowym.
Powody filtrowania pakietów: • Budowa internetowych ścian ogniowych (filtrowaanie pakietów w zależności od źródła, przeznaczenia, usługi, stanu połączeń). • Dzielenie dostępu do Internetu przez wiele hostów przy użyciu jednego (kilku) adresów IP. • Tworzenie przezroczystych serwerów buforujących (proxy serwer). • Budowa routerów QoS (Quality if Service). • Manipulacja nagłówkami pakietów.
Twórcy... ... i ogólny opis Autorem nowego kodu filtra pakietów jest RUSTY RUSSELL oraz zespół prowadzony przez niego. Mechanizm ten nazywa się NETFILTER. Netfilter jest ogólnym szkieletem, do którego można dodawać moduły, zmieniając tym samym jego właściwości i funkcjonalność. Za zarządzanie mechanizmem netfilter odpowiedzialne jest narzędzie iptables. System LINUX wyposażony jest w filtr NETFILTER, dostępny dla administratora przez IPTABLES.
Filtrowanie pakietów w LINUXIE: Jądro Linuxa jest wyposażone w możliwość filtrowania pakietów: • Seria 2.0: filtr – ipfw, obsługa – ipfwadmin, • Seria 2.2: filtr – ipchains, obsługa – ipchains, • Seria 2.4: filtr – netfilter, obsługa – iptables. cd ...
cd... Ipchains służył jako całkiem wydajna zapora sieciowa, ale sposób, w jaki przetwarzał datagramy mógł niektórych administratorów wprawiać w zakłopotanie. Na przykład łańcuch INPUT opisywał zarówno pakiety przeznaczone do naszego hosta/sieci, jak i pakiety, które miały być przekazywane dalej do innej sieci. Wprowadzało to niepotrzebne zamieszanie i zwiększało liczbę reguł potrzebnych do filtrowania ruchu sieciowego zgodnego z naszym zamiarem. Netfilter zlikwidował tę trudność, gdyż każdy łańcuch (INPUT, OUTPUT i FORWARD) działa niezależnie. Netfilter posiada moduły do obsługi zmiany adresów (NAT – Network Address Translator), rejestrownia zdarzeń, śledzenia połączeń i ich stanów, moduły do skomplikowanych modyfikacji niektórych pól nagłówkowych itp. Moduły mogą zostać wkompilowane w jądro.
Wymagania: Aby móc korzystać z mechanizmu netfilter i iptables, należy przygotować do tego zainstalowany uprzednio system operacyjny LINUX. Aby uruchomić obsługę netfilter należy ściągnąć źródła jądra linuksowego w wersji 2.4.x (ostatnią stabilną wersją jądra jest 2.4.19) lub z któregoś z licznych mirrorów. Należy również zaopatrzyć się w źródła iptables dostępne na stronie www.ip-tables.org lubwww.netfilter.org. Wiele dystrybucji Linuksa zawiera jądro linii 2.4 oraz iptables w dystrybucji (np. Red Hat od wersji 7.1). Uruchamianie obsługi netfilter należy rozpocząć od odpowiedniego skonfigurowania jądra systemu oraz jego instalacji. Odpowiednie opcje konfiguracyjne są dostępne w sekcji 'Network options'.
Opcje podstawowe i niezbędne do dalszego opisywania zagadnień firewalla oraz NAT na Linuxie: • CONFIG_NETFILTER (Network packet filtering (replaces ipchains))- jest to najważniejsza opcja, bez której nie możliwa byłaby budowa filtra pakietów lub uruchomienie NAT. Opcja ta włącza mechanizm netfilter w jądrze systemu operacyjnego Linux. • CONFIG_IP_NF_IPTABLES (IP tables support (required for filtering/masq/NAT)) - jest to opcja uruchamiająca obsługę narządzia iptables w jądrze Linuksa. Bez niej nie będzie możliwe korzystanie z iptables.
Istnieje możliwość włączenia wielu opcji zwiększających znacznie funkcjonalność mechanizmu netfilter. Wiele opcji może zostać pominięte, a większość z nich może zostać skompilowana jako moduł. Użycie opcji skompilowanych jako moduły będzie wymagało załadowania odpowiedniego modułu do jądra systemu, za pomocą programu modprobe bądź insmod. Można najpotrzebniejsze opcje netfilter wbudować w kod jądra, dzięki czemu nie będzie konieczne ładowanie odpowiednich modułów przed użyciem opcji iptables z nimi powiązanych.
Najpotrzebniejsze opcje, które warto wkompilować w jądro linuksowe: CONFIG_NETFILTERCONFIG_CONNTRACKCONFIG_IP_NF_IPTABLESCONFIG_IP_NF_FILTERCONFIG_IP_NF_NATCONFIG_IP_NF_MATCH_STATECONFIG_IP_NF_TARGET_LOGCONFIG_IP_NF_MATCH_LIMITCONFIG_IP_NF_TARGET_MA-SQUERADE Po skompilowaniu i zainstalowaniu nowego jądra wymagany jest restart systemu operacyjnego.
INSTALACJA IPTABLES Iptables to tak naprawdę zestaw reguł, mówiących kernelowi jak ma filtrować przechodzące przez niego pakiety i co ma z nimi robić. Kompilacji i instalacji pakietu dokonujemy wykonując poniższe polecenia w katalogu z rozpakowanymi źródłami: # make KERNEL_DIR=/usr/src/linux # make install KERNEL_DIR=/usr/src/linux Parametr KERNEL_DIR definiuje ścieżkę, w jakiej znajdują się źródła jądra linuksowego. Po wykonaniu powyższych poleceń przygotowywany system jest już w zasadzie gotowy do pracy. Możliwe jest również skonfigurowanie iptables do współpracy z różnymi łatami. Zaawansowane opcje kompilacji są opisane w pliku INSTALL.
Aktualny zestaw reguł można zobaczyć przy pomocy polecenia : iptables –L Ustawić swoje reguły można zasadniczo na trzy równoważne sposoby: • Wklepując je ręcznie, komenda po komendzie. • Tworząc plik /etc/sysconfig/iptables zawierający reguły, a następnie wydając polecenie /etc/init.d/iptables restart. • Tworząc własny skrypt, czyli taki sam skrypt o dowolnej nazwie, i uruchamiać go ręcznie (warto też dopisać go do rc.local, żeby wykonywał się przy uruchamianiu komputera).
Filtr pakietów to program, który sprawdza nagłówek każdego pakietu przechodzącego przez dany interfejs, porównuje go z zestawem reguł dotyczących filtrowania i decyduje, co z nim zrobić. Najmniejszą jednostką konfiguracji filtra pakietowego jest reguła. Zawiera ona zbiór warunków, jakie musi spełniać pakiet, oraz akcję, jaka zostanie wykonana, gdy warunki zostaną spełnione. Pojedyncze reguły grupowane są w łańcuchy. Zbiór łańcuchów natomiast tworzy tabelę. Czyli: Działanie netfilter opiera się na tabelach (table), które z kolei posiadają łańcuchy (chain) podstawowe i definiowane przez użytkownika, przypisane do konkretnych tabel. Dla każdego łańcucha definiowane są reguły dla przechodzących przez nie pakietów wraz z decyzją o podjętej wobec nich akcji (target).
Istnieją trzy podstawowe tabele, mianowicie: • Filter – domyślna tabela, służąca do filtrowania pakietów. • Nat – tabela ta jest wywoływana przez pakiety rozpoczynające nowe połączenia, steruje mechanizmem translacji adresów, czyli jest odpowiedzialna za realizację NATa, maskarady IP itp. • Mangle – tabela specjalizowana w modyfikacji przepływających pakietów, odpowiedzialna za dokonanie możliwych sprawdzeń i modyfikacji wybranych pól w nagłówkach pakietów. Każda z tabel zawiera klika predefiniowanych łańcuchów oraz łańcuchy zdefiniowane przez administratora.
Istniejąnastępujące predefiniowane łańcuchy: • INPUT – wywoływany dla pakietów przybywających z sieci przeznaczonych dla maszyny lokalnej. Łańcuch, przez który przechodzą pakiety wchodzące. • FORWARD – wywoływany dla pakietów routowanych przez lokalną maszynę, lecz pochodzących spoza niej i nie przeznaczonych dla niej. Łańcuch, przez który przechodzą pakiety przekazywane dalej. • OUTPUT – wywoływany dla pakietów tworzonych lokalnie i wychodzących poza maszynę. Łańcuch, przez który przechodzą pakiety wychodzące. • PREROUTING – wywoływany dla pakietów z zewnątrz jeszcze przed ich routowaniem. • POSTROUTING – wywoływany dla pakietów, które właśnie opuszczają maszynę.
Tabela filter(tabela domyślna) posiada następujące podstawowe łańcuchy: • INPUT - łańcuch, przez które przechodzą pakiety wchodzące. • OUTPUT - łańcuch, przez które przechodzą pakiety wychodzące. • FORWARD - łańcuch, przez które przechodzą pakiety przekazywane dalej. Pakiet może znaleźć się tylko w jednym z trzech łańcuchów!
Tabela nat– posiada dwa łańcuchy: • PREROUTING • POSTROUTING Nazwy związane z routing’iem (podejmowanie decyzji o wyborze przeznaczenia pakietu na podstawie adresu przeznaczenia dla pakietów przetwarzanych przez jądro). Dokonuje się modyfikacji adresów źródłowych i docelowych w trakcie realizacji NAT i maskarady (istnieje również łańcuch OUTPUT dla realizacji DNAT, dla pakietów wychodzących, ale generowanych lokalnie). Tabela mangle- jeden łańcuch • PREROUTING - gdzie dokonywana jest zmiana nagłówka pakietu przed wysłaniem.
Droga pakietów: Każdy pakiet rozpoczyna swoją podróż przez filtr pakietowy w jednym z predefiniowanych łańcuchów. Łańcuch skanowany jest od góry do dołu w poszukiwaniu reguł, które będą odpowiadać sprawdzanemu pakietowi. Po napotkaniu takiej reguły, wykonywana jest jej akcja. Pozostała część łańcucha nie jest już skanowana. Wyjątkiem jest przypadek, gdy wywołany zostanie łańcuch zdefiniowany przez administratora zakończony akcją RETURN. Skanowanie rozpocznie się wtedy od kolejnej reguły od tej, która wywołała przeskok do łańcucha administratora. Jeśli pakiet opuszcza łańcuch bez wykonania żadnej akcji, wykonywana jest akcja domyślna (chain policy). Pakiet, który nadchodzi do firewalla jest przetwarzany przez każdą regułę zdefiniowaną dla łańcucha w odpowiedniej tabeli. Jest porównywany z każdą regułą i jeśli pasuje do warunków zdefiniowanych w regule, zostaje podjęta akcja/cel (target) zapisana w regule.
Tabela MANGLE: • TOS - cel używany do modyfikacji pola Type Of Service w przetwarzanym pakiecie; może to być użyteczne do definiowania odpowiednich polityk trasowania pakietów w sieci oraz sprawdzania już istniejących zasad routingu. • TTL - cel używany do zmiany wartości pola TTL (Time To Live) w nagłówku pakietu. Może to być użyteczne dla administratorów pragnących ukryć przed dostawcą usług internetowych fakt istnienia współdzielenia jednego, przydzielonego wraz z łączem do Internetu, adresu IP. Obserwacja pakietów pochodzących od jednej maszyny, a zawierających różne wartości pól TTL, może sugerować istnienie sieci prywatnej "za" obserwowaną maszyną. • MARK - cel używany do oznaczania pakietów, które mogą być identyfikowane przez inne oprogramowanie rozpoznające te pakiety. Pakiety oznaczane są za pomocą wartości numerycznej.
TabelaNAT: • DNAT - cel określający wykonanie NAT docelowego, czyli zmianę adresu przeznaczenia określonego w pakiecie na adres zdefiniowany w regule. Może to być użyteczne podczas tworzenia transparentnego proxy, czyli kierowanie np. nagłego ruchu wychodzącego na port 80 do maszyny lokalnej, która posiada uruchomiony proces Squid (HTTP Proxy). Dodatkowym częstym zastosowaniem DNAT jest kierowanie ruchu do maszyn świadczących usługi w strefie zdemilitaryzowanej, (DMZ), czyli miejsca udostępnionego sieci globalnej, ale wydzielonej z przyczyn bezpieczeństwa z zasobów sieci lokalnej. • SNAT - cel określający wykonanie NAT źródłowego, czyli zmianę adresu źródłowego dla pakietów wysyłanych do sieci Internet. Jest to wykorzystywane do realizacji udostępnienia łącza internetowego z przydzielonym jednym adresem IP dla sieci prywatnej posiadającej nierutowalne adresy IP.
TabelaFILTER: • ACCEPT - cel akceptujący pakiet. • DROP - cel odrzucający pakiet bez żadnego komunikatu. • LOG - cel zapisujący informacje o pakiecie w logu systemowym. • REJECT - cel odrzucający pakiet wraz z możliwością wysłania w odpowiedzi ICMP, komunikatu o błędzie. • RETURN – powoduje powrót z łańcucha zdefiniowanego przez administratora do łańcucha, z którego został on wykonany.
Losy pakietu przechodzącego przez firewalla opartego o mechanizm netfilter. Dla pakietów przekazywanych przez filtr pakietów wygląda to następująco: • Pakiet przychodzi do wejściowego interfejsu sieciowego bezpieczny "gateway" na Linuksie. • Przetwarzanie pakietu przez reguły zdefiniowane dla łańcucha PREROUTING tabeli mangle (min. zmiana pola TTL). • Przetwarzanie przez reguły PREROUTING tabeli nat. Zmiana adresu przeznaczenia pakietu (DNAT). Pakiet trafia do łańcucha POSTROUTING tabeli nat, gdzie realizowany jest SNAT - zmiana adresu źródłowego. • Jeśli została podjęta decyzja o przekazaniu pakietu jest on kierowany do łańcucha FORWARD tabeli filter i poddawany badaniom według zapisanych reguł. cd…
cd… • Pakiet trafia do łańcucha POSTROUTING tabeli nat, gdzie realizowany jest SNAT - zmiana adresu źródłowego. • Przetworzony pakiet trafia z powrotem do sieci interfejsem wyjściowym. Podczas realizacji przekazywania pakietów nie należy stosować łańcuchów INPUT i OUTPUT dla blokowania pakietów wchodzących i wychodzących. Reguły filtrujące muszą być zdefiniowane dla łańcucha FORWARD, gdyż przez niego przechodzą pakiety w obydwu kierunkach. Łańcuchy INPUT i OUTPUT mają zastosowanie dla pakietów wchodzących do i wychodzących z procesu sieciowego działającego na maszynie, na której działa filtr pakietów.
ZASTOSOWANIA: • Kontrola: Kiedy używasz Linuksa by połączyć twoją wewnętrzną sieć z inną siecią (powiedzmy z Internetem) masz okazję wpuścić trochę różnych typów ruchu i odrzucić inne. Na przykład, nagłówek pakietu posiada adres docelowy pakietu, więc możesz odrzucać pakiety, które podróżują do określonych części sieci zewnętrznej. Innym przykładem może być to: używam Netscape do oglądania archiwów Dilbert'a. Jest tam masa reklam pochodzących z adresu doubleclick.net, więc Netscape traci czas by je ładować. Pouczenie filtra pakietów by nie wpuszczał pakietów podróżujących do i z tego adresu rozwiązuje ten problem.
Bezpieczeństwo: Kiedy Twój Linuks jest jedynym komputerem pomiędzy chaosem Internetu i twoją ładną, uporządkowaną siecią, miło jest wiedzieć że możesz obłożyć restrykcjami to co nadchodzi do twych drzwi. Na przykład, możesz pozwolić by wszystko wychodziło z twojej sieci, ale możesz być zaniepokojony znanym atakiem 'Ping of Death' nadchodzącym od różnych złośliwych użytkowników sieci. Innym przykładem może być twoje życzenie, by nie zezwalać na telnet'owanie się na Twój komputer, mimo że wszystkie konta mają hasła; prawdopodobnie chcesz być (jak większość ludzi) raczej obserwatorem w Internecie a nie serwerem - po prostu nie dawać się nikomu do Ciebie dołączać, poprzez filtrowanie nadchodzących pakietów służących do ustanawiania połączeń. • Czujność: Czasami źle skonfigurowana maszyna w sieci lokalnej zadecyduje o skierowaniu paru pakietów do sieci zewnętrznej. Miło jest móc poinstruować filtr pakietów by dał Ci znać o takich anormalnych zachowaniach.
POJĘCIE ŁAŃCUCHA, REGUŁY I POLITYKI DOMYSLNEJ. Podstawowym pojęciem jest łańcuch (chain) Jest to zbiór reguł filtrujących. Istnieją trzy standardowe łańcuchy: input, forward, output. Łańcuch jest listą reguł, do których po kolei jest porównywany pakiet. Jeśli pakiet pasuje do którejś z reguł, wykonywana jest akcja zdefiniowana wewnątrz tej reguły. Jeżeli pakiet nie pasuje do żadnej reguły wykonywana jest akcja zdefiniowana w polityce domyślnej danego łańcucha. Tylko łańcuchy podstawowe i dodatkowe mają własną politykę, łańcuchy utworzone przez użytkownika nie mają własnej polityki, a pakiet po przejściu przez taki łańcuch wraca do łańcucha, z którego został wywołany.
SKŁADNIA POLECENIA IPTABLES: Przy pomocy iptables możemy tworzyć nowe i operować na całych łańcuchach.Łańcuchów podstawowych nie możemy skasować (INPUT, FORWARD, OUTPUT). Opcje jakie możemy wykonać łańcuchach: • ,,-N'' - stworzenie nowego łańcucha • ,,-X'' - skasowanie pustego łańcucha • ,,-P'' - zmiana domyślnej polityki dla danego łańcucha • ,,-L'' - wyświetlenie reguł z danego łańcucha • ,,-F'' - usunięcie wszystkich reguł z łańcucha • ,,-Z'' - wyzerowanie liczników pakietów i bajtów we wszystkich łańcuchach • ,,-E'' - zmień nazwę łańcucha (tylko dla łańcuchów utworzonych przez użytkownika) cd…
cd… Opcje służące do manipulowania regułami w łańcuchach: • ,,-A'' - dodaj (na koniec) nową regułę do łańcucha • ,,-I'' - dodaj nową regułę w określoną pozycję łańcucha • ,,-R'' - zastąp regułę w określonej pozycji nową • ,,-D'' - usuń regułę w określonej pozycji bądź pierwszą w łańcuchu Do zarządzania regułami służy polecenie iptables.
Poniżej zostały przedstawione ogólne reguły wywoływania programu iptables z wymienionymi opcjami: iptables -[ADC] chain rule-specification [options] iptables -[RI] chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LFZ] [chain] [options] iptables -[NX] chain iptables -P chain target [options] iptables -E old-chain-name new-chain-name gdzie: • chain - nazwa łańcucha • rule-specification - opisuje regułę, które chcemy dodać, usunąć lub zmienić • rulenum - numer reguły w łańcuchu licząc od 1 • target - oznacza cel pakietu czyli np. ,,ACCEPT'' gdy akceptujemy pakiet lub ,,DROP'' gdy odrzucamy • options - są to dodatkowe opcje jakie chcemy podać.
Regułato dowolna ilość warunków oraz dokładnie jedna akcja. Gdy brak warunków akcja wykonywana jest zawsze, oczywiście wtedy, gdy wykonanie łańcucha dojdzie do takiej reguły.Reguła posiadająca tylko warunki(brak akcji), używana jest wyłącznie do liczenia pakietów pasujących do warunków. Najczęściej używane warunki to: • -s adres_źródłowy/maska • -p protokół • -d adres_źródłowy/maska • -i interfejs • -o interfejs • --source-port port • --destination-port port Dodanie „!” przed którąkolwiek opcją tłumaczy się jako „różny od”, czyli np.. Istnieje również zestaw warunków opcjonalnych, ładowanych przez opcję -m. Akcję definiuje się, używając parametru -j.
Blokowanie nadużyć. Administrując serwerem na pewno zdarzy nam się, że będziemy potrzebowali wyciąć pewne sieci, komputery, które próbują nadużywać naszą maszynę, bądź ją atakować. Klasycznym przykładem jest rozsyłanie spamu przez serwery pocztowe. Komputery, z których otrzymujemy spam, bądź, które próbują rozsyłać pocztę przez nasz serwer możemy zablokować na poziomie aplikacji (mailera) ale dodatkowo można to zrobić w filtrze pakietów co w pewnych sytuacjach jest lepszym rozwiązaniem np. odcinamy daną sieć/komputer od wszystkich usług. cd...
Dodajemy nowy łańcuch,,abuse’’, w którym będziemy umieszczać sieci i adresy IP, które będziemy blokować: # iptables -N abuse # iptables -A abuse -p tcp -s 6.6.6.0/24 -d 1.1.1.1/32 --dport 25 -j DROP # iptables -A abuse -s 7.7.7.7/32 -d 1.1.1.1/32 -j DROP # iptables -I INPUT 1 -j abuse W IPtables pierwsza pasująca regułka jest brana pod uwagę dlategonależy uważać żeby blokowanie nadużyć umieścić przedregułkami wpuszczającymi usługi do serwera.