<!doctype linuxdoc system>

<!-- $Id: ipchains.sgml,v 1.2 2002/08/29 22:34:18 szopen Exp $ -->

<article>
<title>Linux IPCHAINS-HOWTO
        <author>Rusty Russell</author>
        <author>Erik Fichtner, <tt>emf@obfuscation.org</tt></author>
        <date>Wersja oryginalna: v1.0.8, Tue Jul  4 14:20:53 EST 2000</date>
        <p>Oryginał tego dokumentu znajduje się pod adresem: <url url="http://netfilter.samba.org/"></p>
        <author>Tłumaczenie: Łukasz Bromirski, <tt>l.bromirski@mr0vka.eu.org</tt></author>
        <date>Wersja tłumaczenia: 2.1, $Date: 2002/08/29 22:34:18 $</date>
        <p>Oryginał tłumaczenia znajduje się pod adresem: <url url="http://mr0vka.eu.org/tlumaczenia/ipchains.html"></p>

<abstract>
Dokument ten ma na celu opisanie jak pozyskać, zainstalować i skonfigurować
rozszerzone oprogramowanie ściany ogniowej IP dla Linuksa, oraz przekazanie
paru pomysłów na to, jak mógłbyś jej użyć.
</abstract>

<toc>

<sect>Wprowadzenie<label id="intro">

<p>Dokument ten to IPCHAINS-HOWTO; W sekcji <ref id="intro-where" name="Gdzie?">
znajdziesz adres głównej strony, z której możesz ściągnąć najświeższą wersję.
Powinieneś przeczytać również dokument NET-3-HOWTO. Dodatkowo, dokumenty
IP-Masquerading HOWTO, PPP-HOWTO, Ethernet-HOWTO i Firewall HOWTO będą również
ciekawą lekturą (oraz, oczywiście, FAQ listy alt.fan.bigfoot).</p>

<p>Jeśli filtrowanie pakietów jest ci już znane, przeczytaj sekcję
<ref id="intro-why" name="Dlaczego?">, sekcję <ref id="basics-how" name="Jak?">
i przejrzyj nagłówki w sekcji <ref id="core" name="Łańcuchy ściany ogniowej IP">.</p>

<p>Jeśli przechodzisz z <tt>ipfwadm</tt>, przeczytaj sekcję
<ref id="intro" name="Wprowadzenie">, sekcję <ref id="basics-how" name="Jak?">, i
dodatki w sekcji <ref id="ipfwadm-diff" name="Różnice pomiędzy ipchains i ipfwadm">
oraz sekcję <ref id="upgrade" name="Obsługa skryptu `ipfwadm-wrapper'">.</p>

<sect1>Co?

<p>ipchains to przepisany od nowa kod ściany ogniowej dla IPv4 Linuksa
(który jest w głównej mierze ukradziony z BSD) oraz przepisany od nowa
<tt>ipfwadm</tt>, który z kolei jest przepisanym <tt>ipfw</tt> z BSD
(jak podejrzewam). Od wersji kernela 2.1.102, filtrowanie pakietów IP
wymaga zarządzania.</p>

<sect1>Dlaczego?<label id="intro-why">

<p>Stary kod ściany ogniowej Linuksa nie radzi sobie z fragmentami, ma 32-bitowe
liczniki (przynajmniej na platformie Intel), nie pozwala na specyfikację protokołów
innych niż TCP, UDP i ICMP, nie może wykonywać dużych zmian na poziomie 'atomów';
nie można w nim podawać reguł z inwersją, ma trochę zawiłości i może być trudny w
zarządzaniu (co czyni go podatnym na błędy użytkownika).</p>

<sect1>Jak?

<p>Aktualny kod znajduje się już w standardowej paczce kernela od wersji 2.1.102.
Dla serii kerneli 2.0, będziesz musiał ściągnąć patch do kernela ze stron WWW.
Jeśli Twój kernel 2.0 jest nowszy niż dostarczany patch, mimo wszystko powinieneś go
zastosować - te kernele są raczej stabilne (tzn. patch do kernela 2.0.34 działa w
porządku z kernelem 2.0.35). Ponieważ patch do kerneli 2.0 jest niekompatybilny z
<tt>ipportfw</tt> i patchami do <tt>ipautofw</tt>, nie zalecam używania ich dopóki
naprawdę nie potrzebujesz funkcjonalności którą oferuje <tt>ipchains</tt>.</p>

<sect1>Gdzie?<label id="intro-where">

<p>
Oficjalna strona znajduje się w trzech miejscach:
<url url="http://netfilter.filewatcher.org/ipchains"
        name="Dzięki Penguin Computing">
<url url="http://www.samba.org/netfilter/ipchains"
        name="Dzięki Zespołowi SAMBA">
<url url="http://netfilter.kernelnotes.org/ipchains"
        name="Dzięki Jimowi Pickowi">

<p>Jest również lista e-mail'owa poświęcona raportom o błędach, dyskusjom,
rozwijaniu programu i o sposobach jego używania. Można do niej dołączyć wysyłając
wiadomość zawierającą słowo '<tt>subscribe ipchains-list</tt>' pod adres <tt>subscribe</tt>
na serwerze <tt>east.balius.com</tt>. Poczta do listy powinna być adresowana na
<tt>ipchains-list</tt> na serwerze <tt>east.balius.com</tt>.</p>

<sect>Podstawy filtrowania pakietów

<sect1>Co?

<p>Cały ruch przechodzący przez sieć jest przesyłany w formie <bf>pakietów</bf>.
Na przykład, ściągnięcie tego pliku (powiedzmy że ma wielkość 50kB) może
spowodować otrzymanie około 36 pakietów o długości 1460 bajtów każdy
(te liczby dobrałem raczej z głowy).</p>

<p>Początek każdego pakietu mówi gdzie podróżuje, skąd przybył, opisuje
typ i inne detale administracyjne. Ten początek każdego pakietu
nazywamy <bf>nagłówkiem</bf> (ang. <em>header</em>). Reszta pakietu,
zawierająca faktyczne dane które są transmitowane, jest zwykle nazywana
<bf>ciałem</bf> (ang. <em>body</em>) pakietu.</p>

<p>Niektóre protokoły, takie jak TCP, których używa się do obsługi ruchu
w sieci, obsługi poczty i zdalnego logowania, używają koncepcji "połączenia" --
zanim wysłane zostaną jakiekolwiek pakiety danych, wymieniane są inne pakiety
(ze specjalnymi nagłówkami), konfigurujące połączenie. Brzmi to mniej więcej tak:
"Chciałbym się połączyć", "OK", "Dzięki". Dopiero wtedy zaczyna się wymiana
normalnych pakietów.</p>

<p>Filtr pakietów to oprogramowanie które sprawdza nagłówki pakietów w
trakcie jak przez niego przechodzą i decyduje o ich losie. Może zdecydować
że <bf>anuluje</bf> (ang. <em>deny</em>) pakiet (tj. pominie pakiet jakby
nigdy go nie otrzymał), <bf>zaakceptuje go</bf> (ang. <em>accept</em>)
(tj. pozwoli mu przejść dalej) lub <bf>odrzuci</bf> (ang. <em>reject</em>)
(podobnie jak anulowanie, ale zawiadomi Ľródło pakietu, że został
on odrzucony).</p>

<p>Filtrowanie pakietów pod linuksem jest wbudowane w kernel łącznie
z paroma jeszcze trochę innymi sprytnymi rzeczami które można zrobić
z pakietami, ale generalnie zajęcie oglądania nagłówków i decydowania o ich losie
jest w nim również.</p>

<sect1>Dlaczego?

<p>
Kontrola. Bezpieczeństwo. Czujność.

<p>
<descrip>
<tag/Kontrola:/ kiedy używasz Linuksa by połaczyć Twoją wewnętrzną sieć z inną
siecią (powiedzmy z Internetem) masz okazję wpuścić trochę ruchu różnego typu a
część odrzucić. Na przykład, nagłówek pakietu posiada adres docelowy pakietu, więc
możesz odrzucać pakiety które podróżują do określonych części sieci zewnętrznej.
Innym przykładem może być to: używam Netscape do oglądania archiwów Dilbert-a. Jest
tam masa reklam pochodzących z adresu doubleclick.net, więc Netscape traci czas by je
ładować. Pouczenie filtra pakietów by nie wpuszczał pakietów podróżujących do i z
tego adresu rozwiązuje ten problem (jednakże jest parę innych sposobów by zrobić to
lepiej).

<tag/Bezpieczeństwo:/ kiedy Twój Linuks jest jedynym komputerem pomiędzy chaosem Internetu
i Twoją ładną, uporządkowaną siecią, miło jest wiedzieć że możesz obłożyć
restrykcjami to co nadchodzi do Twych drzwi. Na przykład, możesz pozwolić by wszystko
wychodziło z Twojej sieci, ale możesz być zaniepokojony znanym atakiem 'Ping of Death'
przeprowadzanym przez rozmaitych złośliwych ludzi. Innym przykładem może być Twoje
życzenie, by nie zezwalać na telnet'owanie się na Twój komputer, mimo że wszystkie konta
mają hasła; prawdopodobnie chcesz być (jak większość ludzi) raczej obserwatorem w
Internecie a nie serwerem - po prostu nie dawać się nikomu do Ciebie dołączać,
poprzez filtrowanie nadchodzących pakietów służących do ustanawiania połączeń.

<tag/Czujność:/ czasami Ľle skonfigurowana maszyna w sieci lokalnej zadecyduje o
skierowaniu paru pakietów do sieci zewnętrznej. Miło jest móc poinstruować filtr
pakietów by dał Ci znać o takich anormalnych zachowaniach; może będziesz chciał coś
z tym zrobić, albo jesteś po prostu ciekawy takich przypadków.
</descrip>

<sect1>Jak?<label id="basics-how">

<sect2>Kernel z filtrowaniem pakietów

<p>Potrzebujesz kernela który ma nowy kod ipchains ściany ogniowej
zawarty w sobie. Możesz to sprawdzić zaglądając do pliku
<tt>/proc/net/ip_fwchains</tt>. Jeśli w ogóle istnieje, masz taki
kernel.</p>

<p>Jeśli nie, to potrzebujesz kernela który spełnia ten warunek.
Po pierwsze, ściągnij Ľródła kernela którego potrzebujesz. Jeśli masz
kernel w wersji 2.1.102 lub wyższej, nie będziesz potrzebował patcha (jest już w
Ľródłach). W innym przypadku musisz zastosować patch dostępny spod adresu WWW
podanego wcześniej i ustawić konfigurację jak to pokazano niżej. Jeśli nie wiesz jak
to zrobić nie panikuj - przeczytaj Kernel-HOWTO.</p>

<p>Poniżej znajdują się opcje konfiguracji których będziesz potrzebował
by ustawić <bf>kernel w wersji 2.0.x</bf>:

<code>
	CONFIG_EXPERIMENTAL=y
	CONFIG_FIREWALL=y
	CONFIG_IP_FIREWALL=y
	CONFIG_IP_FIREWALL_CHAINS=y
</>

Dla kerneli w wersjach <bf>2.1.x i 2.2.x</bf> musisz ustawić:
<code>
	CONFIG_FIREWALL=y
	CONFIG_IP_FIREWALL=y
</>

<p>Narzędzie <tt>ipchains</tt> rozmawia z kernelem i mówi mu jak filtrować
pakiety. Dopóki nie jesteś programistą, lub nadzwyczaj ciekawski, tak
będziesz kontrolował filtrowanie pakietów.</p>

<sect2> ipchains

<p>Narzędzie <tt>ipchains</tt> dodaje i usuwa reguły z sekcji filtrującej
pakiety kernela. To oznacza, że cokolwiek byś nie ustawił, zostanie stracone
po restarcie; zajrzyj do sekcji <ref id="permanent" name="Zapisywanie reguł na stałe">
by dowiedzieć się jak upewnić się że reguły zostaną odzyskane po następnym
uruchomieniu Linuksa.</p>

<p><tt>ipchains</tt> zastępuje <tt>ipfwadm</tt>, który był używany ze
starym kodem ściany ogniowej IP. Dostępny jest zestaw użytecznych skryptów z serwera
http:

<url url="http://netfilter.filewatcher.org/ipchains/ipchains-scripts-1.1.2.tar.gz"
name="http://netfilter.filewatcher.org/ipchains/ipchains-scripts-1.1.2.tar.gz">

Pakiet zawiera skrypt powłoki nazwany <tt>ipfwadm-wrapper</tt>, który pozwala Ci na
filtrowanie pakietów w sposób podobny jak to robiłeś w starych wersjach kernela.
Prawdopodobnie nie powinieneś jednak używać tego skryptu, chyba że chcesz naprawdę
szybkiego sposobu upgradeu systemu który do tej pory używał <tt>ipfwadm</tt>
(jest wolniejszy, nie sprawdza argumentów itp.). Jeśli tak zrobisz, nie musisz
już praktycznie czytać tego HOWTO.</p>

<p>Zajrzyj do Załącznika <ref id="ipfwadm-diff" name="Różnice pomiędzy ipchains i ipfwadm">
oraz do <ref id="upgrade" name="Używanie skryptu `ipfwadm-wrapper'"> po więcej
informacji dotyczących <tt>ipfwadm</tt>.</p>

<sect2>Zapisywanie reguł na stałe<label id="permanent">

<p>Twoje aktualne ustawienia ściany ogniowej zachowywane są w kernelu, więc
zostaną stracone w przypadku resetu maszyny. Rekomenduję użycie skryptów
'ipchains-save' i 'ipchains-restore' by zachowywać reguły. By ich użyć, ustaw
reguły a potem wykonaj (jako root):

<tscreen><verb>
# ipchains-save > /etc/ipchains.rules
#
</verb></tscreen>

Utwórz skrypt taki jak ten:

<tscreen><verb>
#! /bin/sh
# Skrypt kontrolujący filtrowanie pakietów

# Jeśli nie ma reguł, nie rób nic
[ -f /etc/ipchains.rules ] || exit 0

case "$1" in
    start)
	echo -n "Turning on packet filtering:"
        /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
	echo 1 > /proc/sys/net/ipv4/ip_forward
	echo "."
	;;
    stop)
	echo -n "Turning off packet filtering:"
	echo 0 > /proc/sys/net/ipv4/ip_forward
	/sbin/ipchains -F
	/sbin/ipchains -X
	/sbin/ipchains -P input ACCEPT
	/sbin/ipchains -P output ACCEPT
	/sbin/ipchains -P forward ACCEPT
	echo "."
	;;
    *)
	echo "Usage: /etc/init.d/packetfilter {start|stop}"
	exit 1
	;;
esac

exit 0
</verb></tscreen>

Upewnij się że zostanie on uruchomiony we wczesnej fazie procedury
startowej. W moim przypadku (Debian 2.1) wykonałem symboliczny link
'S39packetfilter' w katalogu '/etc/rcS.d' (zostanie uruchomiony przed
plikiem 'S40network').</p>

<sect>Jestem skołowany! Ruting, masquerading, porforwarding, ipautofw...

<p>Ten dokument HOWTO poświęcono filtrowaniu pakietów. To znaczy decydowaniu,
czy pakiet powinien móc przejść przez nasz komputer czy nie. Jednakże Linuks,
będąc tak naprawdę placem zabaw hackerów, jest na tyle narażony że prawdopodobnie
chciałbyś wiedzieć trochę więcej o filtrowaniu.</p>

<p>Problemem jest, że to samo narzędzie (ipchains) używane jest do kontrolowania
i maskarady i transparentnego proxy, mimo że są to różne techniki filtrowania
pakietów (aktualna implementacja Linuksa zamazuje różnice między nimi w
nienaturalny sposób, sprawiając wrażenie że obie techniki są naturalnie blisko
ze sobą związane).</p>

<p>Maskarada i stosowanie proxy opisane są w osobnych HOWTO, a
<bf>automatyczne przekazywanie</bf> (ang. <em>auto-forwarding</em>) i
<bf>przekazywanie portów</bf> (ang. <em>port-forwarding</em>) są kontrolowane
przez osobne narzędzia, ale ponieważ tak wielu ludzi ciągle pyta mnie o nie,
włączę zestaw typowych scenariuszy i pokażę, które z narzędzi powinno zostać użyte.
Zagadnienia bezpieczeństwa każdej konfiguracji nie będą przedmiotem dyskusji.</p>

<sect1>Trzy linijkowy Przewodnik Rusty'ego do Maskarady

<p>Poniższy przykład zakłada, że twój zewnętrzny interfejs nazywa się
'ppp0'. SprawdĽ to poleceniem <tt>ifconfig</tt> i ewentualnie zmień użyty
niżej interfejs:

<tscreen><verb>
# ipchains -P forward DENY
# ipchains -A forward -i ppp0 -j MASQ
# echo 1 > /proc/sys/net/ipv4/ip_forward
</verb></tscreen>

<sect1>Bezpłatna promocja: WatchGuard rządzi

<p>Można kupić ścianę ogniową prosto z półki. Doskonały jest WatchGuard FireBox.
Jest taki dobry, ponieważ go lubię, jest bezpieczny, oparty na Linuksie i ponieważ
funduje również utrzymanie ipchains jak również nowego kodu do ściany ogniowej
(przeznaczonego do kerneli wersji 2.3.x i 2.4). W skrócie, WatchGuard płaci mi za
jedzenie w czasie gdy pracuje dla was. Więc weĽcie pod uwagę ich sprzęt.
<url url="http://www.watchguard.com" name="http://www.watchguard.com">
</p>

<sect1>Najpopularniejsze konfiguracje ze ścianami ogniowymi

<p>Utrzymujesz serwer littlecorp.com. Masz sieć wewnętrzną i pojedyńczą
linię (PPP) do Internetu (firewall.littlecorp.com który ma adres 1.2.3.4).
Używasz Ethernetu w swojej sieci lokalnej a Twoja osobista maszyna nazywa
się "myhost".</p>

<p>Ta sekcja pokaże różne konfiguracje które są dosyć powszechne.
Czytaj uważnie, ponieważ każda z nich jest czasami tylko subtelnie różna
od pozostałych.</p>

