IPCHAINS(8)

NAZWA
ipchains - administracja zaporą ogniową IP (IP firewall)

SKŁADNIA
ipchains -[ADC] łańcuch specyfikacja-reguły [opcje]
ipchains -[RI] łańcuch num-reg specyfikacja-reguły [opcje]
ipchains -D łańcuch num-reg [opcje]
ipchains -[LFZNX] [łańcuch] [opcje]
ipchains -P łańcuch cel [opcje]
ipchains -M [ -L | -S ] [opcje]

OPIS
Ipchains jest używany do ustawiania, podtrzymywania i przeglądania reguł zapory ogniowej w jądrze Linuksa. Te reguły możemy podzielić na 4 różne kategorie: łańcuch wejściowy (IP input chain), łańcuch wyjściowy (IP output chain), łańcuch przekazowy (IP forwarding chain) i łańcuchy zdefiniowane przez użytkownika. Dla każdej z tych kategorii utrzymywana jest oddzielna tabela reguł, z których każda może odnosić się do jakiegoś łańcucha reguł zdefiniowanego przez użytkownika. Zobacz ipfw(4), by dowiedzieć się więcej szczegółów.

CELE
Reguła ścianki ogniowej określa kryteria dotyczące pakietu i celu. Jeśli pakiet nie pasuje do danej regułki, to sprawdzana jest następna w danym łańcuchu; jeśli pakiet pasuje wtedy następna regułka jest określana przez wartość celu, która może być nazwą łańcucha zdefiniowanego przez użytkownika albo też jedną ze specjalnych wartości ACCEPT, DENY, REJECT, MASQ, REDIRECT lub RETURN.

ACCEPT oznacza, że należy przepuścić pakiet. DENY oznacza, że należy pakiet odrzucić. REJECT działa podobnie jak odrzucenie, ale jest bardziej "uprzejmy" i łatwiejszy do wyśledzenia, ponieważ dodatkowo wysyłany jest do nadawcy zwrotny komunikat ICMP informujący go, że pakiet nie został przyjęty. (Zauważ, że DENY i REJECT są tożsame jeśli mamy do czynienia z pakietami ICMP).

MASQ jest właściwy tylko dla łańcuchów przekazowych (forwarding) i zdefiniowanych przez użytkownika. Może być użyty tylko kiedy jądro jest skompilowane z włączoną definicją CONFIG_IP_MASQUERADE. Przy użyciu tego rodzaju celu wychodzące (lub przechodzące przez maszynę, np. pełniącą funkcję bramki) pakiety będą maskowane, tzn. w ten sposób zostaną podmienione ich adresy nadawcy jakby pochodziły one z maszyny lokalnej. Potem przychodzące, zwrotne pakiety stanowiące odpowiedzi na podmienione będą automatycznie rozpoznawane i "demaskowane" z pominięciem łańcucha przekazowego.

REDIRECT jest właściwy tylko dla łańcuchów wejściowych i zdefiniowanych przez użytkownika i może być użyty tylko kiedy jądro jest skompilowane z włączoną definicją CONFIG_IP_TRANSPARENT_PROXY. W związku z tym pakiety będą przekierowywane do lokalnego gniazda, nawet jeśli były one skierowane do odległej maszyny. Jeśli podany jest port przekierowania 0, który jest domyślną wartością to port docelowy pakietu będzie użyty jako port przekierowawczy. Kiedy ten cel jest użyty to podany może być opcjonalnie dodatkowy argument (numer portu właśnie).

Jeśli osiągnięty zostaje koniec zdefiniowanego przez użytkownika łańcucha albo wystąpi regułka z celem o nazwie RETURN to sprawdzana jest następna reguła w poprzednim (wywołującym) łańcuchu. Jeśli osiągnięty zostaje koniec wbudowanego łańcucha, albo też wystąpi reguła z celem o nazwie RETURN to dalszy los pakietu zależy od celu określonego przez politykę łańcucha.

OPCJE
Opcje, które są rozpoznawane przez ipchains, możemy podzielić na kilka różnych grup.

  KOMENDY
