IPCHAINS(8)

JMÉNO
ipchains - Konfigurace IP firewallu

POUŽITÍ
ipchains -[ADC] řetězec pravidlo [volby]
ipchains -[RI] řetězec číslo_pravidla pravidlo [volby]
ipchains -D řetězec číslo_pravidla [volby]
ipchains -[LFZNX] [řetězec] [volby]
ipchains -P řetězec cíl [volby]
ipchains -M [ -L | -S ] [volby]

POPIS
Ipchains slouží k nastavení, udržování a sledování firewallových pravidel v Linuxovém jádru. Tato pravidla lze rozdělit do 4 kategorií: pravidla pro pakety příchozí (input chains), odchozí (output chains), pakety předávané dále (forward chains) a pravidla definovaná uživatelem. Pro každou z těchto kategorií je udržována samostatná tabulka pravidel, z nichž kterékoliv může odkazovat na další, uživatelem definovaná pravidla. Další podrobnosti viz. ipfw(4).

CÍLE (TARGETS)
Firewallové pravidlo určuje jednak vlastnosti paketu a dále jeho cíl. Pokud paket danému pravidlu svými vlastnosti neodpovídá, je testován následujícím pravidlem; pokud vyhovuje, bude zkontrolován pravidlem určeným parametrem cíl (target), což může být pravidlo, které nadefinoval uživatel nebo jedna ze speciálních hodnot ACCEPT, DENY, REJECT, MASQ, REDIRECT, nebo RETURN.

ACCEPT znamená, že paket může firewallem projít. DENY znamená, že se paket zahodí. REJECT je v podstatě to samé jako DENY, ale je snadněji laditelný a vůči druhé straně slušnější, neboť jí odešle zpět ICMP zprávu informující o zahození paketu. (pozor: DENY and REJECT znamenají pro ICMP pakety totéž). [Pozor: není to pravda; nastavení REJECT pro ICMP učiní ICMP port nedostupným!]

MASQ je použitelný pouze v uživatelem definovaných pravidlech a pravidlech pro průchod paketů (forward chains) a pouze v případě, že jádro bylo zkompilováno s volbou CONFIG_IP_MASQUERADE. Takové paketu budou upraveny (maškarádovány) jakoby pocházely z lokálního počítače a pakety přicházející zpět budou automaticky odmaškarádovány aniž by musely projít sadou pravidel pro průchod.

REDIRECT lze použít jen v pravidlech pro vstup (input chains) a v uživatelských pravidlech. Pro použití je nutné mít jádro zkompilované s volbou CONFIG_IP_TRANSPARENT_PROXY. Tyto pakety budou přesměrovány na místní port pouze v případě, že byly odeslány na vzdálený počítač. Pokud je přesměrování nastaveno na port 0 (výchozí hodnota), bude cílový port týž jako měl být port na vzdáleném počítači. Jako parametr však lze použít číslo portu, na který má být paket přesměrován.

Jestliže byla vyčerpána všechna uživatelská pravidla nebo vyhovuje pravidlo s cílem RETURN, pak se pokračuje dalším pravidlem v předchozím (volajícím) řetězci pravidel. Pokud se dojde až na konec vnořeného řetězce pravidel nebo vyhoví pravidlo s cílem RETURN, pak je další cesta paketu dána cílem pro celý řetězec pravidel (chain policy).

VOLBY (OPTIONS)
Volby programu ipchains se dělí do několika různých skupin.

  PŘÍKAZY (COMMANDS)
Příkazy specifikují různé akce, které se mají provést; jedním příkazem může být provedena pouze jedna jediná akce; ostatní by musely být provedeny postupně pomocí dalších příkazů. Každou dlouhou verzi příkazu a označení volby lze zkrátit; je nutno použít tolik znaků, aby ipchains dokázal jednoznačně určit, o kterou volbu se jedná.

-A, --append
    Přidá jedno či více pravidel na konec vybraného řetězce pravidel. Pokud lze označení odesílatele a/nebo příjemce paketu přeložit na více než jednu adresu, bude pravidlo přidáno do všech možných kombinací adres.