<sect2>Sieć prywatna: tradycyjne proxy

<p>W tym scenariuszu, pakiety z sieci prywatnej nigdy nie podróżują do
Internetu i vice versa. Adres IP sieci prywatnej powinien być przydzielony
z jednej z trzech puli adresów zdefiniowanych w RFC1597 (10.*.*.*,
172.16.*.* lub 192.168.*.*).</p>

<p>Jedynym sposobem w jaki w ogóle można się połączyć do Internetu jest
dołączenie się do ściany ogniowej, która jest jedyną maszyną podłączoną
do obu sieci naraz. Uruchamiasz program (na ścianie ogniowej) nazywany
proxy by to zrobić (są proxy do FTP, usług WWW, telnetu, RealAudio, newsów i
innych usług). Zajrzyj po więcej informacji do Firewall HOWTO.</p>

<p>Każda usługa z której chcesz korzystać w Internecie, musi być uruchomiona
na ścianie ogniowej (ale zajrzyj do
<ref id="limited-services" name="Ograniczone usługi wewnętrzne"> poniżej).</p>

<p>Przykład: Umożliwienie dostępu do stron WWW z sieci prywatnej do
Internetu:

<enum>
<item>Sieć prywatna ma przydzielone adresy 192.168.1.*,
komputer 'myhost' ma adres 192.168.1.100 a interfejs Ethernetowy
ściany ogniowej ma adres 192.168.1.1.

<item>Proxy WWW (np. 'squid') jest zainstalowany i skonfigurowany
na ścianie ogniowej, pracuje na porcie 8080.

<item>Netscape w sieci prywatnej jest skonfigurowany i używa portu 8080
na ścianie ogniowej jako proxy.

<item>DNS nie musi być skonfigurowany w sieci prywatnej.

<item>DNS musi być skonfigurowany na ścianie ogniowej.

<item><bf>Domyślna brama</bf> (ang. <em>default gateway</em>) również
nie musi być skonfigurowana w sieci prywatnej.
</enum>

<p>Netscape na komputerze myhost czyta http://slashdot.org.

<enum>
<item> Netscape łączy się ze ścianą ogniową z portem 8080,
używając portu 1050 na komputerze myhost. Prosi o stronę http://slashdot.org.

<item> Proxy sprawdza nazwę 'slashdot.org' i dostaje adres IP
207.218.152.131. Otwiera połączenie do tego adresu IP (używając portu 1024
na interfejsie zewnętrznym ściany ogniowej), i prosi serwer WWW
(na porcie 80) o określoną stronę.

<item> Gdy otrzymuje stronę, kopiuje te dane do połączenia z Netscape.

<item> Netscape rysuje stronę
</enum>

Na przykład z punktu widzenia slashdot.org, połączenie wykonuje maszyna
1.2.3.4 (interfejs PPP ściany ogniowej) z portu 1025, pod adres 207.218.152.131
(slashdot.org) na port 80. Z punktu widzenia maszyny myhost, połączenie
wykonuje 192.168.1.100 (myhost) z portu 1025, adresem docelowym jest
192.168.1.1 (interfejs Ethernetowy ściany ogniowej) port 8080.

<sect2>Sieć prywatna: transparentne proxy

<p>W tym scenariuszu, pakiety z sieci prywatnej nigdy nie podróżują do
Internetu i vice versa. Adres IP sieci prywatnej powinien być przydzielony
z jednej z trzech puli adresów zdefiniowanych w RFC1597 (10.*.*.*,
172.16.*.* lub 192.168.*.*).</p>

<p>Jedynym sposobem w jaki w ogóle można się połączyć do Internetu jest
dołączenie się do ściany ogniowej, która jest jedyną maszyną podłączoną
do obu sieci naraz. Uruchamiasz program (na ścianie ogniowej) nazywany
transparentnym proxy by to zrobić; kernel wysyła wychodzące pakiety do
transparentnego proxy zamiast wysyłać je po prostu do drugiej sieci
(tzn. pomija ruting).</p>

<p>Transparentne proxy oznacza, że klienci nie muszą w ogóle wiedzieć
że działa jakieś proxy.</p>

<p>Każda usługa z której chcesz korzystać w Internecie, musi być uruchomiona
na ścianie ogniowej (ale zajrzyj do
<ref id="limited-services" name="Ograniczone usługi wewnętrzne"> poniżej).</p>

<p>Przykład: Umożliwienie dostępu do stron WWW z sieci prywatnej do
Internetu:

<enum>
<item> Sieć prywatna ma przydzielone adresy 192.168.1.*, komputer myhost
ma adres 192.168.1.100 a interfejs Ethernetowy ściany ogniowej ma adres
192.168.1.1.

<item> Transparentne proxy WWW (jak podejrzewam są patche dla squida by
pracował w tym trybie, możesz również spróbować 'transproxy') jest
zainstalowany i skonfigurowany i używa portu 8080 na ścianie ogniowej.

<item> Kernel ma zdefiniowane, by przekierowywać połączenia na port 80 do
proxy, używając ipchains.

<item> Netscape w sieci prywatnej jest skonfigurowany do połączeń
bezpośrednich.

<item> DNS musi być skonfigurowany w sieci prywatnej (tzn. musisz
uruchomić serwer DNS jako proxy na ścianie ogniowej).

<item> Domyślna brama musi być skonfigurowana dla sieci prywatnej,
by można było wysyłać pakiety do ściany ogniowej.
</enum>

<p>Netscape na maszynie myhost odwołuje się do strony http://slashdot.org
<enum>
<item> Netscape szuka nazwy slashdot.org i dostaje adres 207.218.152.131.
Otwiera połączenie do tego adresu IP przez port 1050, i prosi serwer WWW
(na porcie 80) o określoną stronę.

<item> W momencie, gdy pakiety z komputera myhost (port 1050)
do slashdot.org (port 80) przechodzą przez ścianę ogniową, są przekierowywane
do transparentnego proxy oczekującej na porcie 8080 ściany ogniowej.
Transparentne proxy otwiera połaczenie (używając własnego portu 1025) do
207.218.152.131 na port 80 (który jest oryginalnym adresem, na który
pakiety miały dojść).

<item> Gdy proxy otrzymuje dane ze swojego połączenia z serwerem WWW,
kopiuje dane do połączenia z Netscape.

<item> Netscape rysuje stronę.
</enum>

Z punktu widzenia slashdot.org, połączenie nadchodzi z 1.2.3.4
(interfejs PPP ściany ogniowej) i portu 1025 do 207.218.152.131 (slashdot.org)
port 80. Z punktu widzenia komputera myhost połączenie wykonywane jest z
adresu 192.168.1.100 (myhost) i portu 1050 do adresu 207.218.152.131
(slashdot.org) i na port 80, ale tak naprawdę rozmawia on przez
transparentną proxy.</p>

<sect2>Sieć prywatna: Maskarada

<p>W tym scenariuszu, pakiety z sieci prywatnej nigdy nie podróżują
do Internetu i vice versa bez specjalnego potraktowania. Adres IP sieci
prywatnej powinien być przydzielony z jednej z trzech puli adresów
zdefiniowanych w RFC1597 (10.*.*.*, 172.16.*.* lub 192.168.*.*).</p>

<p>Zamiast używać proxy, używamy specjalnej właściwości kernela nazywanej
<bf>maskaradą</bf> (ang. <em>masquerading</em>). Maskarada przepisuje pakiety
kiedy przechodzą przez ścianę ogniową więc wydają się zawsze pochodzić właśnie z
niej. Następnie przepisuje od nowa również odpowiedzi, więc wyglądają tak jakby
nadchodziły od originalnego adresata.</p>

<p>Maskarada ma osobne moduły które obsługują 'udziwnione' protokoły, takie
jak FTP, RealAudio, Quake itp. Dla bardzo trudnych do obsłużenia protokołów,
możliwe jest włączenie 'auto-forwardingu', który może obsłużyć część z nich
przez automatyczne ustawienie <bf>przekazywania</bf> (ang. <em>forwardingu</em>)
dla określonych zestawów portów: szukaj <tt>ipportfw</tt>
(w kernelach serii 2.0.x) lub <tt>ipmasqadm</tt> (w kernelach serii 2.1.x).</p>

<p>Każda usługa z której chcesz korzystać w Internecie, musi być uruchomiona
na ścianie ogniowej (ale zajrzyj do
<ref id="limited-services" name="Ograniczone usługi wewnętrzne"> poniżej).</p>

<p>Przykład: Umożliwienie dostępu do stron WWW z sieci prywatnej do
Internetu:

<enum>
<item> Sieć prywatna ma przydzielone adresy 192.168.1.*, komputer myhost
ma adres 192.168.1.100 a interfejs Ethernetowy ściany ogniowej ma adres
192.168.1.1.

<item> ¦ciana ogniowa ma skonfigurowaną maskaradę dla dowolnych pakietów
które wychodzą z sieci prywatnej i podróżują w kierunku portu 80 hostów
Internetowych.

<item> Netscape w sieci prywatnej jest skonfigurowany do połączeń
bezpośrednich.

<item> DNS musi być skonfigurowany w sieci prywatnej.

<item> Domyślna brama musi być skonfigurowana dla sieci prywatnej i
ustawiona na ścianę ogniową.
</enum>

Netscape na maszynie myhost odwołuje się do strony http://slashdot.org

<enum>
<item> Netscape szuka nazwy slashdot.org i dostaje adres 207.218.152.131.
Otwiera połączenie do tego adresu IP przez port 1050, i prosi serwer WWW (na porcie 80)
o określoną stronę.

<item> W momencie, gdy pakiety z komputera myhost (port 1050) do slashdot.org
(port 80) przechodzą przez ścianę ogniową, są przepisywane tak jakby
nadchodziły z interfejsu PPP ściany ogniowej, z portu 65000. ¦ciana ogniowa ma
prawidłowy adres Internetowy (1.2.3.4) więc pakiety odpowiedzi mogą wrócić
bez przeszkód.

<item> W momencie gdy pakiety z slashdot.org (port 80) docierają do ściany
ogniowej (port 65000), są przepisywane i wysyłane do myhost na port 80.
To prawdziwa magia maskarady, ponieważ pamięta kiedy przepisuje wychodzące
pakiety i potrafi skoordynować je z pakietami odpowiedzi i je również prawidłowo
przepisać.

<item> Netscape rysuje stronę.
</enum>

Z punktu widzenia slashdot.org, połączenie nadchodzi z 1.2.3.4
(interfejs PPP ściany ogniowej) i portu 65000 do 207.218.152.131
(slashdot.org) port 80. Z punktu widzenia komputera myhost połączenie wykonywane
jest z adresu 192.168.1.100 (myhost) i portu 1050 do adresu 207.218.152.131
(slashdot.org) i na port 80.

<sect2>Sieć publiczna

<p>W tym scenariuszu, Twoja własna sieć jest częścią Internetu i pakiety
przepływają bez zmian między sieciami. Pula adresów IP sieci prywatnej musi być
przydzielona przez złożenie podania o blok adresów IP, tak by reszta sieci
wiedziała jak skierować do Ciebie pakiety. Implikuje to połączenie stałe.</p>

<p>W tym przypadku, filtr pakietów jest używany do wymuszenia restrykcji,
które pakiety mogą być przekazywane pomiędzy siecią a resztą Internetu,
np. obostrzenie, że od strony Internetu można osiągnąć tylko serwery WWW
Twojej sieci prywatnej.</p>

<p>Przykład: Umożliwienie dostępu do stron WWW z sieci prywatnej do Internetu:

<enum>
<item> Adresy w twojej sieci prywatnej są przydzielone zgodnie z
zarejestrowanym blokiem numerów IP które otrzymałeś (powiedzmy 1.2.3.*).

<item> ¦ciana ogniowa jest skonfigurowana tak, by przepuszczać
cały ruch.

<item> Netscape jest skonfigurowany do połączeń bezpośrednich.

<item> DNS musi być skonfigurowany prawidłowo w Twojej sieci.

<item> ¦ciana ogniowa powinna być domyślną bramą dla sieci prywatnej.
</enum>

Netscape na maszynie myhost odwołuje się do strony http://slashdot.org

<enum>
<item> Netscape szuka nazwy slashdot.org i dostaje adres 207.218.152.131.
Otwiera połączenie do tego adresu IP przez port 1050, i prosi serwer WWW
(na porcie 80) o określoną stronę.

<item> Pakiety przechodzą przez ścianę ogniową, tak jak przechodzą
przez parę innych ruterów na drodze między tobą a slashdot.org.

<item> Netscape rysuje stronę.
</enum>

Tzn. jest tylko jedno połączenie: z 1.2.3.100 (myhost)
port 1050, do 207.218.152.131 (slashdot.org) port 80.

<sect2>Ograniczone usługi wewnętrzne<label id="limited-services">

<p>Jest parę sposobów, które możesz zastosować by udostępnić Internetowi
dostęp do Twoich usług w sieci, zanim zaczniesz uruchamiać odpowiednie
serwisy na ścianie ogniowej. Będą one pracowały na zasadach takich jak
proxy lub maskarada dla połączeń zewnętrznych.</p>

<p>Najprostszym podejściem jest zainstalowanie 'przekierowywacza', który jest
odpowiednikiem proxy dla ubogich - czeka na połączenie na danym porcie, a
następnie otwiera połączenie do zdefiniowanego hosta i portu w sieci wewnętrznej,
oraz kopiuje dane między tymi dwoma połączeniami. Przykładem takiego programu może
być 'redir'. Z punktu widzenia Internetu, połączenie jest realizowane do Twojej
ściany ogniowej. Z punktu widzenia twojego serwera w sieci prywatnej, połączenie
jest realizowane ze ściany ogniowej do twojego serwera.</p>

<p>Innym podejściem (które wymaga patcha dla kerneli serii 2.0.x dla <tt>ipportfw</tt>
lub kernela w wersji 2.1.x i póĽniejszych) jest używanie przekazywania w samym kernelu.
Robi on tą samą robotę co program 'redir' tylko trochę w inny sposób: kernel przepisuje
pakiety w trakcie gdy one przechodzą przez ścianę ogniową, zmieniając ich adres docelowy
i port na host i port w sieci prywatnej. Z punktu widzenia Internetu połączenie jest
realizowane do Twojej ściany ogniowej. Z punktu widzenia serwera w sieci prywatnej,
wykonywane jest bezpośrednie połączenie z Internetu do serwera.</p>

<sect1>Więcej informacji o maskaradzie

<p>David Ranch napisał wspaniałe HOWTO poświęcone maskaradzie, które w
większości dubluje się z tym HOWTO. Możesz je znaleĽć pod adresem
<htmlurl url="http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html"
name="http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html">.</p>

<p>Oficjalna strona maskarady znajduje się pod adresem
<url url="http://ipmasq.cjb.net" name="http://ipmasq.cjb.net">.</p>

<sect>Łańcuchy IP ściany ogniowej<label id="core">

<p>Ta sekcja opisuje co tak naprawdę powinieneś wiedzieć by zbudować
sobie filtr pakietów który zaspokoi Twoje potrzeby.</p>

<sect1>Jak pakiety podróżują przez filtry

<p>Kernel zaczyna z trzema listami reguł; listy te są nazywane <bf>łańcuchami ściany
ogniowej</bf> lub po prostu <bf>łańcuchami</bf>. Nazywają sie one <bf>input</bf>
(wejściowy), <bf>output</bf> (wyjściowy) i <bf>forward</bf> (przekazujący). Kiedy
pakiet dociera do komputera (powiedzmy, przez kartę Ethernetową), kernel używa
łańcucha <tt>input</tt> by zdecydować o jego losie. Jeśli pakiet przeżyje ten krok,
kernel decyduje gdzie go wysłać (nazywa się to rutingiem). Jeśli jest skierowany do
innej maszyny, sprawdza również <tt>forward</tt>. Na koniec, zanim pakiet opuści
maszynę, kernel sprawdza jeszcze łańcuch <tt>output</tt>.</p>

<p>Łańcuch to zbiór reguł. Każda reguła mówi 'jeśli nagłówek pakietu wygląda tak,
to zrobimy z nim właśnie to'. Jeśli reguła nie dotyczy pakietu, sprawdzana jest
następna. Jeśli nie ma już żadnych reguł do sprawdzenia, kernel sprawdza jeszcze
<bf>politykę</bf> (ang. <em>policy</em>) łańcucha by zdecydować co zrobić. W bardzo
bezpiecznym otoczeniu, polityka mówi zwykle żeby odrzucić ten pakiet.</p>

<p>Dla fanów ASCII, poniżej rysunek drogi pakietu, który przechodzi przez maszynę:

<verb>
        ----------------------------------------------------------------
        |            ACCEPT/                              lo interface |
        v           REDIRECT                  _______                  |
--> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
    h     a    |input |    e    {Routing }   |Chain  |     |output |ACCEPT
    e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
    c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
    k     t       |        s       |             |     | |     |
    s     y       |        q       |             v     | |     |
    u     |       v        e       v            DENY/  | |     v
    m     |     DENY/      r   Local Process   REJECT  | |   DENY/
    |     v    REJECT      a       |                   | |  REJECT
    |   DENY               d       --------------------- |
    v                      e -----------------------------
   DENY
</>
A teraz opiszę punkt po punkcie każdy etap:

<descrip>
<tag/Checksum (suma kontrolna):/ To test, czy pakiet nie jest uszkodzony w jakiś sposób.
Jeśli jest, zostaje odrzucony (anulowany).

<tag/Sanity (poprawność):/ To jeden z testów poprawności przed każdym łańcuchem
ściany ogniowej, ale w przypadku łańcucha wejściowego jest najbardziej ważny. Niektóre
zniekształcone pakiety mogłyby sprawić duży problem kodowi sprawdzającemu reguły i
są one tutaj odrzucane (zostaje to odnotowane informacją w syslogu).

<tag/input chain (łańcuch wejściowy):/ To pierwszy łańcuch ściany ogniowej, na którym
pakiet będzie testowany. Jeśli werdykt nie zostanie orzeczony na <tt>DENY</tt>
(anulować) lub <tt>REJECT</tt> (odrzucić), pakiet przechodzi dalej.