Te opcje określają specyficzne działanie, które ma być dokonane; tylko jedna z tych opcji może być podana w linii komend, z wyjątkiem opcji opisanych poniżej. Dla wszystkich tzw. długich opcji i długich wersji komendy musisz wprowadzić jedynie tyle pierwszych znaków, żeby ipchains potrafiło odróżnić nazwę podawanej opcji od innych.

-A, --append
    Dołącza jedną lub więcej reguł do końca podanego łańcucha. Kiedy nazwy źródeł i/lub celów odnoszą się do więcej niż jednego adresu to reguła będzie dodana dla każdej możliwej kombinacji tego adresu.

-D, --delete
    Usuwa jedną lub więcej reguł z podanego łańcucha. Są tu dwie wersje tej komendy: reguła może być określona za pomocą jej numeru w łańcuchu (zaczynając od 1 dla pierwszej reguły) lub za pomocą podanej reguły, do której usuwana pasuje.

-R, --replace
    Zamienia regułę w wybranym łańcuchu. Jeśli nazwy źródła i/lub przeznaczenia odnoszą się do wielu różnych adresów to komenda zawiedzie. Reguły są ponumerowane poczynając od 1.

-I, --insert
    Wstawia jedną lub więcej reguł do określonego łańcucha. Regułę wskazuje się za pomocą jej numeru. Jeśli więc numerem reguły jest 1 to reguła lub reguły są wstawiane na początek łańcucha.

-L, --list
    Wypisuje wszystkie reguły w podanym łańcuchu. Jeżeli nie wyszczególniono żadnego łańcucha, to pokazywane są wszystkie. Jest poprawne podanie opcji -Z (zero), by nie istniała konieczność/możliwość podawania łańcucha. Dokładne wyjście zależy od innych wprowadzonych argumentów.

-F, --flush
    Opróżnia podany łańcuch. Jest to odpowiednik usunięcia wszystkich reguł po kolei.

-Z, --zero
    Zeruje liczniki pakietów i bajtów we wszystkich regułkach. Jest poprawne podanie opcji -L, --list (list), aby ujrzeć zawartości liczników tuż przed ich oczyszczeniem; jeśli jest to wykonane, to nie może być podany żaden konkretny łańcuch. (będą one wszystkie wyświetlone i oczyszczone).

-N, --new-chain
    Tworzy nowy, zdefiniowany przez użytkownika łańcuch pod podaną nazwą. Musi to być nazwa unikatowa, nie przypisana do żadnego istniejącego łańcucha.

-X, --delete-chain
    Usuwa podany łańcuch zdefiniowany przez użytkownika. Nie może być żadnych odnośników do łańcucha w innych regułkach (jeśli są to trzeba je usunąć lub zastąpić odpowiednimi regułkami zanim łańcuch będzie można usunąć). Jeśli nie podany jest żaden argument to potraktowane zostanie to jako żądanie usunięcia wszystkich niewbudowanych łańcuchów.

-P, --policy
    Ustawia politykę łańcucha podanego celu. Obejrzyj sekcję CELE, żeby poznać możliwe cele. Tylko łańcuchy niedefiniowane przez użytkownika mogą mieć tzw. polityki, jednakże ani łańcuchy wbudowane, ani łańcuchy zdefiniowane przez użytkownika nie mogą być celami polityki.

-M, --masquerading
    Opcja ta umożliwia przeglądanie połączeń obecnie maskowanych (w połączeniu z opcją -L) lub ustawianie parametrów maskujących jądra (w połączeniu z opcją -S).

-S, --set tcp tcpfin udp
    Zmienia wartość czasu oczekiwania używaną przy maskowaniu. Polecenie to wymaga zawsze 3 parametrów, reprezentujących wartości czasów przeterminowania (w sekundach) dla sesji TCP, sesji TCP po odebraniu pakietu FIN i tak samo dla pakietów UDP. Wartość czasu ustawiona na 0 oznacza, że powinien zostać niezmieniony poprzednio ustawiony parametr. Opcja ta jest dopuszczalna tylko w kombinacji z flagą -M.