-D, --delete
    Smaže jedno nebo více pravidel z určeného řetězce pravidel. Tento příkaz má dvě syntaxe: příkaz může být určen buď pořadovým číslem pravidla v řetězci (první má číslo 1) nebo může být pravidlo určené ke smazání celé vypsáno (najde se odpovídající).

-R, --replace
    Nahradí pravidlo ve vybraném řetězci. Pokud není jednoznačně určen adresát a/nebo příjemce, příkaz selže. Pravidla jsou číslována od 1.

-I, --insert
    Vloží na určené místo ve vybraném řetězci jedno či více pravidel. Pokud má pravidlo číslo 1, pak bude vloženo na začátek řetězce.

-L, --list
    Vypíše všechna pravidla v řetězci. Pokud není určen řetězec, pak se vypíší všechna pravidla. Lze také použít volbu -Z (zero), kdy nemůže být určen žádný řetězec. Výstup příkazu je pak dán dalšími argumenty.

-F, --flush
    Příkaz smaže všechna pravidla v řetězci.

-Z, --zero
    Vynuluje počitadla paketů a bytů ve všech řetězcích. Lze použít volbu -L, --list (list) pro vypsání počitadel před jejich vynulováním; pokud je to provedeno, nelze zadat určitý řetězec (budou všechny zobrazeny a ihned vynulovány).

-N, --new-chain
    Vytvoří nový řetězec (uživatelský) se zadaným jménem. Nesmí existovat cíl se stejným názvem.

-X, --delete-chain
    Smaže určený uživatelem nadefinovaný řetězec pravidel. Na tento řetězec nesmí existovat žádné odkazy (pokud existují pravidla odkazující na takové pravidlo, musí být nejdříve odstraněna nebo nahrazena novými). Pokud není zadán žádný parametr, dojde k odstranění všech řetězců, které byly definovány uživatelem.

-P, --policy
    Nastaví cíl pro zadaný řetězec. Použitelné parametry: viz kapitola TARGETS Tento parametr lze použít pouze u neuživatelských řetězců. Cílem nesmí být žádný z řetězců (ani uživatelský ani neuživatelský).

-M, --masquerading
    Tato volba zobrazí všechny právě maškarádovaná spojení (ve spojení s volbou -L option) nebo nastaví parametry jádra pro maškarádování (s volbou) -S

-S, --set tcp tcpfin udp
    Mění hodnoty prodlev u maškarádování. Příkaz musí mít 3 parametry, které určují prodlevu (v sekundách) pro TCP spojení, TCP spojení po obdržení FIN paketu a pakety UDP. Nulová hodnota některého z parametrů znamená, že se má ponechat současná hodnota. Tuto volbu lze použít pouze s parametrem -M

-C, --check
    Zkontroluje daný paket vybraným řetězcem pravidel. Je to užitečné pro testování zda jdou k testování tohoto paketu použity stejné rutiny jádra jako k testování "skutečných" síťových paketů. Lze použít pro zkoušení jak uživatelských řetězců tak řetězců vestavěných. Stejné parametry jako se používají pro určení pravidel se používají k vytvoření paketu, který má být otestován. Parametry -s (source [odesílatel]), -d (destination [příjemce]), -p (protocol [protokol]), and -i (interface [síťové rozhraní]) jsou povinné.

-h, --help
    Vypíše stručný popis syntaxe příkazu. Pokud např. následuje slovo icmp, pak je vypsán seznam jmen ICMP.

-V, --version
    Vypíše verzi programu ipchains.

  PARAMETRY
Následující parametry slouží pro specifikaci pravidel (stejně jako se používají v příkazech add, delete, replace, append a check).

-p, --protocol[!] protocol
    Určuje protokol pravidla nebo paketu, který má být zkontrolován. Lze použít následující protokoly: tcp, udp, icmp nebo all. Je možné použít i číselnou hodnotu, která reprezentuje jeden z těchto protokolů nebo také jméno protokolu z /etc/protocols. Argument "!" před protokolem invertuje význam. Číslo 0 je ekvivalentem k all. Protokol all vyhoví všem protokolům a je použit jako výchozí, pokud není specifikován žádný protokol all nelze použít v žádné kombinace s příkazem check.