<tag/Demasquerade (demaskarada):/ Jeśli pakiet jest odpowiedzią na poprzedni,
zamaskaradowany pakiet, jest demaskaradowany i przechodzi bezpośrednio do łańcucha
wyjściowego (output). Jeśli nie używasz maskarady IP, możesz ten etap wymazać
z myśli.

<tag/Routing decision (decyzja o rutingu):/ Kod odpowiedzialny za ruting analizuje
pole przeznaczenia, by zdecydować czy pakiet ma trafić do lokalnego procesu
(sprawdĽ 'proces lokalny' poniżej) lub przekazany do zdalnej maszyny (sprawdĽ
'łańcuch przekazujący', również poniżej).

<tag/Local process (proces lokalny):/ Proces działający na maszynie może otrzymywać
pakiety po decyzji z poprzedniego punktu, jak również wysyłać pakiety (które po
decyzji o rutingu z punktu wyżej, trafiają do łańcucha wyjściowego (output) ).

<tag/lo interface (interfejs lo):/ Jeśli pakiety z lokalnego procesu mają trafić do
lokalnego procesu, przejdą przez łańcuch wyjściowy (output) z interfejsem ustawiony
na 'lo', a potem wrócą przez łańcuch wejściowy (input), również przez interfejs
'lo'. Interfejs ten jest zwykle nazywany <bf>pętlą zwrotną</bf> (ang. <em>loopback</em>).

<tag/local (lokalnie):/ Jeśli pakiet nie został wykreowany przez proces lokalny,
sprawdzany jest łańcuch przekazujący (forward), w innym wypadku pakiet przekazywany
jest do łańcucha wyjściowego (output).

<tag/forward chain (łańcuch przekazujący):/ Łańcuch ten jest sprawdzany kiedy pakiet
stara się przejść przez tą maszynę do innej.

<tag/output chain (łańcuch wyjściowy):/ Ten łańcuch jest z kolei sprawdzany dla
wszystkich pakietów, zanim opuszczą one maszynę.
</descrip>

<sect2>Używanie ipchains

<p>Po pierwsze, sprawdĽ czy masz wersję ipchains na której opiera się
ten dokument:

<tscreen><verb>
$ ipchains --version
ipchains 1.3.9, 17-Mar-1999
</verb></tscreen>

<p>Proszę zauważyć, że zalecam 1.3.4 (które nie ma długich opcji, takich jak
'--sport'), lub 1.3.8 i wyższe - są one bardzo stabilne.</p>

<p>ipchains posiadają całkiem szczegółowy podręcznik (<tt>man ipchains</tt>),
i jeśli potrzebujesz szczegółów jakiejś konkretnej opcji, powinieneś sprawdzić
interfejs programowy (<tt>man 4 ipfw</tt>), lub plik <tt>net/ipv4/ip_fw.c</tt>
znajdujący się w Ľródłach kernela serii 2.1.x. Jest jak najbardziej
autorytatywny.</p>

<p>Jest również ściąga autorstwa Scott'a Bronson'a w paczce Ľródłowej,
zarówno w formatach A4 i US Letter w formacie PostScript(TM).</p>

<p>Istnieje parę różnych rzeczy które możesz zrobić z <tt>ipchains</tt>.
Po pierwsze, możesz operować całymi łańcuchami. Zaczynasz z trzema
wbudowanymi łańcuchami: <tt>input</tt> (wejściowym), <tt>output</tt>
(wyjściowym) i <tt>forward</tt> (przekazującym), których nie możesz skasować.

<enum>
<item> Utworzenie nowego łańcucha (-N).
<item> Skasowanie pustego łańcucha (-X).
<item> Zmiana polityki dla wbudowanego łańcucha (-P).
<item> Lista reguł w łańcuchu (-L).
<item> Oczyszczenie łańcucha z reguł (-F).
<item> Wyzerowanie liczników bajtów i pakietów we wszystkich regułach w danym łańcuchu (-Z).
</enum>
</p>

<p>Jest kilka sposobów na manipulacje regułami wewnątrz łańcucha:

<enum>
<item> Dodaj nową regułę do łańcucha (-A).
<item> Dodaj nową regułę na jakiejś pozycji w łańcuchu (-I).
<item> Zastąp regułę na jakiejś pozycji w łańcuchu (-R).
<item> Skasuj regułę na jakiejś pozycji w łańcuchu (-D).
<item> Skasuj pierwszą z pasujących reguł z łańcucha (-D).
</enum>
</p>

<p>Jest również parę operacji na maskaradzie, które wbudowane są w
<tt>ipchains</tt> z chęci znalezienia dla nich dobrego miejsca:

<enum>
<item> Lista aktualnie maskaradowanych połączeń (-M -L).
<item> Ustawienie timeoutów dla maskarady (-M -S). (i sprawdĽ <ref id="no-timeout" name="Nie mogę ustawić timeoutów maskarady!">).
</enum>
</p>

<p>Ostatnia (i najprawdopodobniej najużyteczniejsza) funkcja, pozwala Ci
co by się stało gdyby dany pakiet dotarł do danego łańcucha.</p>

<sect2> Co widać gdy wystartujesz komputer

<p>Zanim jakakolwiek komenda ipchains została wykonana
(uwaga: niektóre dystrybucje uruchamiają ipchains w skryptach
inicjujących), nie ma reguł we wbudowanych łańcuchach (`input', `forward' i
`output'), a polityka każdego z nich ustawiona jest
na ACCEPT.  To najbardziej otwarte podejście jakie możesz
mieć.</p>

<sect2> Operacje na pojedyńczej regule

<p>To właśnie chleb powszedni ipchains: manipulacja regułami. Najczęściej,
będziesz używał dodawania (<tt>-A</tt>) i kasowania (<tt>-D</tt>). Inne
operacje (<tt>-I</tt> dla wstawiania i <tt>-R</tt> dla zastępowania) są
prostymi rozszerzeniami tych koncepcji.</p>

<p>Każda reguła podaje zestaw wymagań, które pakiet musi spełniać, oraz co
zrobić gdy je spełnia czyli <bf>cel</bf> (ang. <em>target</em>). Na przykład,
mógłbyś chcieć odrzucać wszystkim pakiety ICMP nadchodzące z adresu IP 127.0.0.1.
W tym przypadku protokołem będzie ICMP, adresem Ľródłowym będzie 127.0.0.1 a
celem - <tt>DENY</tt> (anulowanie).</p>

<p>127.0.0.1 to interfejs loopback, który masz nawet wtedy, gdy nie ma połączenia
z żadną siecią. Możesz użyć programu 'ping' by wygenerować takie pakiety (wysyła
on pakiet ICMP typ 8 <bf>żądnie echa</bf> (ang. <em>echo request</em>) na który wszystkie
współpracujące hostu powinny odpowiedzieć pakietem ICMP typ 0 <bf>odpowiedĽ na echo</bf>
(ang. <em>echo reply</em>). Czyni go to użytecznym do testów.

<tscreen><verb>
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
# ipchains -A input -s 127.0.0.1 -p icmp -j DENY
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
#
</verb></tscreen>

Widać tutaj że pierwszy ping powiódł się (parametr '-c 1' mówi pingowi
by wygenerował tylko jeden pakiet).</p>

<p>Następnie dołączamy (<tt>-A</tt>) do łańcucha 'input' regułę mówiącą, że
pakiety nadchodzące z adresu 127.0.0.1 ( '<tt>-s 127.0.0.1</tt>') i używające
protokołu ICMP ('<tt>-p ICMP</tt>') powinny trafić zostać anulowane
('<tt>-j DENY</tt>').</p>

<p>Następnie testujemy naszą regułę, wykonując drugi raz pinga. Nastąpi pauza,
po której program podda się - po oczekiwaniu na pakiet który nigdy nie wróci.</p>

<p>Możemy skasować naszą regułę na dwa sposoby. Po pierwsze,
ponieważ wiemy że jest to jedyna reguła w łańcuchu wejściowym, możemy użyć
numerowania reguł, tak jak poniżej:

<tscreen><verb>
# ipchains -D input 1
#
</verb></tscreen>
Polecenie skasuje regułę numer 1 w łańcuchu wejściowym.</p>

<p>Drugi sposób to dokładne przepisanie poleceń po opcji <tt>-A</tt>, ale
zamiast opcji <tt>-A</tt> podajemy opcję <tt>-D</tt>. Przydaje się to w
przypadku gdy masz skomplikowany zestaw reguł i nie chce ci się liczyć
ich wszystkich by ustalić w końcu że chcesz pozbyć się reguły numer 37.
W tym wypadku użyjemy:

<tscreen><verb>
# ipchains -D input -s 127.0.0.1 -p icmp -j DENY
#
</verb></tscreen>

Składnia polecenia <tt>-D</tt> musi dokładnie odpowiadać opcjom
które podałeś przy poleceniu <tt>-A</tt> (lub <tt>-I </tt> czy <tt>-R</tt>).
Jeśli istnieje wiele identycznych reguł w tym samym łańcuchu,
tylko pierwsza pasująca zostania skasowana.</p>

<sect2>Specyfikacja filtrowania

<p>Widzieliśmy już jak używać opcji '<tt>-p</tt>' by wskazać protokół
i '<tt>-s</tt>' by wskazać adres Ľródłowy, ale są jeszcze inne opcje
których możemy użyć by scharakteryzować pakiet. Poniżej znajdziesz
wyczerpujące kompendium.</p>

<sect3>Wskazanie adresów IP: Ľródłowego i docelowego

<p>Adresy IP Ľródłowy ('<tt>-s</tt>') i docelowy ('<tt>-d</tt>') mogą być
podane na cztery sposoby. Najczęściej robi się to przez podanie
pełnej nazwy, takiej jak 'localhost' czy `www.linuxhq.com'. Drugim sposobem
jest podanie adresu IP, tak jak np. '127.0.0.1'.</p>

<p>Trzeci i czwarty sposób pozwalają na wskazanie grupy adresów IP,
tak jak na przykład '199.95.207.0/24' lub `199.95.207.0/255.255.255.0'.
Oba wskazują na zakres adresów IP od 199.95.207.0 do 199.95.207.255
włącznie; cyfry po '/' mówią która część adresu IP ma znaczenie.
'/32' czy inaczej `/255.255.255.255' jest domyślne (i mówi że wszystkie
liczby w adresie IP są ważne). By wskazać dowolny adres, można użyć
'/0' tak jak poniżej:

<tscreen><verb>
# ipchains -A input -s 0/0 -j DENY
#
</verb></tscreen>

Ale takich konstrukcji używa się rzadko, ponieważ efekt jest dokładnie
taki sam jak w przypadku nie podania opcji '<tt>-s</tt>' w ogóle.</p>

<sect3>Inwersja

<p>Wiele flag, włączając '<tt>-s</tt>' i '<tt>-d</tt>' można poprzedzić
znakiem '<tt>!</tt>' (wymawianym 'nie') by wskazać adresy <bf>nie</bf>
pasujące do tych podanych. Na przykład '<tt>-s ! localhost</tt>' będzie
pasować do wszystkich pakietów nie pochodzących z localhost.</p>

<p>Nie zapomij o spacjach wokół '<tt>!</tt>': są naprawdę potrzebne.</p>

<sect3>Protokół

<p>Protokół podaje się po parametrze '<tt>-p</tt>'. Protokół może być numerem
(jeśli znasz wartości numeryczne protokołów IP) lub nazwą dla 'TCP', 'UDP' i 'ICMP'.
Wielkość liter nie ma znaczenia, więc 'tcp' działa tak samo jak 'TCP'.</p>

<p>Nazwa protokołu może być poprzedzona przez znak '<tt>!</tt>' by
wskazać na wszystkie oprócz wymienionego, tak jak na przykład
'<tt>-p ! TCP</tt>' (warunek dotyczy wszystkich protokołów prócz TCP).</p>

<sect4>Porty dla UDP i TCP

<p>W specjalnym przypadku gdy podajemy protokół TCP lub UDP, można podać dodatkowy
parametr określający (lub ich grupę), który nas interesuje (sprawdĽ
<ref id="handling-fragments" name="Obsługa fragmentów"> poniżej). Grupę podaje się
używając znaku ':', tak jak na przykład '<tt>6000:6010</tt>' - ten przedział
dotyczy 11 portów, od 6000 do 6010 włącznie. Jeśli ominiemy dolną granicę, jest ona
przyjmowana domyślnie na 0. Jeśli ominiemy górną granicę, jest ona przyjmowana na
65535. Więc aby podać porty TCP poniżej 1024, możemy napisać '<tt>-p TCP -s 0.0.0.0/0 :1023</tt>'.
Numery portów mogą być również podane jako nazwy, np. '<tt>www</tt>'.</p>

<p>Zauważ że porty również mogą być poprzedzane znakiem '<tt>!</tt>', który
powoduje ich zanegowanie. Aby podać wszystkie pakiety TCP OPRÓCZ pakietów WWW,
możesz napisać '<tt>-p TCP -d 0.0.0.0/0 ! www</tt>'.</p>

<p>Bardzo ważne, by zauważyć, że konstrukcja

<tscreen><verb>
-p TCP -d ! 192.168.1.1 www
</verb></tscreen>

jest bardzo różna od

<tscreen><verb>
-p TCP -d 192.168.1.1 ! www
</verb></tscreen>

Pierwsza mówi o pakietach TCP do portu WWW na każdej maszynie oprócz
192.168.1.1 a druga, o pakietach TCP na dowolne porty na maszynie 192.168.1.1
oprócz portu WWW.</p>

<p>Na koniec, przykład w którym chodzi nam o wszystko oprócz portu WWW
i maszyny 192.168.1.1:

<verb>
-p TCP -d ! 192.168.1.1 ! www
</verb>
</p>

<sect4>Kod i Typ dla ICMP

<p>Protokół ICMP również umożliwia podanie dodatkowego argumentu, ale ponieważ
nie posiada portów (ICMP ma <bf>typ</bf> i <bf>kod</bf>), mają one inne znaczenie.</p>

<p>Możesz podać je w formie nazw ICMP (użyj '<tt>ipchains -h icmp</tt>' by otrzymać
listę nazw) po opcji '<tt>-s</tt>' lub jako typ i kod numeryczny ICMP, w którym typ
występuje po opcji '<tt>-s</tt>' a kod po opcji '<tt>-d</tt>'.</p>

<p>Nazwy ICMP są raczej długie: musisz użyć tylko tylu liter, by wskazywała
jednoznacznie na którąś ze zdefiniowanych.</p>

<p>Poniżej mała tabelka najbardziej popularnych pakietów ICMP:

<tscreen><verb>
Numer   Nazwa			 Wymagane przez

0	echo-reply		 ping
3	destination-unreachable	 ruch TCP/UDP
5	redirect		 ruting, jeśli nie działa demon rutingu
8	echo-request		 ping
11	time-exceeded		 traceroute
</verb></tscreen>

Zauważ że nazwy ICMP nie mogą być aktualnie poprzedzane parametrem '<tt>!</tt>'.</p>

<p>NIGDY NIGDY NIGDY nie blokuj wszystkich pakietów typu 3 ICMP! (sprawdĽ niżej
<ref id="ICMP" name="Pakiety ICMP">).</p>

<sect3>Interfejs

<p>Opcja '<tt>-i</tt>' powoduje wskazanie <bf>interfejsu</bf>. Interfejs to fizyczne
urządzenie do którego pakiet dociera lub z którego wychodzi. Możesz użyć polecenia
'<tt>ifconfig</tt>' by wylistować interfejsy które są podniesione.</p>

<p>Interfejs dla pakietów przychodzących (tzn. pakietów przechodzących przez łańcuch
wejściowy) jest uważany za interfejs z którego przyszły. Odpowiednio interfejs dla
pakietów wychodzących to ten, przez który wyjdą pakiety po pokonaniu łańcucha wyjściowego.
Pakiety które przechodzą przez łańcuch przekazujący, trafiają również do interfejsu
wyjściowego.</p>

<p>Jest całkowicie poprawne podać interfejs, który aktualnie nie istnieje - reguła nie
będzie dotyczyła niczego dopóki interfejs fizycznie nie zostanie podniesiony
(nie zacznie działać). Jest to bardzo użyteczne dla połączeń PPP do wdzwaniania się
(zwykle interfejs <tt>ppp0</tt>) i podobnych.</p>

<p>Jako specjalny przypadek, interfejs kończący się znakiem '<tt>+</tt>' będzie wskazywał
na wszystkie interfejsy (czy istnieją czy nie), które zaczynają się od tego ciągu znaków.
Na przykład, by zdefiniować regułę która dotyczy wszystkich interfejsów PPP, można
napisać '<tt>-i ppp+</tt>'.</p>

<p>Nazwa interfejsu może również być poprzedzona znakiem '<tt>!</tt>' by oznaczyć
wszystkie interfejsy oprócz wskazanego.</p>

<sect3>Podawanie tylko pakietów TCP SYN

<p>Czasami przydatne jest pozostawienie możliwości połączeń TCP tylko w jedną
stronę. Na przykład, mógłbyś chcieć zezwalać na połączenia do zewnętrznego serwera
WWW, ale nie połączenia z tego serwera.</p>

<p>Najprostszym podejściem byłoby zablokowanie pakietów TCP nadchodzących z tego
serwera. Niestety, połączenia TCP wymagają tego by pakiety mogły krążyć w jedną i
drugą stronę.</p>

<p>Rozwiązaniem jest blokowanie tylko pakietów z prośbą o połączenie. Nazywa się
je pakietami SYN (technicznie rzecz biorąc, są to pakiety z ustawioną flagą SYN
i ze zgaszonymi flagami FIN i ACK, ale nazywamy je pakietami SYN). Uniemożliwiając
ruch tylko tym pakietom, możemy powstrzymać próby połączeń.</p>

<p>Używa się do tego parametru '<tt>-y</tt>' - jest prawidłowy tylko dla reguł
które dotyczą protokołu TCP. Na przykład, by wskazać próby nawiązania połączenia
TCP z adresu 192.168.1.1:

<tscreen><verb>
-p TCP -s 192.168.1.1 -y
</verb></tscreen>

<p>I ponownie, parametr może być odwrócony przez użycie '<tt>!</tt>',
który oznacza: każdy pakiet oprócz pakietów inicjujących połączenie.</p>

<sect3>Obsługa fragmentów<label id="handling-fragments">

<p>Czasami pakiet jest zbyt duży by mógł zmieścić się naraz w maksymalnej
jednostce transmisyjnej (MTU). Gdy coś takiego ma miejsce, dzielony jest na
fragmenty i wysyłany jako parę pakietów. Adresat składa fragmenty by
zrekonstruować cały pakiet.</p>

<p>Problem z fragmentami polega na tym, że część z opcji wymienionych
wyżej (a szczególnie: port Ľródłowy i przeznaczenia, typ ICMP, kod ICMP i flaga TCP SYN)
wymagają by kernel zajrzał na początek pakietu, który znajduje się tylko w
pierwszym fragmencie całości.</p>

<p>Jeśli twoja maszyna jest jedynym połączeniem z siecią zewnętrzną, możesz
polecić kernelowi Linuksa by składał wszystkie fragmenty które przechodzą przez niego
- kompilując kernel z opcją 'IP: always defragment' ustawioną na 'Y'.
To pozwala obejść problem.</p>

<p>W innym przypadku, ważne jest by zrozumieć jak pakiety traktowane są przez
reguły filtrujące. Każda z reguł, która wymaga informacji których nie mamy po
prostu <bf>nie</bf> będzie pasować. To oznacza, że pierwszy fragment jest traktowany jak
każdy inny. Drugi i następne fragmenty <bf>nie</bf> będą tak potraktowane. Wobec tego reguła
'<tt>-p TCP -s 192.168.1.1 www</tt>' (podająca port Ľródłowy 'www') nigdy nie będzie
dotyczyć fragmentu (innego niż pierwszy fragment pakietu). Tak samo reguła odwrotna:
'<tt>-p TCP -s 192.168.1.1 ! www</tt>'.</p>

<p>Możesz jednak podać reguły dotyczące drugiego i każdego następnego pakietu,
używając parametru '<tt>-f</tt>'. Oczywiście, nie jest w tym przypadku możliwe podawanie
portów TCP czy UDP, typ czy kodu ICMP lub użycie parametru dotyczącego flagi TCP SYN.</p>

<p>Możliwe jest również podanie, że reguła nie dotyczy drugiego i każdego następnego
pakietu przez podanie jednocześnie z parametrem '<tt>f</tt>' parametru '<tt>!</tt>'.</p>

<p>Zwykle uważa się, że bezpieczne jest przepuszczanie kolejnych fragmentów, ponieważ
pierwszy powinien zostać odfiltrowany i dzięki temu niemożliwe będzie złożenie pakietu
na maszynie docelowej, jednak znane były błędy, które powodowały zawieszanie się maszyn
tylko przez wysyłanie odpowiednio spreparowanych fragmentów. Ty decydujesz.</p>

<p>Uwaga dla sieciowców: zniekształcone pakiety (pakiety TCP, UDP i ICMP zbyt krótkie
by kod ściany ogniowej ustalił port, kod lub typ ICMP) są również traktowane jak fragmenty.
Tylko fragmenty pakietów TCP zaczynające się na pozycji 8 są bezwarunkowo odrzucane przez
kod ściany ogniowej (w pliku syslog powinna się pojawić o tym informacja).</p>

<p>Jako przykład, reguła która odrzuci fragmenty kierowane do 192.168.1.1:

<tscreen><verb>
# ipchains -A output -f -d 192.168.1.1 -j DENY
#
</verb></tscreen>

<sect2>Strony uboczne filtrowania

<p>Dobra, wiemy o wszystkich sposobach pozwalających na sprawdzenie
pakietu pod kątem reguły. Jeśli pakiet pasuje do niej, dzieją się następujące
rzeczy:

<enum>
<item> Licznik dla tej reguły zliczający bajty jest powiększany o rozmiar
pakietu (nagłówka i reszty).

<item> Licznik pakietów dla tej reguły jest zwiększany.

<item> Jeśli reguła tego wymaga, pakiet jest logowany.

<item> Jeśli reguła tego wymaga, pole <bf>Typu Usługi</bf> (ang. <em>Type Of Service</em>)
jest zmieniane.

<item> Jeśli reguła tego wymaga, pakiet jest oznaczany (nie w wersji
kernela 2.0.x).

<item> Sprawdzany jest adres docelowy, by zdecydować co zrobić z pakietem.

</enum>

<p>Z różnych powodów omówimy je według ważności.</p>

<sect3>Wskazywanie celu<label id="target-spec">

<p><bf>Cel</bf> pakietu mówi kernelowi co robić z nim, jeśli pasuje do reguły.
ipchains używają parametru '<tt>-j</tt>' by wskazać cel dla danego pakietu. Nazwa
celu musi być krótsza niż 8 liter, rozróżniane są również małe i duże litery
('<tt>POWROT</tt>' i '<tt>powrot</tt>' to dwa różne cele).</p>

<p>Najprostszym przypadkiem jest gdy nie podano celu. Taka reguła (nazywana również
'zliczającą') jest użyteczna gdy po prostu chcemy tylko liczyć pakiety danego rodzaju.
Czy taka reguła odpowiada pakietowi czy nie, kernel przechodzi do następnej.
Na przykład, by zliczać ilość pakietów podróżujących do adresu 192.168.1.1 możemy
napisać tak:

<tscreen><verb>
# ipchains -A input -s 192.168.1.1
#
</verb></tscreen>

<p>(i używając komendy '<tt>ipchains -L -v</tt>' możemy sprawdzić
liczniki bajtów i pakietów odpowiadających danej regule).</p>

<p>Jest sześć specjalnych celów dla pakietu. Pierwsze trzy: <tt>ACCEPT</tt>
(akceptacja), <tt>REJECT</tt> (odrzucenie) i <tt>DENY</tt> (anulowanie) są raczej zrozumiałe.
<tt>ACCEPT</tt> (akceptacja) pozwala pakietowi przejść. <tt>DENY</tt> (anulowanie) odrzuca
pakiet tak jakby nigdy nie został odebrany. <tt>REJECT</tt> (odrzucenie) odrzuca pakiet,
ale (jeśli to nie jest pakiet ICMP) generuje odpowiedĽ ICMP do Ľródła pakietu,
by poinformować, że adres docelowy jest nieosiągalny.</p>

<p>Następny - <tt>MASQ</tt>, mówi pakietowi by zastosować maskaradę dla pakietu.
By to działało, kernel musi być skompilowany z włączoną opcją 'IP Masquerading'.
Co do szczegółów proszę zajrzeć do Masquearding-HOWTO i dodatku
<ref id="ipfwadm-diff" name="Różnice pomiędzy ipchains i ipfwadm">. Cel ten można
zastosować tylko dla pakietów które przechodzą przez łańcuch <tt>forward</tt>.</p>

<p>Innym specjalnym celem jest <tt>REDIRECT</tt> (przekierowanie), który mówi
kernelowi by wysłał pakiet do lokalnego portu zamiast tam gdzie miał się dostać.
Można go zastosować tylko w przypadku protokołów TCP i UDP. Dodatkowo można podać
port (nazwę lub numer) po opcji '<tt>-j REDIRECT</tt>' co spowoduje że pakiet
zostanie przekierowany do tego portu, nawet jeśli był zaadresowany do innego. Cel
ten można zastosować tylko dla pakietów które przechodzą przez łańcuch <tt>input</tt>.</p>

<p>Ostatnim celem jest <tt>RETURN</tt> (zwrot) którego działanie jest identyczne
ze spadkiem na koniec łańcucha (sprawdĽ <ref id="policy" name="Ustawianie polityki">
poniżej).</p>

<p>Każdy inny cel wskazuje na łańcuch zdefiniowany przez użytkownika (tak jak opisano
to w <ref id="chain-ops" name="Operacje na całych łańcuchach"> poniżej). Pakiet
zacznie przechodzenie przez reguły w tamtym łańcuchu. Jeśli nie zdecyduje on o losie
pakietu, wróci on z powrotem i zostanie sprawdzony w aktualnym łańcuchu reguł.</p>

<p>Czas na więcej rysunków ASCII. Rozważ dwa (proste) łańcuchy: input
(wbudowany) i Test (zdefiniowany przez użytkownika):

<verb>
	 `input'			 `Test'
	----------------------------	----------------------------
	| Rule1: -p ICMP -j REJECT |	| Rule1: -s 192.168.1.1    |
	|--------------------------|	|--------------------------|
	| Rule2: -p TCP -j Test    |	| Rule2: -d 192.168.1.1    |
        |--------------------------|	----------------------------
	| Rule3: -p UDP -j DENY    |
	----------------------------
</>

<p>Teraz wyobraĽ sobie pakiet nadchodzący z 192.168.1.1 i adresowany do 1.2.3.4.
Wchodzi do łańcucha <tt>input</tt> i zostaje przetestowany pod kątem reguły pierwszej
- Rule1 - nie zgadza się. Zgadza się natomiast reguła druga - Rule2 - i pakiet trafia do
łańcucha <tt>Test</tt>, więc następna reguła jest sprawdzana w nim. Pierwsza reguła w tym
łańcuchu się zgadza, ale nie podaje przeznaczenia, więc badana jest druga reguła - Rule2.
Ta się nie zgadza, więc docieramy do końca łańcucha. Wracamy zatem do poprzedniego
łańcucha w miejscu gdzie go opuściliśmy i sprawdzamy następną regułę. Nie dotyczy ona
jednak pakietu, więc zostaje pominięta.</p>

<p>Pakiet przechodzi więc taką drogę:

<verb>
                                v    __________________________
	 `input'		|   /	 `Test'                v
	------------------------|--/	-----------------------|----
	| Rule1                 | /|	| Rule1                |   |
	|-----------------------|/-|	|----------------------|---|
	| Rule2                 /  |	| Rule2                |   |
        |--------------------------|	-----------------------v----
	| Rule3                 /--+___________________________/
	------------------------|---
                                v
</verb>

<p>SprawdĽ sekcję <ref id="organisation" name="Jak zorganizować swoje reguły">
by sprawdzić jak efektywnie zdefiniować swoje łańcuchy.</p>

<sect3>Logowanie pakietów

<p>To jeden z efektów ubocznych który może mieć reguła - może logować pasujące
pakiety jeśli użyjesz parametru '<tt>-l</tt>'. Zwykle nie będziesz tego potrzebował,
ale opcja ta jest użyteczna by zapisywać wyjątkowe zdarzenia.</p>

<p>Kernel loguje taką informację w ten sposób:

<tscreen><verb>
Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
  L=34 S=0x00 I=18 F=0x0000 T=254
</verb></tscreen>

Wiadomość tą zaprojektowano by była zwięzłą i jednocześnie zawierała informacje
techniczne użyteczne tylko dla sieciowych guru, ale może być również użyteczna
dla nas. Podzielmy ją:

<enum>
<item> `input' to łańcuch, w którym znajdowała się regułę, która zalogowała pakiet.

<item> `DENY' to cel dla pakietu o którym zdecydowała reguła. Jeśli jest tutaj
'<tt>-</tt>' to reguła w ogóle nie dotyczyła pakietu (była regułą zliczającą).

<item> `eth0' to nazwa interfejsu. Ponieważ był to łańcuch wejściowy, oznacza
to, że pakiet przybył do '<tt>eth0</tt>'.

<item> `PROTO=17' oznacza pakiet protokołu numer 17. Lista numerów protokołów i
ich nazw znajduje się w pliku '<tt>/etc/protocols</tt>'. Najbardziej powszechne to
1 (ICMP), 6 (TCP) i 17 (UDP).

<item> `192.168.2.1' oznacza adres Ľródłowy pakietu IP.

<item> `:53' oznacza, że pakiet został wysłany z portu 53. Sprawdzenie w pliku
'<tt>/etc/services</tt>' pozwala ustalić, że jest to port '<tt>domain</tt>'
(tzn. że jest to prawdopodobnie odpowiedĽ DNSu). Dla UDP i TCP, jest to numer portu
Ľródłowego. Dla ICMP, jest to typ ICMP. Dla innych, będzie to 65535.

<item> `192.168.1.1' to adres docelowy IP.

<item> `:1025' to adres portu docelowego (1025) - dla UDP i TCP. Dla ICMP to kod
ICMP. Dla innych, będzie to 65535.

<item> `L=34' oznacza że pakiet miał długość 34 bajtów.

<item> `S=0x00' oznacza Typ Usługi (podziel przez 4 by otrzymać odpowiednik
ToS używany przez ipchains)

