Provided by: manpages-pl_20060617-2_all bug

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)