Provided by:
manpages-pl_20060617-2_all 
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ł:
zliczajce (urządzenie wejściowe)
zapora wejciowa (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 pakietw 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 wyjciow (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)
16 lutego 1996 IPFW(4)