-C, --check
    Sprawdza jak podany pakiet byłby obsłużony przez podany łańcuch. Jest to niezwykle użyteczne, gdy chodzi o testy, ponieważ wykonywane są te same działania, których normalnie dokonuje jądro by sprawdzić "prawdziwy" pakiet. Może być to użyteczne, gdy trzeba sprawdzić łańcuchy zdefiniowane przez użytkownika jak też łańcuchy wbudowane. Przy konstruowaniu kontrolnego pakietu używać można takich samych argumentów jak przy określaniu reguł zapory ogniowej. W szczególności wymaganymi flagami są -s (adres źródła), -d (adres przeznaczenia), -p (protokół) i -i (interfejs).

-h, --help
    Pomoc. Podaje (na razie bardzo uproszczony) opis składni komendy. Użycie ze słowem icmp, spowoduje wypisanie listy nazw ICMP.

-V, --version
    Wyświetla numer wersji ipchains.

  PARAMETRY
Poniższe parametry dopełniają określanie reguł (używane z poleceniami add, delete, replace, append i check).

-p, --protocol[!] protokół
    Protokół reguły lub pakietu do sprawdzenia. Podany protokół może być jednym z tcp, udp, icmp, lub all, lub może być wartością liczbową, reprezentującą jeden z tych lub inny protokół. Dopuszczalna jest też nazwa protokołu z pliku /etc/protocols. Argument "!" przez protokołem odwraca próbę. Wartość 0 odpowiada nazwie all. Protokół all odpowiada wszystkim protokołom i jest ustawieniem domyślnym, gdy opcja ta jest pominięta. All nie może być użyte w połączeniu z komendą check.

-s, --source, --src [!] adres[/maska] [!] [port[:port]]
    Określenie źródła. Adres może być nazwą hosta, nazwą sieci lub też samym adresem IP. Parametr maska może być zarówno maską sieci jak i samym numerem, określającym pierwszą liczbę z lewej strony maski sieci. Wobec tego, maska 24 odpowiada 255.255.255.0. Argument "!" przed podanym adresem odwraca znaczenie tego adresu.

    W skład źródła może wchodzić określenie numeru portu lub typu komunikatu ICMP. Może to być zarówno nazwa usługi, numeru portu, typu ICMP w postaci liczby, jak i jedna z nazw typów ICMP, które można uzyskać wydając polecenie
     ipchains -h icmp
    Zauważ, że wiele z tych nazw ICMP odnosi się do obydwu - typu i kodu, to znaczy, że każdy kod ICMP po fladze -d jest niepoprawny. W dalszej części tego paragrafu, port oznacza zarówno określenie numeru portu, jak i typ komunikatu ICMP. Może być również podany zakres alternatywny, zapisywany w formacie port:port. Jeśli pierwszy port jest pominięty to przypisywana jest mu wartość "0"; jeśli drugi jest ominięty to przypisywana jest wartość "65535".

    Porty mogą być podane tylko w połączeniu z protokołami tcp, udp, lub icmp. Znak "!" przed określeniem portu odwraca znaczenie. Gdy podano komendę check, wymagającą tylko jednego portu, i jeżeli podano flagę -f (fragmentuj) to nie są dopuszczalne żadne porty.

--source-port [!] [port[:port]]
    To pozwala na osobne podanie portu źródłowego lub zakresu portów. Patrz opis flagi -s powyżej po więcej szczegółów. Flaga --sport jest zamiennikiem dla tej opcji.

-d, --destination, --dst [!] adres[/maska] [!] [port[:port]]
    Określenie miejsca przeznaczenia. Obejrzyj opis flagi -s (źródło), by uzyskać szczegółowy opis składni. W przypadku ICMP, w którym nie istnieje pojęcie portów, "port docelowy" odnosi się do liczbowego kodu ICMP.

