Zacznijmy od tego czym jest filtr pakietów ?
Netfilter jest frameworkiem w jądrze Linuksa, służącym do przechwytywania i zmieniania ruchu sieciowego.
Podstawową aplikacją do obsługi tego frameworka jest iptables.
W tym artykule przedstawiam filtrowanie pakietów. Odpowiada za to tablica filter.
Jak podróżują pakiety przez filtry ?
Kernel rozpoczyna pracę z trzema łańcuchami.
Są to :
INPUT – (wejściowy) znajdują się w nim reguły, które dotyczą filtrowania pakietów przychodzących do komputera, na którym uruchomiony jest iptables.
OUTPUT – (wyjściowy) w tym łańcuchu znajdują się reguły, które filtrują ruch wychodzący z komputera na którym działa iptables.
FORWARD – (przekazujący) odpowiada za filtrowanie ruchu w sieci lokalnej, której udostępniamy Internet poprzez translację adresów – NAT.
Łańcuch to lista reguł. Jeśli dana reguła nie pasuje do pakietu to sprawdzana jest następna.
Jeśli nie ma reguł pasujących do pakietu, kernel sprawdza politykę łańcucha. Może odrzucić lub przepuścić dany pakiet.
Możliwe operacje na łańcuchach :
1) Utworzenie nowego łańcucha (-N)
2) Skasowanie pustego łańcucha (-X)
3) Zmiana polityki dla wbudowanego łańcucha (-P)
4) Wypisanie reguł w łańcuchu (-L)
5) Wyczyszczenie łańcucha z reguł (-F)
6) Wyzerowanie liczników pakietów i bajtów we wszystkich regułach w łańcuchu (-Z)
Sposoby manipulowania regułami w obrębie łańcucha :
1) Dodanie nowej reguły do łańcucha (-A)
2) Wstawienie nowej reguły na ustalonej pozycji w łańcuchu (-I)
3) Zamiana reguły na ustalonej pozycji w łańcuchu (-R)
4) Skasowanie reguły na ustalonej pozycji w łańcuchu lub pierwszej która pasuje (-D)
Ogólna składnia iptables :
iptables -A <łańcuch> <opcje> -j <decyzja>
Dostępne opcje :
Określenie protokołu sieciowego, którego dotyczy reguła np. -p TCP :
-p nazwa_protokołu
Port docelowy lub porty w przedziale [port:port]:
Nakazuje stosowanie reguły dla pakietów o podanym docelowym porcie lub portach:
--dport port
Określenie filtrowania na podstawie docelowego adresu pakietu:
-d adres
Adres docelowy może być podany na kilka sposobów :
– podanie pełnej nazwy domenowej np. www.eproit.pl
– podanie adresu IP np. 188.165.217.7
– wskazanie grupy adresów IP np. 192.168.1.0/24 lub 192.168.1.0/255.255.255.0
– aby wskazać dowolny adres IP można użyć '/0' lub należy nie używać opcji -s.
Port źródłowy lub porty w przedziale [port:port]
Nakazuje stosowanie reguły dla pakietów o podanym źródłowym porcie lub portach:
--sport port
Określenie adresu źródłowego, który zostanie objęty regułą:
-s adres
Adres źródłowy jest podawany tak samo jak w przypadku adresu docelowego.
Umożliwienie filtrowania ruchu przychodzącego do firewalla tylko na podany interfejs :
-i interfejs
Interfejs wyjściowy. Filtrowanie tylko pakietów wychodzących z komputera przez dany interfejs sieciowy:
-o interfejs
Określenie decyzji, działania jakie ma wykonać firewall na zdefiniowanych pakietach:
-j decyzja
DROP – odrzuca pakiet, nie wpuszcza pakietu do komputera.
ACCEPT – akceptuje pakiet, wpuszcza pakiet do komputera.
Analiza śledzenia połączeń :
- m state
Udostępnia dodatkową opcję
--state
która jest listą oddzielnych stanów do przetestowania.
Możliwe stany do sprawdzenia:
NEW (NOWY) – Pakiet który tworzy nowe połączenie.
ESTABLISHED (NAWIĄZANY)- Pakiet należący do istniejącego połączenia.
RELATED (POWIĄZANY)- pakiet powiązany z istniejącym połączeniem, ale nie jest jego częścią.
INVALID (BŁĘDNY) – pakiet błędny lub niezidentyfikowany
Każda reguła jest zestawem warunków, które pakiet musi spełnić i zawiera cel, czyli to co ma się stać z danym pakietem.
Przykładowa reguła :
Odrzucenie wszystkich połączeń z adresu 213.180.141.141, używające protokołu UDP i przeznaczone
dla komputera na którym działa ten firewall :
iptables -A INPUT -p udp -s 213.180.141.141 -j DROP
*******************************
Podstawowe polecenia iptables
*******************************
Wyświetlenie działających reguł firewall :
iptables -L
Wyświetlenie działających reguł firewall oraz statystyk przepływu pakietów (wszystkich) :
iptables -L -v
Resetowanie (zerowanie) licznika :
iptables -Z nazwa_łańcucha
Zakładanie nowego łańcucha :
iptables -N nazwa_nowego_łańcucha
Dodanie pustej reguły :
iptables -A nazwa_łańcucha
Wykasowanie wszystkich reguł z łańcucha :
iptables -F nazwa_łańcucha
Kasowanie łańcucha :
iptables -X nazwa_łańcucha
Określenie polityki :
Polityką może być ACCEPT lub DROP
Tylko wbudowane łańcuchy (INPUT, OUTPUT i FORWARD) mają przypisaną politykę.
np.
iptables -P FORWARD DROP
Kasowanie reguły. Sposoby :
– użycie numeru reguły :
iptables -D nazwa_łańcucha numer_reguły
np. iptables -D INPUT 1
– użycie opcji -D oraz podanie całej składni reguły, którą chcemy wykasować (oprócz opcji -A)
np.
iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
*****************
Logi
*****************
LOG – moduł zapewnia logowanie pasujących pakietów.
Udostępnia następujące opcje :
--log-level poziom_logowania
Poziomem logowania jest nazwa poziomu logowania (’debug', 'info', 'notice', 'warning', 'err', 'crit', 'alert' i ’emerg') lub cyfry od 7 do 0.
--log-prefix ciąg_znaków
Ciągiem znaków jest informacja (do 29 znaków),która jest dodawana do logów.
Przykład reguły :
Do logowania używana jest flaga LOG
iptables -A INPUT -s 213.180.141.141 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix '***atak hakerski***'--log-level 4
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j LOG --log-prefix "Akceptacja IP SSH: "
***************************
iptables – prosty firewall
***************************
Tworzymy skrypt o nazwie firewall :
touch /etc/init.d/firewall
chmod +x /etc/init.d/firewall
nano /etc/init.d/firewall
Przykładowa zawartość skryptu :
#!/bin/bash ### BEGIN INIT INFO # Provides: firewall # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO # Wyczyszczenie istniejących reguł iptables -F INPUT iptables -F FORWARD iptables -F OUTPUT # DOMYŚLNA POLITYKA DLA FILTRÓW # Odrzucenie ruchu przychodzącego iptables -P INPUT DROP # Odrzucenie ruchu przekazującego iptables -P FORWARD DROP # Akceptacja ruchu wychodzącego iptables -P OUTPUT ACCEPT # Akceptacja ruchu na interfejsie loopback # Reguły dla pętli zwrotnej iptables -A INPUT -i lo -j ACCEPT iptables -A FORWARD -o lo -j ACCEPT #iptables -A OUTPUT -o lo -j ACCEPT # Reguły dla łańcucha wejściowego iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Reguły dla łańcucha wyjściowego iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Ochrona przed atakami # blokowanie ataku typu Brute Force - SSH iptables -N SSHSCAN iptables -A INPUT -p tcp --dport 22 -s $lista_adresow_zaufanych -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSHSCAN iptables -A SSHSCAN -m recent --set --name SSH iptables -A SSHSCAN -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP # Otwarcie portów dla użytkowników Internetu dla konkretnych usług #iptables -A INPUT -p tcp --dport numer portu -j ACCEPT #iptables -A INPUT -s 0/0 -p tcp --dport numer portu -j ACCEPT #iptables -A INPUT -s 0/0 -p udp --dport numer portu -j ACCEPT #Numery portów z jakich korzystają poszczególne usługi można odnaleźć w pliku /etc/services. # Otwarte porty dla usług : # np. # dla HTTP : iptables -A INPUT -p tcp --dport 80 -j ACCEPT # dla HTTPS : iptables -A INPUT -p tcp --dport 443 -j ACCEPT # dla SMTP : iptables -A INPUT -p tcp --dport 25 -j ACCEPT # dla POP3 : iptables -A INPUT -p tcp --dport 110 -j ACCEPT # dla IMAP : iptables -A INPUT -p tcp --dport 143 -j ACCEPT # dla IMAP SSL : iptables -A INPUT -p tcp --dport 993 -j ACCEPT # dla POP3 SSL : iptables -A INPUT -p tcp --dport 995 -j ACCEPT # dla FTP : iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT # Akceptacja pakietów DNS iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT iptables -A INPUT -p tcp --sport 53 -j ACCEPT #iptables -A OUTPUT -p udp --dport 53 -j ACCEPT #iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT #iptables -A OUTPUT -p udp --sport 53 -j ACCEPT #iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
Uruchomienie zapory sieciowej :
sudo /etc/init.d/firewall
W systemie Linux wyróżnia się siedem trybów pracy :
0 – tryb zatrzymania wszystkich procesów, zatrzymania pracy systemu
1 – tryb pracy jednego użytkownika (do administrowania i konserwacji systemu)
2 – tryb pracy wielu użytkowników, bez sieciowego systemu plików (NFS)
3 – tryb pracy wielu użytkowników, włączony sieciowy system plików (środowisko tekstowe)
4 – tryb pracy jest pusty (pozwala na zdefiniowanie własnego poziomu pracy)
5 – tryb pracy wielu użytkowników (środowisko graficzne)
6 – tryb restartu systemu
Utworzenie dowiązania do uruchomienia firewall w trybach pracy 2345 oraz zatrzymania firewall w trybach pracy 016 :
update-rc.d firewall defaults 90
Jeśli zajdzie potrzeba zatrzymania firewall wykonujemy :
sudo /etc/init.d/firewall stop