-s, --source, --src [!] addresa[/maska] [!] [port[:port]]
    Určení odesílatele. Adresa může to být buď jméno hostitele, jméno sítě nebo IP adresa. Maska může být buď maska sítě nebo číslo, které určuje zleva počet jedniček v masce sítě. Např. maska 24 odpovídá 255.255.255.0. Argument "!" neguje význam.

    Označení odesílatele může obsahovat i port nebo typ ICMP. Lze použít buď jméno služby, číslo portu, číselné označení typu ICMP nebo jedno ze slovních označení typu ICMP, které vypíše příkaz
     ipchains -h icmp
    Mnoho z těchto jmen označuje jak typ tak kód, přičemž ICMP kód je po parametru -d neplatný. Ve zbytku odstavce port znamená buď specifikaci portu nebo typ ICMP. Rozsah portů lze určit použitím formátu port:port. Pokud není zadán první port, je za něj dosazena "0"; při absenci koncového portu je dosazeno "65535".

    Porty lze specifikovat pouze v kombinaci s tcp, udp, nebo icmp protokoly. "!" před označením portu neguje význam. Pokud je použit příkaz check je nutné zadat jeden port a s parametrem -f (fragment) nelze zadat žádný port.

--source-port [!] [port[:port]]
    Tento parametr umožní zvlášť určit zdrojový port nebo rozsah portů. Podrobnosti viz. výše parametr -s --sport

-d, --destination, --dst [!] address[/mask] [!] [port[:port]]
    Určení příjemce. Detaily k syntaxi viz. podrobnosti k parametru -s (source). Pro ICMP které nemá porty, "destination port" označuje numerický ICMP kód.

--destination-port [!] [port[:port]]
    Pomocí této volby lze určit porty. Podrobnosti viz. parametr -s Zkráceně lze tento parametr zapsat --dport

--icmp-type [!] jméno_typu
    Slouží ke specifikaci typu ICMP. (použití -h icmp vypíše platná jména ICMP typů). Je to vhodnější než přidávání do specifikace příjemce.

-j, --jump cíl
    Tento parametr určuje cíl pravidla; tj. co se má s paketem dělat pokud tomuto pravidlu vyhoví. Cílem může být uživatelem definovaný řetězec pravidel (ne však ten jehož součástí je toto pravidlo) nebo jeden ze speciálních cílů, který přímo určuje co se bude s paketem dít dál. Pokud tento parametr chybí, pak i když paket pravidlu vyhoví dojde pouze k inkrementaci počitadla, ale nijak to neovlivní jeho cestu.

-i, --interface [!] name
    Volitelně lze zadat jméno síťového rozhraní skrze které byl paket obdržen (pro pakety testované v řetězci pro vstup - input chain) nebo skrze které bude pokračovat dále (forward chain). Pokud parametr chybí, vyhoví jakékoliv rozhraní. "!" obrací význam. Jestliže označení rozhraní končí znakem "+", pak vyhoví všechna rozhraní která začínají určenými znaky.

[!]  -f, --fragment
    Při použití tohoto parametru budou testovány pouze druhé a další části fragmentovaného paketu. Nelze žádným způsobem určit zdrojový nebo cílový port paketu (nebo typ ICMP), proto paket nevyhoví žádnému pravidlu, které jej bude specifikovat. Znak "!" invertuje význam.

  DALŠÍ VOLBY
Dále je možno použít následující rozšiřující volby:

-b, --bidirectional
    Obousměrný režim. Pravidlu vyhoví IP pakety v obou směrech; Je to totéž jako opakované použití pravidla s prohozeným odesílatelem a příjemcem. Neznamená to, že pokud povolíte TCP SYN pakety ven, tak -b umožní vstup non-SYN paketů dovnitř: zpětná pravidla jsou stále tatáž pravidla, která byla zadána. Z toho vyplývá, že obvykle bývá jednodušší nepoužívat -b a vypsat jednotlivá pravidla.