--destination-port [!] [port[:port]]
    To pozwala na osobne podawanie portów. Obejrzyj opis flagi -s po więcej szczegółów. Flaga --dport jest zamiennikiem dla tej opcji.

--icmp-type [!] typename
    Pozwala to na podanie typu ICMP (użyj w połączeniu z opcją -h icmp, by ujrzeć poprawne nazwy typów ICMP). Jest często bardziej wygodne dołączać tę opcję przy podawaniu miejsc przeznaczenia.

-j, --jump cel
    Określa cel reguły; np. co zrobić jeśli pakiet spełnia podane w regule kryteria. Celem może być łańcuch zdefiniowany przez użytkownika (oczywiście nie ten, w którym jest ta reguła) lub jeden z celów specjalnych, które natychmiast decydują o losie pakietu. Jeśli pominiemy w regule tę opcję, to spełnienie przez pakiet podanych kryteriów nie będzie miało wpływu na jego los, ale liczniki tej reguły będą zwiększone.

-i, --interface [!] nazwa
    Opcjonalna nazwa interfejsu, przez który pakiet jest odbierany bądź przez który pakiet będzie wysłany. Gdy tej opcji nie podamy to rozważany jest ciąg pusty, który ma specjalne znaczenie i pasuje do każdej nazwy interfejsu. Gdy przed nazwą interfejsu użyjemy argumentu "!" to odwraca to sens opcji. Jeśli nazwa interfejsu kończy się znakiem "+" to spełnione jest to dla wszystkich interfejsów rozpoczynających się podaną nazwą.

[!]  -f, --fragment
    A to oznacza, że reguła odnosi się jedynie do drugiego i kolejnych fragmentów sfragmentowanych pakietów. Odkąd nie ma możliwości by powiedzieć o źródle lub portach docelowych takiego pakietu (albo typu ICMP), pakiet ten nie będzie pasował do żadnych reguł określających go. Gdy argument "!" poprzedza flagę "-f" sens jest odwrócony.

  INNE OPCJE
Poniższe dodatkowe opcje mogą także być użyte:

-b, --bidirectional
    Tryb dwukierunkowy. Reguła będzie pasować do pakietów IP w dwie strony; da to taki sam efekt jak powtarzanie tej samej reguły dla źródła i przeznaczenia zamienionych ze sobą. Proszę zauważyć, że NIE oznacza to, że jeżeli pakiety TCP SYN będą dopuszczone na wyjściu, to reguła -b puści pakiety nie-SYN na wejściu: reguła odwrotna jest dokładnie taka sama jak reguła, która została wprowadzona. Oznacza to, że zazwyczaj lepiej jest po prostu unikać flagi -b i otwarcie podawać wszystkie reguły.

-v, --verbose
    Krzykliwe wyjście. Opcja ta powoduje, że komenda list pokazuje adres interfejsu, opcje reguły (jeśli są) i maski TOS. Pakiet i liczniki bajtów są także wypisywane, z przedrostkiem 'K', 'M' lub 'G' odpowiednio dla 1000, 1,000,000 i 1,000,000,000 multiplikatorów (ale spójrz jeszcze na flagę -x aby to zmienić). Gdy użyte jest to w kombinacji z -M, to podana będzie też informacja odnosząca się do numerów sekwencji delta. Przy dołączaniu, wstawianiu, usuwaniu i zastępowaniu, powoduje to wyświetlenie szczegółowej informacji dotyczącej reguły lub reguł.

-n, --numeric
    Wyjście numeryczne. Adresy IP i numery portów będą wypisywane w formacie liczbowym. Domyślnie, program będzie próbował wyświetlać je jako nazwy hostów, nazwy sieci lub usług (kiedy tylko dają się zastosować).

-l, --log
    Włącza w jądrze logowanie pasujących pakietów. Gdy ta opcja jest ustawiona dla reguły, jądro Linuksa wypisze informację dotyczącą wszystkich pasujących pakietów (często np. pasujących nagłówków IP) poprzez printk().

