table of contents
IPFW(4) | IPFW(4) |
NAZWA¶
ipfw - zapora ogniowa (firewall) IP i zliczanie ruchu
SKŁADNIA¶
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/if.h>
#include <linux/ip_fw.h>
int setsockopt (int socket, IPPROTO_IP, int command, void *data, int length)
OPIS¶
Usługi firewalla IP i zliczania ruchu wbudowane w jądro Linuksa udostępniają mechanizm zliczania pakietów IP i budowania zapór ogniowych (firewall) opartych o filtry pakietów. Administrowanie tymi funkcjami opiera się o cztery przechowywane przez jądro listy, z których każda może zawierać zero lub więcej reguł. Reguła zawiera szczegółowe informacje o adresach źródłowych i docelowych, protokołach, numerach portów i kilku innych cechach. Pakiet dopasowany będzie do reguły, jeśli jego parametry będą zgadzać się z jej definicją. Istnieją cztery kategorie reguł:
- Zliczające
-
Reguły te stosowane są do wszystkich pakietów IP, które są wysyłane bądź odbierane przez jeden z lokalnych interfejsów sieciowych. Cechy każdego pakietu będą porównane ze wszystkimi regułami na tej liście, a każde dopasowanie spowoduje zwiększenie związanych z daną regułą liczników pakietów i bajtów.
- Zapora wejściowa
-
Reguły te decydują o udzielaniu dostępu nadchodzącym z zewnątrz pakietom IP. Wszystkie pakiety wchodzące przez jeden z lokalnych interfejsów sieciowych sprawdzane są pod kątem dopasowania reguł zapory wejściowej. Pierwsza reguła, do której pasują parametry pakietu, zadecyduje o udzieleniu dostępu oraz zmieni liczniki bajtów i pakietów związane z tą regułą. Jeśli pakiet nie zostanie dopasowany do żadnej reguły, zastosowana zostanie domyślna reguła dostępowa.
- Zapora wyjściowa
-
Reguły te definiują uprawnienia wychodzących pakietów IP. Wszystkie pakiety gotowe do wysłania przez jeden z lokalnych interfejsów sieciowych sprawdzane są pod względem zgodności z regułami zapory wyjściowej. Pierwsza dopasowana do pakietu reguła zadecyduje o prawach dostępu i spowoduje aktualizację liczników bajtów i pakietów z nią związanych. Jeśli pakiet nie zostanie dopasowany do żadnej reguły, zastosowana zostanie domyślna reguła dostępowa.
- Zapora pakietów przekazywanych
-
Reguły te definiują uprawnienia przekazywanych pakietów IP. Wszystkie pakiety wysłane przez zewnętrzny komputer, posiadające inny komputer jako stację docelową, sprawdzane są pod względem dopasowania do reguł zapory pakietów przekazywanych. Pierwsza dopasowana do pakietu reguła zadecyduje o prawach dostępu i spowoduje aktualizację liczników bajtów i pakietów z nią związanych. Jeśli pakiet nie zostanie dopasowany do żadnej reguły, zastosowana zostanie domyślna reguła dostępowa.
Każda reguła zaporowa (nie reguła zliczająca), posiada zasadę, która określa, jakie czynności mają być wykonane jeśli parametry pakietu pasować będą do definicji reguły. Istnieją 4 różne zasady: accept (pozwala pakietom swobodnie przechodzić przez zaporę), masquerade (pozwala pakietom przechodzić przez zaporę przy wykorzystaniu maskowania (masquerading); ta zasada ma zastosowanie jedynie do reguł przekazujących), reject (odrzuca pakiet i w charakterze powiadomienia odsyła nadawcy komunikat ICMP host unreachable (komputer niedostępny)), and deny (ignoruje pakiet bez odsyłanie jakiegokolwiek powiadomienia). Przy wszystkich trzech typach zapór istnieje zasada domyślna, która stosowana jest względem wszystkich pakietów, które nie dopasują się do żadnej z reguł.
Reguły przekazujące definiują również, czy pakiety będą maskowane w trakcie przekazywania. W tym przypadku przed przekazaniem pakietu adres nadawcy w pakiecie IP jest zastępowany adresem lokalnego komputera, a port źródłowy w nagłówku TCP lub UDP jest zastępowany przez numer stworzonego tymczasowo portu lokalnego. Ponieważ te ustawienia przechowywane są w jądrze, pakiety zwrotne (przysyłane do tymczasowego portu na komputerze lokalnym) rozpoznawane są automatycznie. Adres docelowy i numer portu tych pakietów zostanie zastąpiony przez oryginalny adres i numer portu, które zostały zapamiętane przy przekazywaniu pierwszego maskowanego pakietu.
Ten paragraf opisuje sposób, w jaki pakiet przechodzi przez reguły zapory i zliczania. Pakiety odebrane przez jeden z lokalnych interfejsów sieciowych przechodzą przez następujące zestawy reguł:
zapora wejściowa (urządzenie wejściowe)
zliczanie (urządzenie wyjściowe)
Sterowanie zaporą i zliczaniem może się odbywać za pośrednictwem wywołań funkcji setsockopt(2). Istniejące reguły można sprawdzić zaglądając do trzech plików w katalogu /proc/net : ip_acct, ip_input, ip_output, oraz ip_forward. Bieżące ustawienia związane z sesjami maskowanymi można znaleźć w pliku ip_masquerade w tym samym katalogu (zauważmy, że reguły określające sesje, które powinny być maskowane znajdują się w pliku ip_forward).
POLECENIA¶
Polecenia zmiany list reguł lub zasad domyślnych muszą być podane jako parametry funkcji systemowej setsockopt(2) , pracującej na surowym gniazdku IP. Większość poleceń wymaga przekazania pewnych dodatkowych danych. Wskaźnik do tych danych i długość danych są przekazywane jako parametry wartości i długości opcji setsockopt. Dostępne są następujące polecenia:
IP_ACCT_APPEND
IP_FW_APPEND_IN
IP_FW_APPEND_OUT
IP_FW_APPEND_FWD
IP_ACCT_INSERT
IP_FW_INSERT_IN
IP_FW_INSERT_OUT
IP_FW_INSERT_FWD
IP_ACCT_DELETE
IP_FW_DELETE_IN
IP_FW_DELETE_OUT
IP_FW_DELETE_FWD
IP_ACCT_ZERO
IP_FW_ZERO_IN
IP_FW_ZERO_OUT
IP_FW_ZERO_FWD
IP_ACCT_FLUSH
IP_FW_FLUSH_IN
IP_FW_FLUSH_OUT
IP_FW_FLUSH_FWD
IP_FW_POLICY_IN
IP_FW_POLICY_OUT
IP_FW_POLICY_FWD
IP_FW_CHECK_IN
IP_FW_CHECK_OUT
IP_FW_CHECK_FWD
STRUKTURY¶
Struktura ip_fw zawiera następujące pola, które należy wypełnić adekwatnie do procedury dodawania lub usuwania reguły:
- struct in_addr fw_src, fw_dst
- Źródłowe i docelowe adresy IP.
- struct in_addr fw_smsk, fw_dmsk
- Maski dla źródłowych i docelowych adresów IP. Zauważmy, że maska 0.0.0.0 oznaczać będzie dopasowanie wszystkich adresów.
- struct in_addr fw_via
- Adres IP interfejsu, przez który pakiet jest odbierany przez system, lub który ma być przesłany przez system. Adres 0.0.0.0 ma specjalne znaczenie: dopasowanie adresów wszystkich interfejsów.
- char fw_vianame[IFNAMSIZ]
- Nazwa interfejsu, przez który pakiet jest odbierany przez system lub przez który ma być wysłany. Pusty ciąg znaków ma specjalne znaczenie: dopasowanie wszystkich nazw urządzeń.
- unsigned short fw_flg
- Flagi dla reguły. Flagi dla różnych opcji mogą
być podane jako ich różnica logiczna.
Protokół (obowiązkowy). Możliwe wartości to IP_FW_F_TCP (TCP), IP_FW_F_UDP (UDP), IP_FW_F_ICMP (ICMP), lub IP_FW_F_ALL (wszystkie protokoły, co definiuje uniwersalną regułę zliczania/zaporową).
Zasada, którą należy użyć w przypadku dopasowania pakietu. Może nią być IP_FW_F_ACCEPT (zaakceptuj pakiet), IP_FW_F_ACCEPT | IP_FW_F_MASQ (zaakceptuj pakiet i opcjonalnie zastosuj maskowanie), lub IP_FW_F_ICMRPL (odrzuć pakiet odsyłając odbiorcy komunikat ICMP host unreachable). Jeśli nie podana jest żadna z tych flag, pakiet jest odrzucany bez powiadomienia nadawcy. Zauważmy, że zasada ta jest ignorowana w regułach zliczających.
Można ustawić kilka dodatkowych opcji: IP_FW_F_BIDIR (reguła dwukierunkowa, działająca w obie strony), IP_FW_F_TCPACK (reguła pasuje tylko wtedy, gdy w nagłówku TCP ustawiony jest bit ACK), IP_FW_F_TCPSYN (reguła pasuje tylko wtedy, gdy w nagłówku TCP bit SYN jest ustawiony, a bit ACK jest wyzerowany), IP_FW_F_SRNG oraz IP_FW_F_DRNG (opis tych flag poniżej). Opcji IP_FW_F_PRN można użyć do wyświetlenia pewnych informacji o pasujących pakietach za pomocą funkcji printk(). Opcja ta będzie skuteczna tylko wówczas, gdy jądro jest skompilowane ze zdefiniowanym parametrem CONFIG_IP_FIREWALL_VERBOSE.
- unsigned short fw_nsp, fw_ndp, fw_pts[IP_FW_MAX_PORTS]
- Te pola określają liczbę portów źródłowych, docelowych i tablicę, w której przechowywane są odpowiednie numery tych portów. Tablica zaczyna się od portów źródłowych, po których bezpośrednio następują porty docelowe. Całkowita liczba portów jest ograniczona do wartości IP_FW_MAX_PORTS (obecnie 10). Zarówno lista portów źródłowych, jak i docelowych zawierać może co najwyżej jeden zakres. W tym przypadku, pierwsze dwa numery portów z listy traktowane są jako minimalna i maksymalna wartość zakresu. Dla pakietów ICMP, porty źródłowe traktowane są jako typy ICMP, a porty docelowe są pomijane. Ponieważ drugi i następne fragmenty pakietu TCP lub UDP nie zawierają numerów portów, traktowane są tak, jakby miały oba porty równe zero. Flagi IP_FW_F_SRNG i IP_FW_F_DRNG w polu fw_flg określają czy podany jest zakres źródłowy i/lub docelowy.
- unsigned char fw_tosand, fw_tosxor
- Owe 8-bitowe maski określają, w jaki sposób pole TOS w nagłówku IP powinno być zmieniane, gdy pakiet jest akceptowany przez regułę zaporową (z maskowaniem lub bez). Pole TOS jest najpierw bitowo sumowane z fw_tosand , a wynik jest poddawany operacji różnicy symetrycznej (xor) z fw_tosxor. Pola te są pomijane w regułach zliczania i w regułach zaporowych, które odrzucają pakiet z powiadomieniem lub bez.
Struktura ip_fwpkt , wykorzystywania przy sprawdzaniu pakietu, zawiera następujące pola:
- struct iphdr fwp_iph
- Nagłówek IP. Zajrzyj do <linux/ip.h> po szczegółowy opis struktury iphdr.
struct tcphdr fwp_protoh.fwp_tcph
struct udphdr fwp_protoh.fwp_udph
struct icmphdr fwp_protoh.fwp_icmph
- struct in_addr fwp_via
- Adres interfejsu, przez który udaje się, że pakiet jest wysyłany lub odbierany.
WARTOŚĆ ZWRACANA¶
Zero, jeśli operacja jest skuteczna. -1, jeśli wystąpił błąd. Odpowiednio ustawiana jest wartość errno. Lista możliwych komunikatów błędu znajduje się na stronie setsockopt(2). Jeśli użyte jest jedno z dwóch poleceń sprawdzania pakietu, zwracane jest zero jeśli pakiet byłby zaakceptowany (bez maskowania). W przeciwnym wypadku, zwracana jest -1, a errno uzyskuje wartość ECONNRESET (pakiet byłby przyjęty z użyciem maskowania), ETIMEDOUT (pakiet byłby odrzucony z powiadomieniem), lub ECONNREFUSED (pakiet byłby odrzucony bez powiadomienia).
WYŚWIETLANIE REGUŁ¶
W katalogu /proc/net znajdują się 4 wpisy, umożliwiające wyświetlenie aktywnych reguł w każdej z następujących kategorii: ip_acct (reguły zliczania ruchu IP), ip_input (reguły zapory wejściowej IP), ip_output (reguły wyjściowej zapory IP), oraz ip_forward (reguły zapory przekazującej IP). Odczyt tych plików zwróci wiersz nagłówkowy i jeden wiersz dla każdej zdefiniowanej reguły. Dla wszystkich trzech typów zapory, linia nagłówkowa zawiera na końcu dziesiętną reprezentację odpowiedniej zasady (jedna z IP_FW_F_ACCEPT, IP_FW_F_ACCEPT | IP_FW_F_MASQ, IP_FW_F_ICMPRPL, lub 0).
Każda następna linia pokazuje zawartość reguły w następującej kolejności: adres źródłowy i maska, adres docelowy i maska, adres interfejsu, flagi, numer portu źródłowego i docelowego, liczniki pakietów i bajtów, listę portów, maskę sumy logicznej dla TOS i maskę różnicy symetrycznej dla TOS. Adresy IP i maski są wyświetlone jako 8 cyfr heksadecymalnych, maski TOS jako 2 cyfry heksadecymalne poprzedzone odpowiednio A i X. Pozostałe wartości wyświetlone są w formacie dziesiętnym. Poszczególne pola rozdzielone są spacjami, znakiem '/' (adres i odpowiadająca mu maska), lub znakiem '->' (pary adresów/masek źródłowych i docelowych).
Pliki można również otwierać w trybie odczyt/zapis (tylko root może to zrobić). W tym przypadku, liczniki pakietów i bajtów we wszystkich regułach danej kategorii będą wyzerowane po wyświetleniu ich bieżącej wartości.
Plik /proc/net/ip_masquerade zawiera wszystkie ustawienia jądra związane z maskowaniem. Po wierszu nagłówkowym, każda maskowana sesja jest opisana w osobnej linii za pomocą następujących po sobie wpisów, rozdzielonych spacją lub znakiem źródłowy adres IP i numer portu, docelowy adres IP i numer portu, nowy adres portu, początkowy numer sekwencyjny do dodawania wartości różnicowej, wartość różnicowa, poprzednia wartość różnicowa, oraz czas wygaśnięcia w jednostce jiffie (1/HZ sekundy). Wszystkie adresy i wartości numeryczne podane są w formacie heksadecymalnym, z wyjątkiem ostatnich trzech wpisów, które są w formacie dziesiętnym.
PLIKI¶
/proc/net/ip_acct
/proc/net/ip_input
/proc/net/ip_output
/proc/net/ip_forward
/proc/net/ip_masquerade
ZOBACZ TAKŻE¶
16 lutego 1996 |