-v, --verbose
    Upovídaný výstup. Příkaz pro výpis s touto volbou vypíše adresy rozhraní, volby u pravidel (pokud existují) a masky TOS. Dále jsou vypsána počitadla paketů a bytů s příponami 'K', 'M' or 'G' pro 1000, 1,000,000 a 1,000,000,000 násobky (viz. parametr -x pro změnu). V kombinaci s parametrem -M, se navíc vypíší informace související s čísly delta sekvence. Pro připojování, vkládání, mazání a nahrazování dojde k vypsání detailních informací o pravidlech.

-n, --numeric
    Číselný výstup. IP adresy a čísla portů budou vypsána v číselném formátu. Běžně se je program snaží přeložit na jména hostitelů, sítí nebo služeb.

-l, --log
    Zapne logování vyhovujících paketů. Pokud je tato volba u pravidla nastavena, jádro Linuxu bude vypisovat informace (IP hlavičky) o všech vyhovujících paketech přes printk().

-o, --output [maxsize]
    Kopíruje vyhovující pakety na userspace zařízení. Slouží to hlavně vývojářům, kteří by si chtěli hrát s firewally v userspace. Volitelný argument maxsize určuje limit kopírovaných paketu v bytech. Tato volba je platná pouze pokud bylo jádro kompilováno s volbou CONFIG_IP_FIREWALL_NETLINK.

-m, --mark markvalue
    Označování vyhovujících paketů. Pakety mohou být označeny 32bitovou hodnotou, která může (jednou) změnit způsob, jak se s nimi bude manipulovat. Pokud nejste kernel hacker, patrně se o to nebude zajímat. Pokud parametr markvalue začíná "+" nebo "-", pak tato hodnota bude přičtena nebo odečtena od aktuální hodnoty značení paketů (začíná nulou).

-t, --TOS andmask xormask
    Masky používané pro úpravy TOS pole v IP hlavičce. Jestliže paket vyhovuje pravidlu, jeho TOS pole je bitově vynásobeno s první maskou a výsledek je poté bitově sečten s druhou maskou. Maska se zadává jako šestnáctková osmibitová hodnota. Protože LSB v poli TOS musí zůstat nezemněný (RFC 1349), jsou hodnoty TOS, které by mohly změnu způsobit, odmítnuty stejně jako všechna pravidla, která vždy mění více než jeden TOS bit. Pravidla, která nastavují více TOS bitů pro určité pakety, posílají na standardní výstup hlášení, která můžeme ignorovat, pokud víme, že na pakety s takovými hodnotami TOS nebudou tato pravidla aplikována. Je samozřejmé, že manipulace s TOS je bezvýznamná pokud má pravidlo cíl DENY nebo REJECT.

-x, --exact
    Úplná čísla. Vypisuje skutečné hodnoty paketových a bytových počítadel místo jejich zaokrouhlení ve tvaru K (pro 1000násobek), M (1000K), G (1000M). Tato volba má význam pouze s příkazem -L.

[!] -y, --syn
    Vyhovují pouze TCP pakety s nastaveným SYN bitem a nulovými ACK a FIN bity. Tyto pakety jsou používány při žádostech o navázání TCP spojení; např. zablokování takových paketů na rozhraní neumožní příchozí TCP spojení, ale odchozí spojení budou normálně fungovat. Tato volba má význam pouze pokud je používán protokol TCP. Pokud je před -y "!", pak se obrací význam.

--line-numbers
    Při výpisu pravidel přidá čísla řádků na začátky každého pravidla podle jeho umístění v řetězci.

--no-warnings
    Zakáže veškerá hlášení.

SOUBORY
/proc/net/ip_fwchains
/proc/net/ip_masquerade