-o, --output [maxsize]
    Kupiuje pasujące pakiety do urządzenia w przestrzeni użytkownika. Jest to obecnie czymś istotnym dla twórców, którzy chcą bawić się w efekty zapory ogniowej w przestrzeni użytkownika. Opcjonalny argument maxsize może być użyty by limitować maksymalną liczbę bajtów z pakietu, z którego zostaną skopiowane. Opcja ta jest poprawna tylko wtedy, gdy jądro zostało skompilowane z ustawieniem CONFIG_IP_FIREWALL_NETLINK.

-m, --mark markvalue
    Zaznacza pasujące pakiety. Pakiety mogą być oznaczone 32-bitową wartością bez znaku, który może (pewnego dnia) zmienić metodę ich wewnętrznego traktowania. Jeśli nie jesteś kernel hackerem nie powinieneś zawracać sobie tym głowy. Jeśli ciąg markvalue zaczyna się znakiem + albo - to wtedy wartość będzie dodana lub też odjęta do/od obecnej wartości zaznaczenia pakietu (która zaczyna się zerem).

-t, --TOS andmask xormask
    Maski używane przy modyfikowaniu pola TOS w nagłówku IP. Gdy pakiet pasuje do reguły, na jego polu TOS i pierwszej masce jest najpierw obliczany iloczyn bitowy, a nastepnie różnica symetryczna z drugą maską. Maski powinny być podane jako szesnastkowe wartości ośmiobitowe. Jako że nie wolno zmieniać LSB pola (RFC 1349), wartości TOS, które spowodują taką zmianę są odrzucane tak samo, jak dowolne reguły ustawiające zawsze więcej niż jeden bit TOS. Reguły, które mogą ustawiać więcej niż jeden bit TOS dla niektórych pakietów powodują ostrzeżenia (wysyłane na standardową diagnostykę), które można zignorować, jeśli wiadomo, że pakiety o takich wartościach TOS nigdy nie osiągną danej reguły. Oczywiście manipulacja TOS jest nieistotna, gdy celem danej reguły jest DENY lub REJECT.

-x, --exact
    Rozszerzone wartości numeryczne. Wyświetla dokładną wartość pakietu i liczników bajtów, zamiast tylko podawać zaokrągloną wartość w K (wielokrotności 1000), M (wielokrotności 1000K) czy G (wielokrotności 1000M). Opcja jest odpowiednia tylko dla polecenia -L.

[!] -y, --syn
    Dopasowuje tylko te pakiety TCP, które mają ustawiony bit SYN oraz wyczyszczone bity ACK i FIN. Takie pakiety są używane do inicjalizacji połączenia TCP, więc na przykład blokowanie takich pakietów docierających do interfejsu spowoduje, że przychodzące połączenia TCP będą odrzucane, ale nie będzie miało żadnego wpływu na połączenia wychodzące. Opcja ta ma znaczenia tylko jeżeli typem protokołu jest TCP. Jeżeli "-y" zostanie poprzedzone przez flagę "!", to sens tej opcji zostanie odwrócony.

--line-numbers
    Wyświetlając reguły, wyświetla - na początku każdej reguły - numery linii odpowiadające pozycji reguły w łańcuchu.

--no-warnings
    Wyłącza wypisywanie ostrzeżeń.

PLIKI
/proc/net/ip_fwchains
/proc/net/ip_masquerade

DIAGNOSTYKA
Różne komunikaty o błędach są wypisywane na standardowe wyjście błędów. Kodem wyjścia jest 0, jeżeli wszystko się powiedzie. Błędy, które wydają się być spowodowane błędnymi lub źle użytymi argumentami linii poleceń, spowodują zwrócenie kodu wyjścia 2, a wszystkie inne błędy powodują zwrócenie kodu wyjścia 1.

USTERKI

Jeżeli wejście programu jest terminalem, reguła jest dokładana bądź dołączana do łańcucha przekazowego, a przekazywanie IP nie wydaje się być włączone i nie podano opcji --no-warnings, to na standardowe wyjście jest wypisywane ostrzeżenie o tym, że przekazywanie nie będzie działać, dopóki nie zostanie poprawione. Jest to po to, aby pomóc użytkownikom nieświadomym tego wymogu (którego nie było w jądrach serii 2.0).

