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ł:
    zliczające (urządzenie wejściowe)
    zapora wejściowa (urządzenie wejściowe)
W tym przypadku, urządzenie (adres interfejsu), które jest używane przy sprawdzaniu dopasowania pakietu IP do reguły, jest wyświetlone w nawiasach. Jeśli pakiet ma być przekazany do zewnętrznej stacji, przejdzie również przez:
    zeporę pakietów przekazywanych (urządzenie wejściowe)
W następnym kroku opcjonalnie pakiet zostanie zamaskowany. Odpowiedzi na pakiety zamaskowane nie będą przechodzić przez zaporę pakietów przekazywanych (przejdą jednak zarówno przez wejściową, jak i wyjściową zaporę). Wszystkie pakiety wysyłane z jednego z lokalnych interfejsów sieciowych, tworzone lokalnie, bądź przekazywane, będą przechodzić przez:
    zaporę wyjściową (urządzenie wyjściowe)
    zliczanie (urządzenie wyjściowe)
Należy zauważyć, że pakiety maskowane będą przechodzić przez zaporę wyjściową i reguły zliczające z nowymi nagłówkami pakietów (po przejściu przez zaporę wejściową i przekazującą z oryginalnymi nagłówkami). Odpowiedzi na maskowane pakiety będą również posiadać różne nagłówki w trakcie przechodzenia przez reguły wejściowe i 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
    Dodanie reguły do jednej z list reguł zliczających lub zaporowych. Zależnie od polecenia, reguła jest dodawana odpowiednio do listy reguł zliczających, wejściowych, wyjściowych, przekazujących. Nowa reguła dodawana jest na końcu listy. Dane przekazywane z tymi poleceniami mają strukturę ip_fw , definiującą treść nowej reguły.

IP_ACCT_INSERT
IP_FW_INSERT_IN
IP_FW_INSERT_OUT
IP_FW_INSERT_FWD
    Polecenia te są równoważne poleceniom dodawania, z tym wyjątkiem, że nowa reguła wstawiana jest na początku listy.

IP_ACCT_DELETE
IP_FW_DELETE_IN
IP_FW_DELETE_OUT
IP_FW_DELETE_FWD
    Usunięcie reguły z jednej z list reguł zliczających lub zaporowych. Zależnie od polecenia, reguła zostanie usunięta odpowiednio z listy reguł zliczających, wejściowych, wyjściowych lub przekazujących. Przekazywane z tym poleceniem dane mają strukturę ip_fw , definiującą treść pakietu przeznaczonego do usunięcia. Pierwsza reguła spełniająca podane kryteria zostanie usunięta z listy.

IP_ACCT_ZERO
IP_FW_ZERO_IN
IP_FW_ZERO_OUT
IP_FW_ZERO_FWD
    Wyzerowyje liczniki pakietów i bajtów odpowiednio we wszystkich regułach list zliczających, wejściowych, wyjściowych i przekazujących. Z nieznanych powodów, z tym poleceniem w charakterze danych musi być przekazana (dowolna) liczba całkowita. Aby dowiedzieć się, jak pojedynczo wyświetlać i zerować zawartość poszczególnych liczników, zobacz opis plików /proc/net

IP_ACCT_FLUSH
IP_FW_FLUSH_IN
IP_FW_FLUSH_OUT
IP_FW_FLUSH_FWD
    Usunięcie wszystkich reguł odpowiednio z listy reguł zliczających, wejściowych, wyjściowych i przekazujących. Z nieznanych powodów, z tym poleceniem w charakterze danych musi być przekazana (dowolna) liczba całkowita.

IP_FW_POLICY_IN
IP_FW_POLICY_OUT
IP_FW_POLICY_FWD
    Zmiana domyślnej zasady odpowiednio dla zapory wejściowej, wyjściowej lub przekazującej. Nowa zasada przekazywana jest jako liczba całkowita o następującej dopuszczalnej wartości: IP_FW_F_ACCEPT (zaakceptuj pakiet), IP_FW_F_ACCEPT | IP_FW_F_MASQ (zaakceptuj pakiet i dodatkowo użyj maskowania), IP_FW_F_ICMRPL (odrzuć pakiet przez wysłanie komunikatu ICMP host unreachable do nadawcy) lub 0 (odrzuć pakiet bez żadnego powiadomienia). Zasada jest używana w przypadku gdy żadna z istniejących reguł zaporowych na odpowiadającej liście nie pasuje do analizowanego pakietu.

IP_FW_CHECK_IN
IP_FW_CHECK_OUT
IP_FW_CHECK_FWD
    Sprawdzenie, czy pakiet byłby zaakceptowany (z maskowaniem lub bez), odrzucony z potwierdzeniem bądź odrzucony bez potwierdzenia przez zaporę wejściową (IP_FW_CHECK_IN), zaporę wyjściową (IP_FW_CHECK_OUT), lub zaporę przekazującą (IP_FW_CHECK_FWD). Przekazywane z poleceniem dane mają strukturę ip_fwpkt , definiującą nagłówki pakietów i adres interfejsu.

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
    Nagłówek TCP, UDP, lub ICMP, połączone w unii o nazwie fwp_protoh. Zajrzyj do <linux/tcp.h>, <linux/udp.h>, lub <linux/icmp.h> po szczegółowy opis odpowiednich struktur.

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 ':' (pary adres/numer portu): nazwa protokołu ("TCP" lub "UDP"), ź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
setsockopt(2), socket(2), ipfwadm(8)