<item> `I=18' to identyfikator IP.

<item> `F=0x0000' to 16-bitowy offset fragmentu plus flagi. Wartość zaczynająca się
od '0x4' lub '0x5' oznacza, że ustawiono bit <bf>Nie fragmentować</bf> (ang.
<em>Don't Fragment</em>). Wartość '0x2' lub '0x3' oznacza ustawiony bit
<bf>Więcej fragmentów</bf> (ang. <em>More Fragments</em>) - należy spodziewać się
większej ilości fragmentów. Reszta tej wartości to offset fragmentu, podzielony
przez 8.

<item> `T=254' to <bf>czas życia</bf> (ang. <em>Time To Live</em>) pakietu. Za
każdym przekazaniem pakietu dalej odejmuje się jedną jednostkę, a zwykle ustawia się
na starcie wartość 15 lub 255.

<item> `(#5)' to numer reguły która spowodowała zalogowanie pakietu do pliku.

</enum>

<p>W standardowych Linuksach, wyjście kernela przechwytywane jest przez klogd
(demon logujący kernela) który przekazuje je następnie do syslogd (demona
logującego systemu). Zachowanie syslogd kontroluje plik '<tt>/etc/syslog.conf</tt>',
przez podanie gdzie każde <bf>urządzenie</bf> (ang. <em>facility</em>) (w naszym wypadku
urządzeniem jest '<tt>kernel</tt>') i na jakim <bf>poziomie</bf> (ang. <em>level</em>) ma
zachowywać dane (dla ipchains, używanym poziomem jest '<tt>info</tt>').</p>

<p>Dla przykładu na moim komputerze (Debian) plik '<tt>/etc/syslog.conf</tt>'
zawiera dwie linie które zawierają '<tt>kern.info</tt>':

<tscreen><verb>
kern.*				-/var/log/kern.log
*.=info;*.=notice;*.=warn;\
	auth,authpriv.none;\
	cron,daemon.none;\
	mail,news.none		-/var/log/messages
</verb></tscreen>

Oznaczają one, że do plików '<tt>/var/log/kernlog</tt>' i '<tt>/var/log/messages</tt>'
wpisywane są te same informacje. By uzyskać więcej informacji użyj polecenia
'<tt>man syslog.conf</tt>'.</p>

<sect3>Manipulowanie Typem Usługi (ToS)

<p>Są to cztery, rzadko używane bity w nagłówku IP. Powodują one zmianę sposobu w
jaki pakiet jest traktowany; te cztery bity to 'Minimum Delay' (Minimalna zwłoka),
'Maximum Thgroughput' (Maksymalna przepustowość), 'Maximum Reliability' (Maksymalna niezawodność)
i 'Minimum Cost' (Minimalny koszt). Zezwala się na ustawienie tylko jednego z tych bitów.
Rob van Nieuwkerk, autor kodu TOS pisze o tym w ten sposób:

<quote>Szczególnie bit 'Minimalna Zwłoka' jest dla mnie ważny. Ustawiam go dla
'interaktywnych' pakietów w ruterze wyprowadzającym ruch (Linux). Używam połączenia
modemowego 33,6K. Linuks prioretyzuje pakiety w 3 kolejki. W ten sposób mam
akceptowalną wydajność a w międzyczasie mogę ściągać wielkie pliki (mogłoby być
nawet lepiej gdyby nie było tak dużej kolejki w sterowniku seriala, ale zwłoka jest
utrzymywana na poziomie 1,5 sekundy).</quote>

<p>Nota: oczywiście, nie masz kontroli nad pakietami przychodzacymi;
możesz jedynie kontrolować priorytet pakietów które opuszczają Twój komputer. By
negocjować priorytety z drugim końcem połączenia, muszą być użyte protokoły takie
jak RSVP (o którym nic nie wiem, więc nie pytajcie).</p>

<p>Najczęstszym ustawieniem jest danie połączeniom telnetowym i ftp
atrybutu 'Minimalna Zwłoka' a danym ftp 'Maksymalna Przepustowość'. Może to wyglądać
tak:

<tscreen><verb>
ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08
</verb></tscreen>

<p>Parametr '<tt>-t</tt>' przyjmuje dwa dodatkowe parametry, oba w zapisie
heksdecymalnym. Pozwalają one na złożone manipulowanie bitami TOS jako maski:
pierwsza służy do przeprowadzenia operacji logicznej AND na polu TOS aktualnego
pakietu, a druga do operacji XOR na wyniku. Jeśli to zbyt trudne, spróbuj spojrzeć na
poniższą tabelę:

<tscreen><verb>
Nazwa TOS               Wartość         Typowe zastosowanie

Minimum Delay           0x01 0x10       ftp, telnet
Maximum Throughput      0x01 0x08       ftp-data
Maximum Reliability     0x01 0x04       snmp
Minimum Cost            0x01 0x02       nntp
</verb></tscreen>

Andi Kleen zwraca uwagę na następującą rzecz (trochę zedytowane
dla jasności):

<quote>Być może użyteczne byłoby dodanie odwołanie do parametru
txqueuelen w ifconfig'u przy dyskusji bitów TOS. Domyślna wielkość kolejki
urządzenia jest dostosowana do kart ethernet'owych, a dla modemów jest zbyt
duża i sprawia że 3-pasmowy scheduler (którego kolejki bazują na TOS) pracuje
nieoptymalnie. Dobrym pomysłem byłoby ustawienie go na wartość z przedziału 4-10
dla modemów lub połączeń wykorzystujących jedno pasmo B ISDN'u. Na innych urządzeniach
wymagana jest dłuższa kolejka. Problem ten występuje w kernelach serii 2.0.x i 2.1.x,
ale w 2.1.x jest to flaga ifconfig'a (z nowszym nettools), a w 2.0.x wymaga to spatchowania
Ľródłą sterowników urządzeń.</quote>

Tak więc, by sprawdzić maksymalny zysk z manipulacji TOS dla połączeń PPP, wstaw
linijkę '<tt>ifconfig $1 txqueuelen</tt>' w swoim skrypcie '<tt>/etc/ppp/ip-up</tt>'.
Numer który użyjesz zależy od prędkości modemu i ilości buforowania w modemie. Tutaj
znowu oddam Andiemu głos:

<quote>Najlepsza wartość jest kwestią eksperymentu. Jeśli kolejka jest za krótka dla
rutera, pakiety będą odrzucane. Oczywiście są korzyści bez przepisywania TOS, ale
zrobienie tego zwiększa zyski dla programów opornych przy współpracy (ale wszystkie
standardowe programy Linuksowe są łatwe we współpracy).</quote>

<sect3>Oznaczanie pakietów

<p>Ta właściwość pozwala na złożone i potężne interakcje z nową implementacją
<bf>jakości usługi</bf> (ang. <em>Quality of Service</em>) Aleksieja Kuzniecowa,
jak również z przekazywaniem pakietów w kernelach serii 2.1.x opartym na tej właściwości.
Więcej informacji podam, gdy zobaczę to u siebie. Opcja ta jest ignorowana w
kernelach serii 2.0.x.</p>

<sect3>Operacje na całym łańcuchu<label id="chain-ops">

<p>Bardzo użyteczną opcją w ipchains jest możliwość grupowania reguł w jakiś
sposób powiązanych. Możesz nazwać te łańcuch jak chcesz, tak długo jak nie będą one
wchodziły w konflikt z wbudowanymi łańcuchami (input, output i forward) oraz ze
zdefiniowanymi celami (MASQ, REDIRECT, ACCEPT, DENY, REJECT i RETURN).
Sugeruję używanie dużych liter, ponieważ być może zostaną one użyte w przyszłych
rozszerzeniach. Nazwa łańcucha może mieć do 8 znaków.</p>

<sect3>Tworzenie nowego łańcucha

<p>Stwórzmy nowy łańcuch. Ponieważ jestem kolesiem z fantazją, nazwijmy go '<tt>test</tt>':

<tscreen><verb>
# ipchains -N test
#
</verb></tscreen>

<p>To takie proste. Możesz teraz dodawać do niego reguły jak to opisano wyżej.</p>

<sect3>Kasowanie łańcucha

<p>Kasowanie łańcucha również jest proste:

<tscreen><verb>
# ipchains -X test
#
</verb></tscreen>

Dlaczego '<tt>-X</tt>'? Cóż, wszystkie dobre litery były już zajęte.</p>

<p>Istnieje parę ograniczeń w kasowaniu łańcuchów: muszą być puste (sprawdĽ
<ref id="flushing" name="Oczyszczanie łańcucha"> poniżej) i nie mogą być
wskazywane przez jakąś regułę. Nie możesz oczywiście również skasować
żadnego z trzech wbudowanych łańcuchów.</p>

<sect3>Oczyszczanie łańcucha<label id="flushing">

<p>Jest prosty sposób by wykasować wszystkie reguły z łańcucha, robi
się to używając komendy '<tt>-F</tt>':

<tscreen><verb>
# ipchains -F forward
#
</verb></tscreen>

<p>Jeśli nie podasz łańcucha, oczyszczone zostaną <bf>wszystkie</bf>.</p>

<sect3>Listowanie zawartości łańcucha

<p>Możesz wylistować wszystkie reguły w łańcuchu, używając komendy '<tt>-L</tt>':

<tscreen><verb>
# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT)
target     prot opt    source                destination           ports
ACCEPT     icmp -----  anywhere              anywhere              any
# ipchains -L test
Chain test (refcnt = 0):
target     prot opt    source                destination           ports
DENY       icmp -----  localnet/24           anywhere              any
#
</verb></tscreen>

<p>Parametr '<tt>refcnt</tt>' podany dla łańcucha 'test' to ilość reguł, które
dotyczą łańcucha. Musi być on równy zero (a łańcuch musi być pusty) by
można go było skasować.</p>

<p>Jeśli pominięto nazwę łańcucha, listowane są wszystkie łańcuchy, nawet puste.</p>

<p>Są trzy opcje, które można dodać do '<tt>-L</tt>'. Opcja '<tt>-n</tt>'
(numerycznie) jest bardzo użyteczna ponieważ zapobiega próbie sprawdzania adresów IP
przez ipchains, co (jesli używasz DNSu jak większość ludzi) spowoduje duże
póĽnienia jeśli Twój DNS nie jest prawidłowo ustawiony, lub odfiltrowałeś
zapytania DNSowe. Opcja ta powoduje również drukowanie numerów portów zamiast ich
nazw.</p>

<p>Opcja '<tt>-v</tt>' pokazuje wszystkie detale reguły, takie jak liczniki
bajtów i pakietów, maski TOS, interfejs i oznaczanie pakietów. W innym przypadku te
dane są pomijane. Na przykład:

<tscreen><verb>
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
   10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
</verb></tscreen>

<p>Zauważ, że liczniki bajtów i pakietów drukowane są z suffiksami
'K', 'M' i 'G' - odpowiadającymi wartościom 100, 1,000,000 i 1,000,000,000. Użycie
opcji '<tt>-x</tt>' (pokaż pełne liczby) poda również pełne reprezentacje liczb,
bez względu na ich wielkość.</p>

<sect3>Resetowanie (Zerowanie) Liczników

<p>Użyteczna jest również możliwość resetowania liczników. Można
to zrobić komendą '<tt>-Z</tt>'. Na przykład:

<tscreen><verb>
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
   10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
# ipchains -Z input
# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT)
 pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
    0     0 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
#
</verb></tscreen>

<p>Problem z tym polega na tym, że czasami chciałbyś znać wartości
liczników tuż przed tym zanim zostaną zresetowane. W powyższym przykładzie pomiędzy
wydaniem komend '<tt>-L</tt>' i '<tt>-Z</tt>' mogło przejść jeszcze trochę
pakietów. Możesz zatem użyć obu komend jednocześnie by wylistować i wyzerować
liczniki. Niestety, możesz to zrobić tylko dla wszystkich łańcuchów:

<tscreen><verb>
# ipchains -L -v -Z
Chain input (policy ACCEPT):
 pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
   10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
    0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
# ipchains -L -v
Chain input (policy ACCEPT):
 pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
   10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

Chain forward (refcnt = 1): (policy ACCEPT)
Chain output (refcnt = 1): (policy ACCEPT)
Chain test (refcnt = 0):
    0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
#
</verb></tscreen>

<sect3>Ustawianie polityki<label id="policy">

<p>Patrzyliśmy już na to co się dzieje gdy pakiet dojdzie do końca
wbudowanego łańcucha kiedy mówiliśmy o tym jak pakiet przechodzi przez łańcuch w
<ref id="target-spec" name="Celu"> powyżej.. W tym przypadku, polityka dla łańcucha
determinuje los pakietu. Tylko wbudowane łańcuchy (input, output i forward) mogą
mieć politykę, ponieważ jeśli pakiet dotrze do końca łańcucha zdefiniowanego przez
użytkownika wraca do poprzedniego łańcucha.</p>

<p>Polityką może być każda z pierwszych czterech akcji: <tt>ACCEPT</tt>, <tt>DENY</tt>,
<tt>REJECT</tt> lub <tt>MASQ</tt>. <tt>MASQ</tt> jest prawidłowe tylko dla łańcucha
'forward'.</p>

<p>Ważne jest również by pamiętać o tym, że akcja <tt>RETURN</tt> w regule w
jednym z wbudowanych łańcuchów jest użyteczna wtedy, gdy chcemy by pakiet od razu
został potraktowany zgodnie z polityką łańcucha.</p>

<sect2>Operacje na Maskaradzie

<p>Jest kilka parametrów którymi możesz zmieniać Maskaradę IP. Są one wbudowane
w <tt>ipchains</tt> ponieważ nieopłacalne jest pisanie specjalnego narzędzia dla
nich (aczkolwiek to się zmieni).</p>

<p>Komendą Maskarady IP jest '<tt>-M</tt>' i może być łączona z '<tt>-L</tt>'
by wypisać aktualne zmaskaradowane połączenia, lub z '<tt>-S</tt>' by ustawić
parametry maskaradowania.</p>

<p>Parametr '<tt>-L</tt>' może być użyty z '<tt>-n</tt>' (pokaż numery zamiast nazw
hostów i nazw portów) lub '<tt>-v</tt>' (pokaż delty w numerach sekwencji dla
połączeń maskaradowanych, jeśli Cię to interesuje).</p>

<p>Parametrowi '<tt>-S</tt>' powinny towarzyszyć trzy parametry timeout'ów,
każdy w sekundach: dla sesji TCP, dla sesji TCP po pakiecie FIN i dla pakietów
UDP. Jeśli nie chcesz zmieniać którejś z wartości podaj zamiast niej wartość
'<tt>0</tt>'.</p>

<p>Domyślne wartości podane są w '<tt>/usr/src/linux/include/net/ip_masq.h</tt>',
aktualnie wynoszą one 15 minut, 2 minuty i 5 minut.</p>

<p>SprawdĽ również (<ref id="ftp" name="Koszmary z FTP"> poniżej) i informację o
problemach z ustawianiem timeoutów w
<ref id="no-timeout" name="Nie mogę ustawić timeoutów maskarady">.</p>

<sect2>Sprawdzanie pakietu

<p>Czasami chciałbyś sprawdzić, co się dzieje z określonym pakietem
gdy trafia do Twojej maszyny, na przykład gdy debugujesz łańcuchy ściany ogniowej.
<tt>ipchains</tt> posiadają komendę '<tt>-C</tt>' które pozwala na to, a używa
dokładnie tych samych procedur których kernel używa do operacji na prawdziwych
pakietach.</p>

<p>Po '<tt>-C</tt>' należy podać nazwę łańcucha który będziesz testował, wpisując jego
nazwę. Podczas gdy kernel zawsze zaczyna od łańcucha <tt>input</tt>, potem <tt>output</tt>
lub <tt>forward</tt>, Ty możesz zacząć od dowolnego łańcucha dla celów testowych.</p>

<p>Detale pakietu podawane są z użyciem takiej samej składni jak reguły ściany ogniowej.
W szczególności, protokół ('<tt>-p</tt>'), adres Ľródłowy ('<tt>-s</tt>'), adres
przeznaczenia ('<tt>-d</tt>') i interfejs ('<tt>-i</tt>') są obowiązkowe. Jeśli
protokołem jest TCP lub UDP, trzeba podać jeden adres Ľródłowy i jeden przeznazenia,
a jeśli jest nim ICMP, trzeba podać kod i typ (chyba, że użyto również parametru
'<tt>-f</tt>', który wskazuje na fragmenty - w tym momencie kod i typ są
nieprawidłowe).</p>

<p>Jeśli protokołem jest TCP (i nie podano parametru '<tt>-f</tt>'), można użyć
parametru '<tt>-y</tt>', by zaznaczyć, że obiekt powinien mieć ustawioną flagę SYN.</p>

<p>Poniżej przykład testowania pakietu TCP SYN z 192.168.1.1 port 60000
na 192.168.1.2 port www, przychodzącego do interfejsu eth0 i wchodzącego do
łańcucha input (klasyczna inicjacja połączenia WWW):

<tscreen><verb>
# ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
packet accepted
#
</verb></tscreen>

<sect2>Wiele reguł na raz i patrzymy co się dzieje

<p>Czasami pojedyńcza komenda daje w rezultacie testowanie przez wiele reguł.
Można to zrobić na dwa sposoby. Po pierwsze, podać nazwę hosta dla której DNS
zwraca wiele numerów IP - <tt>ipchains</tt> zachowa się tak, jakbyś wpisał
wiele komend dla każdego numeru IP.</p>

<p>Na przykład jeśli nazwa hosta 'www.foo.com' odpowiada trzem adresom IP,
a nazwa hosta 'www.bar.com' dwóm, to komenda
'<tt>ipchains -A input -j reject -s www.bar.com -d www.foo.com</tt>'
doda sześć reguł do łańcucha <tt>input</tt>.</p>

<p>Innym sposobem by <tt>ipchains</tt> wykonał wiele operacji, jest podanie flagi
<bf>dwukierunkowości</bf> (ang. <em>bidirectional</em>) - '<tt>-b</tt>'. Flaga ta
powoduje, że <tt>ipchains</tt> zachowuje się tak jakbyś wpisał komendę dwukrotnie,
za drugim razem odwracając adresy w parametrach '<tt>-s</tt>' i '<tt>-d</tt>'.
W związku z tym by zapobiec przekazywaniu do lub z 192.168.1.1, możesz napisać
tak jak niżej:

<tscreen><verb>
# ipchains -b -A forward -j reject -s 192.168.1.1
#
</verb></tscreen>

<p>Mi osobiście flaga '<tt>-b</tt>' nie odpowiada; jeśli chcesz wygód,
sprawdĽ <ref id="ipchains-save" name="Użycie ipchains-save"> poniżej.</p>

<p>Opcja '<tt>-b</tt>' może być użyta z opcją wstawiania ('<tt>-I</tt>'),
kasowania ('<tt>-D</tt>') (ale nie w przypadku gdy pobiera numer reguły),
dodawania ('<tt>-A</tt>') i sprawdzania ('<tt>-C</tt>').</p>

<p>Innym użytecznym parametrem jest '<tt>-v</tt>' który drukuje dokładnie to
co <tt>ipchains</tt> robi z Twoimi komendami. Jest to użyteczne gdy masz do
czynienia z wieloma komendami które mogą mieć wpływ na wiele reguł. Na przykład,
sprawdzamy zachowanie fragmentów pomiędzy 192.168.1.1 i 192.168.1.2:

<tscreen><verb>
# ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
  tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
packet accepted
  tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
packet accepted
#
</verb></tscreen>

<sect1>Użyteczne przykłady

<p>Mam połączenie dialup PPP ('<tt>-i ppp0</tt>'). Pobieram newsy
('<tt>-p TCP -s news.virtual.net.au nntp</tt>') i pocztę
('<tt>-p TCP -s mail.virtual.net.au pop-3</tt>') za każdym razem gdy się wdzwonię.
Używam serwera FTP Debiana by uaktualniać moją maszynę ('<tt>-p TCP -y -s ftp.debian.org.au ftp-data</tt>').
Przeglądam strony WWW przez proxy mojego dostawcy Internet'owego (ISP)
('<tt>-p TCP -d proxy.virtual.net.au 8080</tt>'), ale nienawidzę bannerów i reklam z
doubleclick.net na archiwach Dilbert'a
('<tt>-p TCP -y -d 199.95.207.0/24 i -p TCP -y -d 199.95.208.0/24</tt>').</p>

<p>Nie mam nic przeciwko ludziom próbującym ftpować się na moją
maszynę gdy jestem podłączony ('<tt>-p TCP -d $LOCALIP ftp</tt>'), ale nie chcę by
ktokolwiek z zewnątrz udawał, że ma adres IP mojej sieci wewnętrznej
('<tt>-s 192.168.1.0/24</tt>'). Nazywane jest to zwykle <bf>fałszowaniem</bf>
(ang. <em>spoofing</em>) IP i jest lepszy sposób na ochronienie się przed tym w
kernelach serii 2.1.x i wyższych (sprawdĽ <ref id="antispoof" name="Jak ustawić ochronę
przed fałszowaniem pakietów?">).</p>

<p>Konfiguracja jest raczej prosta, ponieważ nie mam w mojej sieci innych maszyn.</p>

<p>Nie chcę aby żaden lokalny proces (tzn. Netscape, Lynx i inne) próbowały połączyć
się z adresem doubleclick.net:

<tscreen><verb>
# ipchains -A output -d 199.95.207.0/24 -j REJECT
# ipchains -A output -d 199.95.208.0/24 -j REJECT
#
</verb></tscreen>
</p>

<p>Teraz, chciałbym ustawić priorytetyzację dla wychodzących pakietów
(ale nie ma po co robić tego dla przychodzących). Ponieważ reguł kontrolujących
jest już raczej dużo, wsadzę je do jednego łańcucha który nazwę '<tt>ppp-out</tt>':

<tscreen><verb>
# ipchains -N ppp-out
# ipchains -A output -i ppp0 -j ppp-out
#
</verb></tscreen>
</p>

<p>Minimalna zwłoka dla ruchu WWW i telnetu:

<tscreen><verb>
# ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 telnet -t 0x01 0x10
#
</verb></tscreen>
</p>

<p>Niski koszt dla ftp-data, nntp i pop-3:

<tscreen><verb>
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
#
</verb></tscreen>

<p>Jest również parę restrykcji dla pakietów przychodzących do
interfejsu <tt>ppp0</tt>: stwórzmy nowy łańcuch i nazwijmy go '<tt>ppp-in</tt>':

<tscreen><verb>
# ipchains -N ppp-in
# ipchains -A input -i ppp0 -j ppp-in
#
</verb></tscreen>
</p>

<p>Żaden pakiet przychodzący do <tt>ppp0</tt> nie powinien podawać, że
posiada adres Ľródłowy 192.168.*, więc odrzucamy je i logujemy:

<tscreen><verb>
# ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
#
</verb></tscreen>

<p>Pozwalam na ruch pakietów UDP dla działania DNSu (na mojej maszynie działa DNS
przekazujący, który kontaktuje się z maszyną 209.29.16.1, więc spodziewam
się odpowiedzi tylko od niego), ruch przychodzący ftp i ruch powrotny ftp-data (który
powinien być kierowany na porty powyżej 1023 i nie w okolicy portów X11):

<tscreen><verb>
# ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
# ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
#
</verb></tscreen>
</p>

<p>Pozwalam również na wracanie odpowiedzi TCP

<tscreen><verb>
# ipchains -A ppp-in -p TCP ! -y -j ACCEPT
#
</verb></tscreen>

<p>Na koniec, pakiety do mojej własnej maszyny z niej samej są OK:

<tscreen><verb>
# ipchains -A input -i lo -j ACCEPT
#
</verb></tscreen>

<p>A teraz, ustawiam swoją domyślną zasadę na <tt>DENY</tt>, więc wszystko
inne jest odrzucane:

<tscreen><verb>
# ipchains -P input DENY
#
</verb></tscreen>

<p>UWAGA: Nie ustawiałbym swoich reguł w tej kolejności, ponieważ pakiety mogą
dostać się do mojej maszyny w trakcie jej konfigurowania. Najbezpieczniejsze jest
ustawienie domyślnej zasady na <tt>DENY</tt> najpierw, potem wstawienie reguł.
Oczywiście, jeśli Twoje reguły wymagają sprawdzeń DNSowych możesz mieć problem.</p>

<sect2>Użycie ipchains-save<label id="ipchains-save">

<p>Ustawienie łańcuchów ściany ogniowej dokładnie tak jak chcesz je mieć ustawione,
a potem jeszcze próba spamiętania poszczególnych komend i ich kolejności tak,
byś mógł je wydać ponownie po restarcie, jest raczej bolesne.</p>

<p>Istnieje skrypt <tt>ipchains-save</tt>, który zczytuje aktualne ustawienia i
zapisuje je do pliku. Na razie pozostawię Cię z odrobinę niepewności, co do działania
skryptu <tt>ipchains-restore</tt>.</p>

<p><tt>ipchains-save</tt> zapisuje pojedyńczy łańcuch, lub wszystkie łańcuchy
(jeśli nie podano nazwy łańcucha). Jedyną opcją obecnie obsługiwaną jest '<tt>-v</tt>',
która drukuje wszystkie reguły (do stderr) w momencie gdy są zapisywane. Polityka dla
łańcucha jest również zapisywana dla łańcuchów <tt>input</tt>, <tt>output</tt> i
<tt>forward</tt>.

<tscreen><verb>
# ipchains-save > my_firewall
Saving `input'.
Saving `output'.
Saving `forward'.
Saving `ppp-in'.
Saving `ppp-out'.
#
</verb></tscreen>
</p>
<sect2>Użycie ipchains-restore

<p><tt>ipchains-restore</tt> odbudowywuje łańcuchy zapisane przez <tt>ipchains-save</tt>.
Można go wywołać z dwoma opcjami: '<tt>-v</tt>' który powoduje opisanie każdej reguły w
trakcie jej dodawania i '<tt>-f</tt>' który wymusza wyczyszczenie reguł które już
są skonfigurowane.</p>

<p>Gdy znaleziony jest zdefiniowany przez użytkownika łańcuch w pliku
który czyta <tt>ipchains-restore</tt>, sprawdzane jest czy taki już istnieje.
Jeśli tak, zostaniesz spytany czy ten istniejący powinien zostać oczyszczony
(usunięte wszystkie reguły) czy odzyskiwanie reguł powinno zostać ominięte. Jeśli
podałeś '<tt>-f</tt>', nie zostaniesz spytany, a łańcuch zostanie oczyszczony.</p>

<p>Na przykład:

<tscreen><verb>
# ipchains-restore < my_firewall
Restoring `input'.
Restoring `output'.
Restoring `forward'.
Restoring `ppp-in'.
Chain `ppp-in' already exists. Skip or flush? [S/f]? s
Skipping `ppp-in'.
Restoring `ppp-out'.
Chain `ppp-out' already exists. Skip or flush? [S/f]? f
Flushing `ppp-out'.
#
</verb></tscreen>

<sect>Różne

<p>Ta sekcja zawiera informacje i FAQ których nie mogłem zmieścić w
strukturze powyżej.</p>

<sect1>Jak zorganizować reguły swojej ściany ogniowej<label id="organisation">

<p>To pytanie wymaga przemyślenia. Możesz spróbować zorganizować je
pod kątem prędkości (zminimalizować liczbę sprawdzeń reguł dla najczęściej
spotykanych pakietów) lub pod kątem zarządzania.</p>

<p>Jeśli nie masz stałego łącza, powiedzmy łącze PPP, możesz chcieć by pierwsza
reguła w łańcuchu <tt>input</tt> brzmiała '<tt>-i ppp0 -j DENY</tt>' w trakcie
procesu uruchamiania, a potem coś podobnego w skrypcie podnoszącym interfejs -
<tt>ip-up</tt>:

<tscreen><verb>
# Re-create the `ppp-in' chain.
ipchains-restore -f < ppp-in.firewall

# Replace DENY rule with jump to ppp-handling chain.
ipchains -R input 1 -i ppp0 -j ppp-in
</verb></tscreen>

<p>Twój skrypt <tt>ip-down</tt> mógłby wyglądać tak:

<tscreen><verb>
ipchains -R input 1 -i ppp0 -j DENY
</verb></tscreen>

<sect1>Czego nie filtrować

<p>Jest parę rzeczy z których powinieneś zdawać sobie sprawę zanim
zaczniesz filtrować wszystko czego nie chcesz.</p>

<sect2>Pakiety ICMP<label id="ICMP">

<p>Pakiety ICMP są używane (między innymi) do wskazywana na błędy innych protokołów
(takich jak TCP czy UDP). Zwykle dotyczy to pakietów '<tt>destination-unreachable</tt>'.
Zablokowanie takich pakietów oznacza że nie otrzymasz nigdy komunikatu zwrotnego
'<tt>Host unreachable</tt>' lub '<tt>No route to host</tt>'; wszystkie połączenia będą
po prostu czekały na odpowiedĽ która nigdy nie nadejdzie. Jest to trochę irytujące,
ale rzadko fatalne.</p>

<p>Większym problemem jest rola pakietów ICMP w rozpoznawaniu MTU. Wszystkie dobre
implementacje TCP (w tym Linuksa) używają rozpoznawania MTU by sprawdzić jaki największy
pakiet da się wysłać pod dany adres unikając fragmentacji (która zmniejsza wydajność,
zwłaszcza gdy zdarzy się że jakiś fragment zginął w ogóle). Rozpoznawanie MTU działa w
ten sposób: wysyła pakiety z ustawionym bitem '<tt>Don't Fragment</tt>', a potem coraz
mniejsze jeśli dostanie odpowiedĽ ICMP '<tt>fragmentation-needed</tt>'. Jest to pakiet z
rodzaju '<tt>destination-unreachable</tt>' i jeśli taki komunikat nie zostanie odebrany,
lokalna maszyna nie zmniejszy MTU a wydajność takiego łącza będzie koszmarna, lub w ogóle
jej nie będzie.</p>

<p>Zwróć jednak uwage, że powszechne jest blokowanie komunikatów ICMP o
przekierowaniu (typ 5); mogą one być używane do manipulowania rutingiem (aczkolwiek
dobre stosy IP mają zabezpieczenia), są więc odbierane jako raczej ryzykowne.</p>

<sect2>Połączenia TCP do serwerów DNS

<p>Jeśli starasz się zablokować wychodzące pakiety TCP, pamiętaj o tym że DNS nie
zawsze używa UDP; jeśli odpowiedĽ z serwera jest dłuższa niż 512 bajtów, klient używa
połączenia TCP (do portu 53) by uzyskać dane.</p>

<p>Może to być pułapka, ponieważ DNS będzie nadal 'prawie zawsze' działał jeśli
zabronisz takiego ruchu; możesz jednak napotkać dziwnie długie odpowiedzi lub inne
problemy z DNSem.</p>

<p>Jeśli Twoje zapytania DNSowe są zawsze kierowane do tej samej zewnętrznej maszyny
(albo bezpośrednio przez użycie serwera nazw w pliku '<tt>/etc/resolv.conf</tt>' lub
przez użycie cache'u serwera nazw w trybie przekazywania), będziesz potrzebował
tylko pozwolenia na połączenia TCP do tego serwera na port 'domain' z lokalnego portu
'domain' (jeśli używasz serwera nazw cache'ującego) lub na wyższy port (>1023)
jeśli używasz '<tt>/etc/resolv.conf</tt>'.</p>

<sect2>Koszmary z FTP<label id="ftp">

<p>Klasycznym problemem filtrowania pakietów jest FTP. FTP ma dwa tryby pracy:
tradycyjny nazywany <bf>trybem aktywnym</bf> (ang. <em>active mode</em>) i trochę
nowszy zwany <bf>trybem pasywnym</bf> (ang. <em>passive mode</em>). Przeglądarki
WWW używają zwykle trybu pasywanego, ale programy FTP z kolei zwykle aktywnego.</p>

<p>W trybie aktywnym, kiedy zdalny koniec chce wysłać plik (lub nawet jeśli chce
zwrócić rezultat poleceń '<tt>ls</tt>' czy '<tt>dir</tt>') próbuje otworzyć
połączenie TCP do maszyny lokalnej. To oznacza, że nie możesz odfiltrować
połączeń TCP bez wyłączania aktywnego FTP.</p>

<p>Jeśli masz możliwość używania trybu pasywnego, jest lepiej - dane w trybie
pasywnym przesyłane są połączeniami klient-serwer, nawet jeśli chodzi o dane
przychodzące od serwera. W innym przypadku, zalecane jest na zezwolenie na połączenia
TCP tylko na portach powyżej 1024 i nie pomiędzy 6000 a 6010 (6000 używany jest przez
X-Windows).</p>

<sect1>Odfiltrowanie Ping of Death

<p>Komputery z Linuksem są aktualnie podatne na znany Ping of Death, który polega
na wysłaniu niepoprawnie dużego pakietu ICMP, powodującego przepełnienie buforów i
stosu TCP komputera, który go otrzyma, a w rezultacie poważne problemy.</p>

<p>Jeśli zajmujesz się ochroną komputerów, które mogą być narażone, możesz po prostu
zablokować fragmenty ICMP. Normalne pakiety ICMP nie są na tyle duże by wymagać
fragmentacji, więc nie zepsujesz niczego oprócz wielkich ping'ów.  Słyszałem
(niepotwierdzone) o tym, że niektóre systemy potrzebowały tylko ostatniego fragmentu
wielkiego pakietu ICMP by zaburzyć ich działanie, więc blokowanie tylko pierwszego
fragmentu jest raczej bezcelowe.</p>

<p>Podczas gdy exploity które widziałem wszystkie wykorzystują ICMP, nie ma powodów
by nie użyć fragmentów pakietów TCP czy UDP (lub nieznanego protokołu) do takiego
ataku, więc zablokowanie fragmentów ICMP to tylko rozwiązanie tymczasowe.</p>

<sect1>Odfiltrowanie Teardrop i Bonk

<p>Teardrop i Bonk to dwa ataki (głównie przeciwko komputerom z Microsoft Windows NT),
które polegają na nakładających się fragmentach. Rozwiązaniem jest posiadanie kompuera
z Linuksem, który zajmuje się defragmentacją, lub zabronienie przechodzenia fragmentów
do narażonych maszyn.</p>

<sect1>Odfiltrowanie Bomb Fragmentowych

<p>Niektóre mniej stabilne implementacje stosu TCP mają problemy z obsługą dużej
ilości fragmentów pakietów, jeśli nie otrzymają wszystkich fragmentów. Linux nie ma tego
problemu. Możesz odfiltrowywać fragmenty (co może jednak spowodować problemy dla
normalnych użytkowników), lub skompilować swój kernel z opcją 'IP: always defragment'
ustawioną na '<tt>Y</tt>' (tylko jeśli twój Linux jest jedyną możliwą drogą dla
tych pakietów).</p>

<sect1>Zmiana reguł ściany ogniowej

<p>Są pewne czasowe zależności związane ze zmianą reguł ściany ogniowej. Jeśli
nie jesteś ostrożny, możesz dać pakietom przejść w połowie twoich zmian.
Najprostszym rozwiązaniem jest zrobienie czegoś takiego:

<tscreen><verb>
# ipchains -I input 1 -j DENY
# ipchains -I output 1 -j DENY
# ipchains -I forward 1 -j DENY

... wykonanie zmian ...

# ipchains -D input 1
# ipchains -D output 1
# ipchains -D forward 1
#
</verb></tscreen>

Odrzuca to wszystkie pakiety na czas zmian.</p>

<p>Jeśli twoje zmiany ograniczają się do jednego łańcucha, możesz chcieć stworzyć
nowy łańcuch z nowymi regułami, a potem zastąpić ('<tt>-R</tt>') regułę, która
wskazywała na stary łańcuch nową, wskazującą na nowy łańcuch, a potem
skasować stary. To zastąpienie nastąpi niezauważalnie i nie będzie miało
skutków ubocznych.</p>

<sect1>Jak skonfigurować ochronę przez fałszowaniem IP?<label id="antispoof">

<p>Fałszowanie IP to technika, w której host wysyła pakiety opisane jako pochodzące
z innego hosta. Ponieważ filtrowanie pakietów podejmuje decyzje na podstawie
adresu Ľródłowego, fałszowanie IP może być użyte do ogłupienia go. Jest również
używane do ukrycia prawdziwego adresu osoby używającej ataków SYN, Teardrop, Ping of
Death i podobnych (nie martw się jeśli nie wiesz na czym polegają).</p>

<p>Najlepszą ochroną przed tym jest <bf>Weryfikacja Adresu ¬ródłowego</bf>
(ang. <em>Source Address Verification</em>) i jest dokonywana przez kod rutujący,
a nie przez kod ściany ogniowej. Spójrz do pliku '<tt>/proc/sys/net/ipv4/conf/all/rp_filter</tt>'.
Jeśli istnieje, to włączenie tej weryfikacji podczas każdego boot-u jest prawidłowym
rozwiązaniem. By to zrobić, wstaw poniższe linie gdzieś do skryptów startowych, zanim
jakikolwiek interfejs sieciowy zostanie zainicjowany:

<tscreen><verb>
# This is the best method: turn on Source Address Verification and get
# spoof protection on all current and future interfaces.
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
  echo -n "Setting up IP spoofing protection..."
  for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
      echo 1 > $f
  done
  echo "done."
else
  echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
  echo "CONTROL-D will exit from this shell and continue system startup."
  echo
  # Start a single user shell on the console
  /sbin/sulogin $CONSOLE
fi
</verb></tscreen>

<p>Jeśli nie możesz tego zrobić, możesz manualnie wstawić reguły dla ochrony każdego
interfejsu. To wymaga niestety znajomości każdego interfejsu. W kernelach serii 2.1.x
automatycznie odrzucane są pakiety nadchodzące z adresów 127.* (zarezerwowanych dla
pętli zwrotnych - lo).</p>

<p>Na przykład, powiedzmy że mamy trzy interfejsy - <tt>eth0</tt>, <tt>eth1</tt>
i <tt>ppp0</tt>. Używamy <tt>ifconfig</tt> by sprawdzić jakie adresy i maski sieciowe mają
interfejsy. Powiedzmy że <tt>eth0</tt> jest podłączony do sieci 192.168.1.0 z maską
255.255.255.0, <tt>eth1</tt> jest podłączony do sieci 10.0.0.0 z maską 255.0.0.0 a
<tt>ppp0</tt> jest podłączony do Internetu (w którym dowolny adres, poza prywatnymi IP,
jest dozwolony) i używamy takich reguł:

<tscreen><verb>
# ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
# ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
# ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
# ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
#
</verb></tscreen>

<p>To podejście nie jest tak dobre jak Weryfikacja adresu Ľródłowego, ponieważ
jeśli twoja sieć zmieni się, będziesz musiał zmieniać również reguły
ściany ogniowej.</p>

<p>Jeśli używasz kernela serii 2.0.x, możesz chcieć zabezpieczyć interfejs
lo, używając reguły takiej jak ta:

<tscreen><verb>
# ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
#
</verb></tscreen>

<sect1>Zaawansowane projekty

<p>Napisałem bibliotekę zawartą w dystrybucji Ľródłowej <tt>ipchains</tt>
o nazwie '<tt>libfw</tt>'. Używa ona możliwości łańcuchów IP w wersjach 1.3
i wyższych, by kopiować pakiety do <bf>przestrzeni użytkownika</bf>
(ang. <em>userspace</em>) - aby to było możliwe należy dodać w konfiguracji
jądra opcję 'IP_FIREWALL_NETLINK'.</p>

<p>Pole przeznaczone na oznaczenie pakietu, może być użyte do podawania
parametru <bf>jakości usługi</bf> (ang. <em>Quality of Service</em>) dla pakietu,
lub by podać jak pakiet ma zostać przekazany do zadanego portu. Nie używałem
żadnej z tych opcji, ale jeśli ktoś chciałby o tym napisać, proszę skontaktować
się ze mną.</p>

<p>Takie zagadnienia jak <bf>filtrowanie ze sprawdzaniem stanów</bf>
(ang. <em>stateful inspection firewalling</em>) (preferuję termin <bf>dynamiczna
ściana ogniowa</bf>) mogą zostać zaimplementowanie w przestrzeni użytkownika jako
biblioteka. Innymi fajnymi pomysłami może być kontrola pakietów na poziomie
użytkowników przez demona działającego w przestrzeni użytkownika. Powinno to
być raczej łatwe.</p>

<sect2>Filtrowanie ze sprawdzaniem stanów (ang.<em>Stateful Packet Filtering</em>)

<p>Pod adresem <url url="ftp://ftp.interlinx.bc.ca/pub/spf"> znajduje się strona
Brian'a Murrell'a z projektem SPF. W ramach niego wykonuje się śledzenie
połączeń w przestrzeni użytkownika. Dodaje to warstwę bezpieczeństwa dla
serwerów z łączem o małej przepustowości.</p>

<p>Aktualnie dostępna jest tylko szczątkowa dokumentacja, ale cytuję
tutaj post, na który Brian odpowiedział i wyjaśnił pewne pytania:

<tscreen><verb>

> Jak podejrzewam, działa to dokładnie tak jakbym chciał:
> zainstalowanie tymczasowej 'wstecznej' reguły by dać
> pakietom wejść jako odpowiedĽ na zapytanie wychodzące

Tak, dokładnie to robi. Im więcej protokołów rozumie, tym bardziej
'wsteczne' reguły jest w stanie poprawnie obsłużyć. Aktualnie jest w
stanie obsłużyć (z pamięci, proszę wybaczyć za błędy lub pominięcia)
FTP (aktywne i pasywne, wejście i wyjście), część RealAudio, traceroute,
ICMP i podstawowy ICQ (wejście z serwera ICQ i bezpośrednie połączenia
TCP, ale inne sprawy takie jak dodatkowe połączenia TCP dla przesyłania
plików itp. jeszcze nie).

> Czy to zamiennik dla ipchains czy suplement?

Suplement. Myśl o ipchains jako silniku który umożliwia i zapobiega
podróże pakietów przez system z Linuksem. SPF to sterownik, ciągle monitorujący ruch
i mówiący ipchains jak zarządzać zasadami by odzwierciedlać zmiany we wzorcach
ruchu.
</verb></tscreen>

<sect2>Patch na ftp-data Michaela Hasenstein'a

<p>Michael Hasanstein z SuSE napisał patch do kernela, który dodaje
obsługę śledzenia połączeń ftp dla ipchains. Aktualnie patch można znaleĽć
pod adresem <url url="http://www.suse.de/~mha/patch.ftp-data-2.gz">.</p>

<sect1>Przyszłe rozszerzenia

<p>¦ciany ogniowe i NAT są w trakcie przeprojektowywania dla wersji
kerneli 2.4.x. Plany i dyskusje są dostępne w archiwum netfilter
(zajrzyj pod <url url="http://lists.samba.org" name="http://lists.samba.org">).
Rozszerzenia te powinny oczyścić wiele wspaniałych zagadnień
(ściany ogniowe i maskarada nie powinny być takie trudne) oraz pozwolić na
rozwój o wiele elastyczniejszej ściany ogniowej.</p>

<sect>Najczęstsze problemy

<p>
<sect1>ipchains -L zawiesza się!

<p>Prawdopodobnie blokujesz zapytania DNS; być może dostaniesz time-out
i program ruszy dalej. Spróbuj używać opcji '<tt>-n</tt>', która zapobiega
sprawdzaniu nazw.</p>

<p>
<sect1>Inwersja nie działa!

<p>Musisz otoczyć znak '<tt>!</tt>' spacjami z obu stron. Klasycznym
<bf>błędem</bf> jest (o czym ostrzegam w 1.3.10):

<tscreen><verb>
# ipchains -A input -i !eth0 -j DENY
#
</verb></tscreen>

Nie będzie nigdy interfejsu '<tt>!eth0</tt>', ale <tt>ipchains</tt>
o tym nie wie.</p>

<p>
<sect1>Maskarada/Przekazywanie nie działa!

<p>Upewnij się, że przekazywanie pakietów jest włączone (w nowych kernelach
jest domyślnie <bf>wyłączone</bf>, tzn. pakiety nigdy nie przejdą do łańcucha
'<tt>forward</tt>'). Możesz je ustawić (jako root) pisząc:

<tscreen><verb>
# echo 1 > /proc/sys/net/ipv4/ip_forward
#
</verb></tscreen>
</p>

<p>Jeśli to działa, wstaw tą linię gdzieś w skrypcie bootującym
żeby było włączone zawsze. Dobrze jest jednak ustawić najpierw reguły ściany
ogniowej zanim uruchomisz tą komendę, żeby zapobiec przedostaniu się jakichś
pakietów.</p>

<p>
<sect1>-j REDIR nie działa!

<p>Musisz umożliwić przekazywanie pakietów (punkt wyżej) by działało
przekierowanie; w innym przypadku kod rutujący będzie odrzucał pakiety. Jeśli
używasz tylko przekierowania i w ogóle nie masz ustawionego przekazywania,
powinieneś zwrócić na ten mechanizm uwagę.</p>

<p>Zauważ że REDIR (który jest w łańcuchu wejściowym) nie ma wpływu na
połączenia z lokalnych procesów.</p>

<sect1>Maski w interfejsach nie działają!

<p>W kernelach wersji 2.1.102 i 2.1.103 był błąd (i w jakiś starych
patch'ach które wyprodukowałem), który powodował że interfejs wskazany
ipchains przez maskę (tak jak np. '<tt>-i ppp+</tt>') był błędny.</p>

<p>Zostało to poprawione w nowszych kernelach, a w 2.0.34 przez patch na
stronach WWW. Możesz to również poprawić odręcznie, zmieniając w Ľródłach kernela
w pliku '<tt>include/linux/ip_fw.h</tt>' linię 63 z takiej postaci:

<tscreen><verb>
#define IP_FW_F_MASK	0x002F	/* All possible flag bits mask   */
</verb></tscreen>
</p>

<p>Powinna zawierać '<tt>0x003F</tt>'. Popraw to i przekompiluj kernel.</p>

<sect1>TOS nie działa!

<p>To był mój błąd: ustawienie pola TOS tak naprawdę nie zmieniało
nic w kernelach wersji 2.1.102 do 2.1.111. Zostało to poprawione w 2.1.112 i
póĽniejszych.</p>

<sect1>ipautofw i ipportfw nie działają!

<p>Dla kerneli serii 2.0.x to prawda - nie mam czasu na tworzenie i
utrzymywanie wielkich patch'y dla <tt>ipchains</tt> i <tt>ipautofw/ipportfw</tt>.
Dla wersji 2.1.x ściągnij <tt>ipmasqadm</tt> od Juan Ciarlante:
<url url="http://juanjox.linuxhq.com/"> i używaj tego narzędzia dokładnie
tak jak użyłbyś <tt>ipautofw</tt> czy <tt>ipportfw</tt>, tylko zamiast pisać
<tt>ipportfw</tt> piszesz <tt>ipmasqadm portfw</tt>, a zamiast <tt>ipautofw</tt>
piszesz <tt>ipmasqadm autofw</tt>.</p>

<sect1>xosview nie działa!

<p>Wersja 1.6.0 lub wyższa, nie potrzebuje reguł ściany ogniowej dla
wszystkich kerneli 2.1.x. Niestety, znowu nie działa w wersji 1.6.1 - proszę
pomęczyć autora (to nie moja wina!).</p>

<sect1>Segmentation Fault przy `-j REDIRECT'!

<p>To był błąd w ipchains w wersji 1.3.3. Proszę uaktualnić wersję.</p>

<sect1>Nie mogę ustawić timeout'ów Maskarady!<label id="no-timeout">

<p>Faktycznie tak jest dla kerneli wersji 2.1.x do 2.1.123. W 2.1.124
próba ustawienia timeotów Maskarady kończy się zablokowaniem kernela
(zmień <tt>return</tt> na <tt>ret =</tt> w lini 1328 pliku
'<tt>net/ipv4/ip_fw.c</tt>'). W 2.1.125 działa już dobrze.</p>

<sect1>Chcę obsługiwać na ścianie ogniowej IPX!

<p>Tak samo jak inni. Niestety, mój kod zajmuje się tylko IP, . Z drugiej
strony, przygotowano wszystko by to robić! Musisz tylko napisać kod. Będę
szczęśliwy móc pomóc gdzie to możliwe.</p>

<sect>Całkiem poważny przykład.

<p>Ten przykład pochodzi z mojego i Michael'a Neulinga tutoriala z
LinuxWorld z marca 1999. To nie jedyne rozwiązanie problemu, ale prawdopodobnie
najprostsze. Mam nadzieję, że będzie dla ciebie cenne.</p>

<sect1>Sytuacja

<p>
<itemize>
<item> sieć wewnętrzna zmaskaradowana (różne systemy operacyjne), będziemy je nazywać 'Dobrymi' (<tt>GOOD</tt>);

<item> narażone serwery w oddzielnej sieci (które będziemy nazywać 'strefą DMZ' (zdemilitaryzowaną) )

<item> połączenie PPP do Internetu (nazwane 'Złe' - <tt>BAD</tt> )
</itemize>

<p>
<tscreen><verb>
   Sieć zewnętrzna (BAD)
           |
           |
       ppp0|
    ---------------
    | 192.84.219.1|             Sieć serwerów (DMZ)
    |             |eth0
    |             |----------------------------------------------
    |             |192.84.219.250 |             |              |
    |             |               |             |              |
    |192.168.1.250|               |             |              |
    ---------------          --------       -------        -------
           | eth1            | SMTP |       | DNS |        | WWW |
           |                 --------       -------        -------
           |              192.84.219.128  192.84.219.129  192.84.218.130
           |
   Sieć wewnętrzna (GOOD)
</verb></tscreen>

<sect1>Nasze cele

<p>Komputer filtrujący pakiety:
 <descrip>
 <tag>PING do każdej sieci</tag>użyteczne by stwierdzić, czy maszyna nie działa

 <tag>TRACEROUTE do każdej sieci</tag>ponownie, do celół diagnostycznych

 <tag>Dostęp do DNS</tag>aby ping i DNS były użyteczne
 </descrip>
</p>

<p>W strefie DMZ:</p>

<p>Serwer pocztowy:
   <itemize>
   <item>SMTP na zewnątrz
   <item>akceptowanie połączeń SMTP z zewnętrz i wewnątrz
   <item>akceptowanie POP-3 z wewnątrz
   </itemize>
<p>Serwer nazw:
   <itemize>
   <item>wysyłanie DNSu na zewnątrz
   <item>akceptowanie DNSu z wewnątrz, wewnątrz i z komputera filtrującego pakiety
   </itemize>
<p>Serwer WWW:
   <itemize>
   <item>akceptowanie HTTP z zewnątrz i wewnątrz
   <item>dostęp rsync z wewnątrz
   </itemize>

<p>Sieć wewnętrzna:
 <descrip>
 <tag>Zezwalamy na WWW, ftp, traceroute, ssh do komputerów zewnętrznych</tag> To raczej normalne rzeczy
 do "puszczenia" - można zacząć od umożliwienia maszynom  wewnętrznym na dowolny ruch, ale tutaj jesteśmy
 bardzo restrykcyjni.

 <tag>Zezwalamy na ruch SMTP do serwera pocztowego</tag> Oczywiście, chcemy by można było wysyłać pocztę.

 <tag>Zezwalamy na ruch POP-3 do serwera pocztowego</tag> W ten sposób będzie można czytać pocztę.

 <tag>Zezwalamy na ruch DNS do serwera nazw</tag> Musi być możliwość używania nazw maszyn zewnętrznych
 dla WWW, ftp, traceroute i ssh.

 <tag>Zezwalamy na ruch rsync do serwera WWW</tag> Tak będziemy synchronizować serwer zewnętrzny z wewnętrznym.

 <tag>Zezwalamy na ruch WWW do serwera WWW</tag> Oczywiście powinna być możliwość połączenia się do naszego
 zewnętrznego serwera.

 <tag>Zezwalamy na pingowanie komputera filtrującego pakiety</tag> W ten sposób mogą pingować serwer i
 sprawdzać, czy naprawdę nie działa (a nie winić nas za problemy z jakąś maszyną w Internecie).
 </descrip>

<sect1>Przed filtrowaniem pakietów

<p>

<itemize>
<item>Ochrona przed fałszowaniem (ang.<em>anti-spoofing</em>)

<p>Ponieważ nie mamy asymetrycznego rutingu, możemy po prostu włączyć
ochronę przed fałszowaniem dla wszystkich interfejsów:

<tscreen><verb>
# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
#
</verb></tscreen>

<item>Ustawienie zasad filtrujących na <tt>DENY</tt>

<p>Nadal jednak pozwalamy na ruch po interfejsie <tt>lo</tt>, ale zabraniamy wszystkiego innego:

<tscreen><verb>
# ipchains -A input -i ! lo -j DENY
# ipchains -A output -i ! lo -j DENY
# ipchains -A forward -j DENY
#
</verb></tscreen>

<item>Ustawienie interfejsów

<p>Ma to zwykle miejsce w skryptach startowych. Upewnij się, że powyższe punkty zostały
wykonane przed ustawieniem interfejsów, by zapobiec przeciekowi pakietów zanim
ustawisz reguły.

<item>Wstawienie modułów maskaradujących do poszczególnych protokołów

<p>Musimy dołączyć moduł FTP do naszej maskarady, by aktywne i pasywne
sesje FTP działały z sieci wewnętrznej.

<tscreen><verb>
# insmod ip_masq_ftp
#
</verb></tscreen>
</itemize>

<sect1>Filtrowanie pakietów dla pakietów które mogą będą tylko przechodzić

<p>Jeśli chodzi o maskaradę, najlepiej jest filtrować w łańcuchu <tt>forward</tt>.</p>

<p>Podziel go na różne zestawy własnych łańcuchów, w zależności od adresów
Ľródła/przeznaczenia interfejsów; pozwala to na podzielenie problemu na łatwiej
zarządzalne kawałki.

<tscreen><verb>
ipchains -N good-dmz
ipchains -N bad-dmz
ipchains -N good-bad
ipchains -N dmz-good
ipchains -N dmz-bad
ipchains -N bad-good
</verb></tscreen>

Pozwalamy standardowym pakietom ICMP informującym o błędach na przejście, więc
tworzymy dla nich oddzielny łańcuch:

<tscreen><verb>
ipchains -N icmp-acc
</verb></tscreen>

<sect2>Ustawienie celów z łańcucha <tt>forward</tt>

<p>Niestety, znamy w nim tylko interfejs wychodzący. Wobec tego, aby sprawdzić z
którego interfejsu pakiet przyszedł, musimy sprawdzić adres Ľródłowy
(ochrona przed fałszowaniem zapobiega podszywaniu się pod adresy).</p>

<p>Zauważ że logujemy wszystko co nie pasuje do tych reguł
(oczywiście, nigdy nie powinno się zdarzyć).

<tscreen><verb>
ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
ipchains -A forward -i eth0 -j bad-dmz
ipchains -A forward -i eth1 -j bad-good
ipchains -A forward -j DENY -l
</verb></tscreen>

<sect2>Definiujemy łańcuch icmp-acc

<p>Pakiety będące pakietami ICMP zawiadamiającymi o błędzie są akceptowane,
a w innym wypadku kontrola jest zwracana do łańcucha wywołującego.

<tscreen><verb>
ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
</verb></tscreen>
</p>

<sect2> Dobre (sieć wewnętrzna) do DMZ (serwery)

<p>Restrykcje wewnętrze :

 <itemize>
 <item> Zezwalamy na WWW, ftp, traceroute, ssh to komputerów wewnętrznych
 <item> Zezwalamy na SMTP do serwera poczty
 <item> Zezwalamy na POP3 do serwera poczty
 <item> Zezwalamy na DNS do serwera nazw
 <item> Zezwalamy na rsync do serwera WWW
 <item> Zezwalamy na WWW do serwera WWW
 <item> Zezwalamy na ping do komputera filtrującego pakiety
 </itemize>

Moglibyśmy zrobić maskaradę z sieci wewnętrznej do strefy DMZ, ale tutaj tego
nie robimy. Ponieważ nikt z sieci wewnętrznej nie powinien próbować niczego
złego, logujemy pakiety które są odrzucane/anulowane.</p>

<p>Zauważ, że stare wersje Debiana nazywały usługę '<tt>pop3</tt>'
nazwą '<tt>pop-3</tt>' (w pliku '<tt>/etc/services</tt>') co jest
niezgodne z RFC1700.

<tscreen><verb>
ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.128 pop3 -j ACCEPT
ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
ipchains -A good-dmz -p icmp -j icmp-acc
ipchains -A good-dmz -j DENY -l
</verb></tscreen>

<sect2>Zła (sieć zewnętrzna) to DMZ (serwery).

<p>
<itemize>
<item>Restrykcje strefy DMZ:
 <itemize>
 <item>Serwer poczty:
   <itemize>
   <item>Serwer SMTP dla komputerów zewnętrznych
   <item>Zezwalamy na SMTP z wewnątrz i zewnątrz
   <item>Zezwalamy na POP3 z wewnątrz
   </itemize>

 <item>Serwer nazw:
   <itemize>
   <item>Wysyłamy DNS do komputerów zewnętrznych
   <item>Zezwalamy na DNS z sieci wewnętrznej, zewnętrznej i komputera filtrującego pakiety
   </itemize>

 <item>Serwer WWW:
   <itemize>
   <item>Zezwalamy na HTTP z sieci wewnętrznej i zewnętrznej
   <item>Zezwalamy na rsync z sieci wewnętrznej
   </itemize>
 </itemize>

<item>Rzeczy na które zezwalamy z sieci zewnętrznej do strefy DMZ:
 <itemize>
 <item>Nie logujemy naruszeń reguł, ponieważ mogą się zdarzyć
 </itemize>

<tscreen><verb>
ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
ipchains -A bad-dmz -p icmp -j icmp-acc
ipchains -A bad-dmz -j DENY
</verb></tscreen>
</itemize>
</p>

<sect2> Dobra (sieć wewnętrzna) do Złej (zewnętrznej).
<p>
<itemize>
<item>Wewnętrzne restrykcje:
 <itemize>
 <item>Zezwalamy na WWW, ftp, traceroute i ssh do sieci zewnętrznych
 <item>Zezwalamy na SMTP do serwera poczty
 <item>Zezwalamy na POP3 do serwera poczty
 <item>Zezwalamy na DNS do serwera nazw
 <item>Zezwalamy na rsync do serwera WWW
 <item>Zezwalamy na WWW do serwera WWW
 <item>Zezwalamy na ping do komputera filtrującego pakiety
 </itemize>
<item>Wiele osób zezwala na dowolny ruch z sieci wewnętrznej do zewnętrznej, a potem dodaje restrykcje.
My będziemy faszystami:
 <itemize>
 <item>Logujemy naruszenia reguł
 <item>Pasywny FTP będzie obsługiwany przez moduł maskarady
 <item>Porty UDP 33434 i wyższe, używane są przez traceroute.
 </itemize>
<tscreen><verb>
ipchains -A good-bad -p tcp --dport www -j MASQ
ipchains -A good-bad -p tcp --dport ssh -j MASQ
ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
ipchains -A good-bad -p tcp --dport ftp -j MASQ
ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
ipchains -A good-bad -j REJECT -l
</verb></tscreen>
</itemize>

<sect2>DMZ do Dobrej (wewnętrznej).
<p>

<itemize>
<item>Wewnętrzne restrykcje:
 <itemize>
 <item>Zezwalamy na WWW, ftp, traceroute i ssh do sieci zewnętrznej
 <item>Zezwalamy na SMTP do serwera poczty
 <item>Zezwalamy na POP3 do serwera poczty
 <item>Zezwalamy na DNS do serwera nazw
 <item>Zezwalamy na rsync do serwera WWW
 <item>Zezwalamy na WWW do serwera WWW
 <item>Zezwalamy na ping do komputera filtrującego pakiety
 </itemize>

<item>Jeśli użylibyśmy maskarady z sieci wewnętrznej do strefy DMZ,
musielibyśmy odrzucać całą resztę pakietów. Ponieważ tak jest, zezwalamy na ruch
pakietów które mogą być częścią nawiązanego połączenia.

<tscreen><verb>
ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
ipchains -A dmz-good -p icmp -j icmp-acc
ipchains -A dmz-good -j DENY -l
</verb></tscreen>
</itemize>

<sect2>DMZ do Złej (zewnętrznej).
<p>

<itemize>
 <item>Restrykcje w strefie DMZ:
 <itemize>
 <item>Serwer poczty:
   <itemize>
   <item>SMTP do sieci zewnętrznej
   <item>Zezwalamy na SMTP z sieci wewnętrznej i zewnętrznej
   <item>Zezwalamy na POP3 z sieci wewnętrznej
   </itemize>

 <item>Serwer nazw:
   <itemize>
   <item>Wysyłamy DNS do sieci zewnętrznej
   <item>Zezwalamy na DNS z sieci wewnętrznej, zewnętrznej i komputera filtrującego pakiety
   </itemize>

 <item>Serwer WWW:
   <itemize>
   <item>Zezwalamy na WWW z sieci wewnętrznej i zewnętrznej
   <item>Zezwalamy na rsync z sieci wewnętrznej
   </itemize>
 </itemize>

<item>
<tscreen><verb>
ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
ipchains -A dmz-bad -p icmp -j icmp-acc
ipchains -A dmz-bad -j DENY -l
</verb></tscreen>
</itemize>

<sect2>Zła (zewnętrzna) do Dobrej (wewnętrznej).

<p>
<itemize>
<item>Nie pozwalamy na nic (nie maskaradowanego) z sieci zewnętrznej do sieci wewnętrznej:
<tscreen><verb>
ipchains -A bad-good -j REJECT
</verb></tscreen>
</itemize>

<sect2>Filtrowanie pakietów dla samego Linuksa

<p>
<itemize>
<item>Jeśli używamy filtrowania pakietów dla pakietów przychodzących do komputera
filtrującego pakiety, musimy filtrować pakiety w łańcuchu <tt>input</tt>. Stworzymy
jeden łańcuch dla każdego interfejsu przeznaczenia:

<tscreen><verb>
ipchains -N bad-if
ipchains -N dmz-if
ipchains -N good-if
</verb></tscreen>

<item>Następnie odpowiednie cele dla nich:

<tscreen><verb>
ipchains -A input -d 192.84.219.1 -j bad-if
ipchains -A input -d 192.84.219.250 -j dmz-if
ipchains -A input -d 192.168.1.250 -j good-if
</verb></tscreen>
</itemize>
</p>

<sect3>Interfejs do Złej (zewnętrznej).
<p>

<itemize>
<item>Komputer filtrujący pakiety:
 <itemize>
 <item>ping od każdej sieci
 <item>traceroute do każdej sieci
 <item>dostęp do DNS
 </itemize>

<item>Interfejs zewnętrzny otrzymuje również odpowiedzi do pakietów
zmaskaradowanych, pakiety ICMP z informacjami o błędach dla nich
oraz odpowiedzi na ping:

<tscreen><verb>
ipchains -A bad-if -i ! ppp0 -j DENY -l
ipchains -A bad-if -p TCP --dport 61000:65095 -j ACCEPT
ipchains -A bad-if -p UDP --dport 61000:65095 -j ACCEPT
ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A bad-if -j icmp-acc
ipchains -A bad-if -j DENY
</verb></tscreen>
</itemize>

<sect3>Interfejs do Strefy DMZ

<p>
<itemize>
<item>Restrykcje na komputerze filtrującym pakiety:
 <itemize>
 <item>ping od każdej sieci
 <item>traceroute do każdej sieci
 <item>dostęp do DNS
 </itemize>

<item>Interfejs strefy DMZ otrzymuje odpowiedzi DNS, odpowiedzi na ping oraz
pakiety ICMP z informacjami o błędach:

<tscreen><verb>
ipchains -A dmz-if -i ! eth0 -j DENY
ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A dmz-if -j icmp-acc
ipchains -A dmz-if -j DENY -l
</verb></tscreen>
</itemize>

<sect3>Interfejs do Dobrej (wewnętrznej).
<p>

<itemize>
<item>Restrykcje na komputerze filtrującym pakiety:
 <itemize>
 <item>ping od każdej sieci
 <item>traceroute do każdej sieci
 <item>dostęp do DNS
 </itemize>

<item>Restrykcje wewnętrzne:
 <itemize>
 <item>Zezwalamy na WWW, ftp, traceroute i ssh do sieci zewnętrznej
 <item>Zezwalamy na SMTP do serwera poczty
 <item>Zezwalamy na POP3 do serwera poczty
 <item>Zezwalamy na DNS do serwera nazw
 <item>Zezwalamy na rsync do serwera WWW
 <item>Zezwalamy na WWW do serwera WWW
 <item>Zezwalamy na ping do komputera filtrującego pakiety
 </itemize>

<item>Interfejs wewnętrzny otrzymuje pingi, odpowiedzi na pingi oraz pakiety
ICMP z informacjami o błędach.

<tscreen><verb>
ipchains -A good-if -i ! eth1 -j DENY
ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
ipchains -A good-if -j icmp-acc
ipchains -A good-if -j DENY -l
</verb></tscreen>
</itemize>

<sect1>Na koniec

<p>
<itemize>
<item>Kasujemy reguły blokujące:
<tscreen><verb>
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1
</verb></tscreen>
</itemize>

<sect>Dodatek: Różnice pomiędzy ipchains a ipfwadm.<label id="ipfwadm-diff">

<p>Niektóre z tych zmian są rezultatem zmian w kernelu, a część wynika z
tego, że <tt>ipchains</tt> są inaczej zbudowane od <tt>ipfwadm</tt>.</p>

<p>
<enum>
<item> Wielu parametrom zmieniono znaczenie: duże litery wskazują na komendy, małe na opcje.

<item> Dodano obsługę definiowalnych łańcuchów, nawet wbudowane łańcuchy mają swoje
nazwy zamiast flag (tzn. '<tt>input</tt>' zamiast '<tt>-I</tt>')

<item> Opcja `<tt>-k</tt>' zniknęła: używaj '<tt>! -y</tt>'.

<item> Opcja '<tt>-b</tt>' dokłada/dodaje/kasuje dwie reguły, zamiast jedną 'dwukierunkową'.

<item> Opcja '<tt>-b</tt>' może być przekazana do '<tt>-C</tt>' by wykonać dwa sprawdzenia
(jedno dla każdego kierunku)

<item> Opcja `<tt>-x</tt>' dla '<tt>-l</tt>' została zastąpiona przez '<tt>-v</tt>'.

<item> Wskazywanie wielu portów Ľródłowych i przeznaczenia nie jest już obsługiwane.
Mam nadzieję, że możliwość negowania zakresów portów jakoś to zastąpi.

<item> Interfejsy mogą być wskazane tylko przez nazwę (nie przez adres).
Stara semantyka i tak zmieniła się po cichu w serii kerneli 2.1.x.

<item> Fragmenty są badane, a nie automatycznie przepuszczane.

<item> Dedykowane łańcuchy zliczające zostały wyrzucone.

<item> Można testować własne protokoły ponad IP.

<item> Stare zachowanie dla testów SYN i ACK zmieniło się (było poprzednio ignorowane
dla pakietów nie będących pakietami TCP); opcja SYN jest nieprawidłowa dla reguł
nie dotyczących TCP

<item> Liczniki są 64 bitowe na 32 bitowych maszynach, nie 32 bitowe.

<item> Obsługiwana jest inwersja.

<item> Obsługiwane są również kody ICMP.

<item> Obsługiwane jest również wskazywanie interfejsów przez maskę.

<item> Manipulacje na polach TOS są teraz sprawdzane pod kątem sensowności:
stary kod kernela powstrzymywał bez żadnego komunikatu przed użyciem bitu
'Must Be Zero' w TOS; teraz <tt>ipchains</tt> zwracają błąd jeśli tego
spróbujesz, tak jak w przypadku innych błędów.
</enum>

<sect1> Krótka ściąga

<p>
[ W większości wypadków, argumenty komend są DUŻYMI LITERAMI a opcje małymi ]

<p>Jeszcze jedna sprawa - chęć użycia maskarady pisze się '<tt>-j MASQ</tt>';
różni się to kompletnie od '<tt>-j ACCEPT</tt>' i nie jest traktowane
jako efekt uboczny, tak jak w <tt>ipfwadm</tt>.</p>

<p>
<verb>
================================================================
| ipfwadm      | ipchains              | Uwagi
----------------------------------------------------------------
| -A [both]    | -N acct               | Załóż łańcuch 'acct'
|              |& -I 1 input -j acct   | i niech pakiety wchodzące
|              |& -I 1 output -j acct  | oraz wychodzące go przechodzą
|              |& acct                 |
----------------------------------------------------------------
| -A in        | input                 | Reguła bez celu
----------------------------------------------------------------
| -A out       | output                | Reguła bez celu
----------------------------------------------------------------
| -F           | forward               | Użyj jako [łańcuch].
----------------------------------------------------------------
| -I           | input                 | Użyj jako [łańcuch].
----------------------------------------------------------------
| -O           | output                | Użyj jako [łańcuch].
----------------------------------------------------------------
| -M -l        | -M -L                 |
----------------------------------------------------------------
| -M -s        | -M -S                 |
----------------------------------------------------------------
| -a policy    | -A [chain] -j POLICY  | (ale sprawdĽ -r i -m).
----------------------------------------------------------------
| -d policy    | -D [chain] -j POLICY  | (ale sprawdĽ -r i -m).
----------------------------------------------------------------
| -i policy    | -I 1 [chain] -j POLICY| (ale sprawdĽ -r i -m).
----------------------------------------------------------------
| -l           | -L                    |
----------------------------------------------------------------
| -z           | -Z                    |
----------------------------------------------------------------
| -f           | -F                    |
----------------------------------------------------------------
| -p           | -P                    |
----------------------------------------------------------------
| -c           | -C                    |
----------------------------------------------------------------
| -P           | -p                    |
----------------------------------------------------------------
| -S           | -s                    | Pobiera jeden port lub
|              |                       | zasięg, nie wiele portów.
----------------------------------------------------------------
| -D           | -d                    | Pobiera jeden port lub
|              |                       | zasięg, nie wiele portów.
----------------------------------------------------------------
| -V           | <none>                | Użyj -i [nazwa].
----------------------------------------------------------------
| -W           | -i                    |
----------------------------------------------------------------
| -b           | -b                    | Tworzy 2 reguły.
----------------------------------------------------------------
| -e           | -v                    |
----------------------------------------------------------------
| -k           | ! -y                  | Nie działa chyba że
|              |                       | podano z -p tcp.
----------------------------------------------------------------
| -m           | -j MASQ               |
----------------------------------------------------------------
| -n           | -n                    |
----------------------------------------------------------------
| -o           | -l                    |
----------------------------------------------------------------
| -r [redirpt] | -j REDIRECT [redirpt] |
----------------------------------------------------------------
| -t           | -t                    |
----------------------------------------------------------------
| -v           | -v                    |
----------------------------------------------------------------
| -x           | -x                    |
----------------------------------------------------------------
| -y           | -y                    | Nie działa chyba że
|              |                       | podano z -p tcp.
----------------------------------------------------------------
</verb>

<sect1> Przykłady przetłumaczonych komend ipfwadm

<p>Stara komenda: <tt>ipfwadm -F -p deny</tt></p>
<p>Nowa komenda: <tt>ipchains -P forward DENY</tt></p>

<p></p>

<p>Stara komenda: <tt>ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0</tt></p>
<p>Nowa komenda: <tt>ipchains -A forward -j MASQ -s 192.168.0.0/24 -d 0.0.0.0/0</tt></p>

<p></p>

<p>Stara komenda: <tt>ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D 0.0.0.0/0</tt></p>
<p>Nowa komenda: <tt>ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8 -d 0.0.0.0/0</tt></p>

<p></p>

<p>(zauważ że nie ma ekwiwalentu dla podania interfejsów przez adres: musisz użyć nazwy
interfejsu. Na tej maszynie 10.1.2.1 odpowiada nazwa eth0).</p>

<sect>Dodatek: użycie skryptu ipfwadm-wrapper.<label id="upgrade">

<p>Skrypt powłoki <tt>ipfwadm-wrapper</tt> powinien być używany jako
zastąpienie dla wstecznej kompatybilności z <tt>ipfwadm</tt> w wersji 2.3a.</p>

<p>Jedyną rzeczą, której za jego pomocą nie da się obsłużyć jest '<tt>-V</tt>'.
Jeśli użyje się tego parametru, zwracane jest ostrzeżenie. Jeśli jednocześnie użyje
się opcji '<tt>-W</tt>', '<tt>-V</tt>' jest ignorowane. W innym przypadku, skrypt
stara się znaleĽć interfejs skojarzony z tym adresem, używając <tt>ifconfig</tt>.
Jeśli to się nie powiedzie (na przykład dla interfejsu który jest położony)
to skrypt zakończy działanie z komunikatem o błędzie.</p>

<p>Ostrzeżenie to może być powstrzymane przez albo zmianę '<tt>-V</tt>'
na '<tt>-W</tt>' lub przekierowanie standardowego wyjścia na <tt>/dev/null</tt>.</p>

<p>Jeśli znajdziesz jakieś pomyłki w tym skrypcie, lub różnice między prawdziwym <tt>ipfwadm</tt>
a tym skryptem, <bf>proszę</bf> o zgłoszenie tego do mnie: wyślij e-mail pod adres
rusty@linuxcare.com z "BUG-REPORT" w temacie. Proszę podać swoją wersję <tt>ipfwadm</tt>
(<tt>ipfwadm -h</tt>), wersję <tt>ipchains</tt> (<tt>ipchains --version</tt>) i wersję wrappera
(<tt>ipwadm-wrapper --version</tt>). Proszę również dołączyć wyjście komendy
<tt>ipchains-save</tt>. Dziękuje z góry.</p>

<p>Baw się w łączenie <tt>ipchains</tt> z tym skryptem na własne ryzyko.</p>

<sect>Appendix: Thanks.

<p>Wielkie podziękowania dla Michael'a Neulinga, który napisał pierwszy
sensowny skrót kodu łańcuchów IP w czasie pracy dla mnie. Publicznie przepraszam
za negowanie jego pomysłu cache'owania rezultatów, który potem zaproponował Alan Cox a ja
w końcu zacząłem go implementować, widząc błąd mojego rozumowania.</p>

<p>Dziękuje Alanowi Coxowi za jego 24-godzinne e-mailowe wsparcie techniczne i zachęty.

<p>Dziękuje wszystkim autorom kodu ipfw i ipfwadm, specjalnie Jos Vos. Stanie na
barkach gigantów i tak dalej....to dotyczy również Linusa Torvalds'a i wszystkich
ludzi zajmujących się kernelem i przestrzenią użytkownika.</p>

<p>Dziękuje również beta testerom i łowcom błędów, a specjalnie
    Jordan Mendelson, Shaw Carruthers, Kevin Moule, Dr. Liviu Daia, Helmut Adams, Franck
    Sicard, Kevin Littlejohn, Matt Kemner, John D. Hardin, Alexey Kuznetsov, Leos Bitto, Jim
    Kunzman, Gerard Gerritsen, Serge Sivkov, Andrew Burgess, Steve Schmidtke, Richard Offer,
    Bernhard Weisshuhn, Larry Auton, Ambrose Li, Pavel Krauz, Steve Chadsey, Francesco
    Potorti`, Alain Knaff, Casper Boden-Cummins i Henry Hollenberg.

<sect1>Tłumaczenia

<p>Ludzie, którzy wykonali tłumaczenia powinni umieścić się na <em>początku</em>
tej sekcji, na przykład: "Podziękowania dla XXX, za dokładne przetłumaczenie
wszystkiego z mojego Angielskiego.'. A potem poinformuj mnie o swoim tłumaczeniu,
tak bym mógł je tutaj umieścić.</p>

<p>
Arnaud Launay, asl@launay.org:
<url url="http://www.freenix.fr/unix/linux/HOWTO/IPCHAINS-HOWTO.html"
        name="http://www.freenix.fr/unix/linux/HOWTO/IPCHAINS-HOWTO.html">

<p>
Giovanni Bortolozzo, borto@pluto.linux.it:
<url url="http://www.pluto.linux.it/ildp/HOWTO/IPCHAINS-HOWTO.html"
	name="http://www.pluto.linux.it/ildp/HOWTO/IPCHAINS-HOWTO.html">

<p>
Herman Rodríguez, herman@maristas.dhis.org:
<url url="http://netfilter.kernelnotes.org/ipchains/spanish/HOWTO.html"
	name="http://netfilter.kernelnotes.org/ipchains/spanish/HOWTO.html">

<p>
Łukasz Bromirski, l.bromirski@mr0vka.eu.org:
<url url="http://mr0vka.eu.org/tlumaczenia/ipchains.html"
	name="http://mr0vka.eu.org/tlumaczenia/ipchains.html">

</article>