Nie można skasować liczników pakietów i bajtów w jednym tylko łańcuchu. Wynika to z ograniczeń jądra.

Wykrywanie zapętleń nie jest obsługiwane w ipchains; pakiety w pętli są upuszczane i notowane, lecz jest to jedyna rzecz jakiej się o tym dowiesz jeśli przypadkowo wytworzysz jakąś pętlę.

Opis efektów zaznaczenia pakietu jest ogólnikowy, dopóki nie zostanie wydana dokumentacja opisująca nowe procedury obsługi pakietów jądra 2.1.

Nie ma sposobu na to by wyzerować liczniki polityki (np. te we wbudowanych łańcuchach).

UWAGI
To ipchains bardzo się różni od ipfwadm autorstwa Josa Vosa, jako że używa nowo powstałych tak zwanych drzew zapory ogniowej IP. Funkcjonalnie jest zastępnikiem ipfwadm i generalnie zawsze obsługuje tamte polecenia. Wierzę, że nowe nazwy poleceń są bardziej racjonalne. Jest też jednakże parę zmian, których powinieneś być świadom.

Fragmenty są obsługiwane w inny sposób. Wszystkie fragmenty po pierwszym są zazwyczaj przepuszczane (co zwykle jest bezpieczne); wtedy mogą być filtrowane. Oznacza to, że prawdopodobnie powinieneś dodać jawną regułę akceptującą fragmenty jeśli dokonujesz konwersji. Spójrz więc na stare reguły zliczające, które sprawdzają porty źródłowe i docelowe 0xFFFF (0xFF w przypadku pakietów ICMP) - był to stary sposób rozliczania fragmentów.

Reguły zliczające są teraz w prosty sposób zintegrowane z łańcuchami wejściowym i wyjściowym; możesz symulować dawne zachowanie w taki sposób:
 ipchains -N acctwe
 ipchains -N acctwy
 ipchains -N acctwewy
 ipchains -I input -j acctwewy
 ipchains -I input -j acctwe
 ipchains -I output -j acctwewy
 ipchains -I output -j acctwy
Stworzy to trzy zdefiniowane przez użytkownika łańcuchy, acctwe, acctwy i acctwewy, które mogą zawierać dowolne reguły zliczające (reguły te powinny być podane bez flagi -j, więc pakiety te są w prosty sposób przepuszczane w nienaruszonej postaci).

Cel MASQ lub REDIRECT przy starciu z brakiem miejsca na operacje jądra (np. przy regule przekazującej lub wejściowej) sprawi, że do syslog zostanie wysłana odpowiednia wiadomość a pakiet będzie odrzucony.

Stary sposób rozpoznawania SYN i ACK (który był poprzednio ignorowany dla pakietów innych niż TCP) uległ zmianie; opcja SYN nie jest już poprawna dla reguł innych niż dotyczących TCP.

Opcja rozpoznawania ACK ( -k) nie jest już wspierana; kombinacja ! i -y jest jej zastępnikiem).

Nie jest już możliwe określenie maski TOS, która ustawi lub wyzeruje ostatni znaczący bit TOS; poprzednio maski TOS były po cichu zerowane przez jądro jeśli próbowały tego dokonać.

Flaga -b jest teraz w prosty sposób obsługiwana poprzez wstawienie lub usunięcie pary reguł, w tym jednej z odwróconym określeniem adresu źródła i adresu docelowego.

Nie ma możliwości określenia interfejsu za pomocą jego adresu: użyj nazwy.

ZOBACZ TAKŻE
ipfw_chains(4), ipchains-save(8), ipchains-restore(8)

AUTOR
Paul ``Rusty'' Russell <ipchains@rustcorp.com>. Podziękowania dla Hansa Perssona za dokonanie szczegółowej korekty; chciałbym, aby poprawiał wszystkie moje przyszłe dokumenty!