DIAGNOSTIKA
Nejrůznější chyby jsou zobrazovány na standardním chybovém výstupu. Při správné funkci je návratová hodnota 0. Chyby, které jsou zřejmě způsobeny nesprávnými parametry příkazu mají návratovou hodnotu 2 a ostatní chyby mají návratovou hodnotu 1.

CHYBY

Jestliže je vstupem terminál a je vloženo nebo připojeno pravidlo do řetězce pravidel pro dále předávané pakety (forward chain), není povolen IP forwarding a je použit parametr --no-warnings je na standardní výstup vypsána zpráva, že předávání paketů nebude fungovat dokud nedojde k nápravě. To má pomoci uživatelům, kteří nevědí o nutnosti IP forwardingu (což neexistovalo v jádrech 2.0).

Neexistuje způsob jak vynulovat zároveň paketové a bytové počítadlo pomocí jediného řetězce. Jedná se o omezení jádra.

Detekce smyček není v ipchains hotová; pakety ve smyčce budou zahozeny a zapsány do logu, ale je to to první co se naleznete pokud vytvoříte smyčku.

Výklad toho, co se děje při označování paketů je úmyslně nejasný dokud nevyjde dokumentace popisující rutiny pro práci s pakety v jádrech 2.1.

Nelze vynulovat počitadla pravidel pro řetězce (policy) tj. ty, které patří do neuživatelských (built-in) řetězců.

POZNÁMKY
Program ipchains se značně liší od programu ipfwadm (autor Jos Vos) tím, že používá nové IP firewallové konstrukce. Je nadstavbou programu ipfwadm a obecně používá mapování příkazů 1:1. Věřím, že nové příkazy budou srozumitelnější. Nicméně je zde mnoho změn, o kterých byste se měli informovat.

S fragmenty se pracuje různě. Všechny fragmenty kromě prvního mohly procházet (což je obvykle bezpečné); nyní je možné je filtrovat. Znamená to, že byste pravděpodobně měli přidat jednoznačné pravidlo pro akceptování fragmentů pokud přecházíte na ipchains. Též je dobré podívat se na starý systém počítacích pravidel, která kontrolovala odesílatele a příjemce portů 0xFFFF (0xFF pro ICMP), což byl starý způsob pro počítání fragmentů.

Počítací pravidla jsou teď jednoduše připojena ke vstupním a výstupním řetězcům (input a output chain); staré chování lze simulovat takto:
 ipchains -N acctin
 ipchains -N acctout
 ipchains -N acctio
 ipchains -I input -j acctio
 ipchains -I input -j acctin
 ipchains -I output -j acctio
 ipchains -I output -j acctout
Tímto se vytvoří tři uživatelské řetězce, acctin, acctout and acctio, které budou obsahovat pravidla pro počítání (mohou být bez parametru -j, takže pakety jednoduše projdou).

Cíl MASQ nebo REDIRECT, který je jádrem považován za nevhodný (tj. neprocházející přes řetězce pro vstup (input chain) nebo průchod (forward chain), způsobí záznam do syslogu a paket bude zahozen.

Starý způsob porovnávání SYN a ACK (které bylo dříve ignorováno pro jiné než TCP pakety) byl upraven; volba SYN neplatí pro pravidla týkající se jiných než paketů TCP.

Volba pro porovnání ACK (parametr -k se už nepoužívá; kombinace s ! a -y je ekvivalentní).

Nyní již nelze zadat masku TOS, která nastaví nebo změní nejméně významný TOS bit; dřívější masky TOS byly, pokud se o to pokusily, jádrem změněny.

S parametrem -b se nyní jednoduše pracuje vložením nebo smazáním dvojice pravidel s prohozeným odesílatelem a příjemcem.

Síťové rozhraní nelze určit jeho adresou - musí se zadat jeho jméno.

VIZ TAKÉ
ipfw(4)

AUTOR
Rusty Russell <rusty@linuxcare.com>. Děkuji také Hansu Perssonovi za podrobné přečtení a korektury; chtěl bych, aby četl všechny moje další dokumenty!

PŘEKLAD
Jan Jasanský (jan.jasansky@pslib.cz).