<!doctype linuxdoc system>

<!-- $Id: netfilter-faq.sgml,v 1.2 2002/08/21 12:47:08 szo -->

<article>

<title>netfilter/iptables FAQ</title>
<author>Harald Welte, <tt>laforge@gnumonks.org</tt></author>
<date>Wersja oryginalna: 1.30, 2002/01/14 09:04:47</date>
<p>Oryginał tego dokumentu znajduje się pod adresem: <url url="http://netfilter.samba.org/"></>
<author>Tłumaczenie: Łukasz Bromirski, <tt>l.bromirski@mr0vka.eu.org</tt></author>
<date>Wersja tłumaczenia: 1.1, $Date: 2002/08/22 21:29:41 $</date>
<p>Oryginał tego tłumaczenia znajduje się pod adresem: <url url="http://mr0vka.eu.org/tlumaczenia/netfilter-faq.html"></p>

<abstract>
Dokument ten zawiera Odpowiedzi Na Najczęściej Zadawane Pytania,
które do tej pory pojawiły się na liście pocztowej netfilter. Komentarze
/ uzupełnienia / wyjaśnienia są oczywiście mile widziane, i powinny być
kierowane do opiekuna tego FAQ.
</abstract>

<toc>

<sect>Pytania ogólne
<p>Sekcja ta odpowiada na pytania ogólnie związane z netfilter, które
pojawiają się bardzo często.

<sect1>Skąd mogę ściągnąć netfilter/iptables?
<p>Netfilter i IPtables są zintegrowane w jądrach linuksa serii 2.4.x.
Proszę ściągnij źródła ostatniego kernela z <url url="http://www.kernel.org/">
lub jednego z jego mirrorów.
<p>
Narzędzie działające w przestrzeni użytkownika 'iptables' jest dostępne
na stronie domowej netfilter, lub na jednym z mirrorów:
<url url="http://www.netfilter.org/">, 
<url url="http://www.iptables.org/">, 
<url url="http://netfilter.samba.org/">,
<url url="http://netfilter.gnumonks.org/"> lub
<url url="http://netfilter.filewatcher.org/">.
</sect1>

<sect1>Czy jest jakaś wersja netfilter dla Linuksa 2.2?

<p>Nie, aktualnie nie ma. Ale, jeśli ktoś chciałby zacząć to pisać,
nie powinno być to zbyt trudne z uwagi na jasny interfejs do stosu
sieciowego.</p>
<p>Proszę, poinformujcie nas o jakiejś pracy w tym zakresie.</p>
</sect1>

<sect1>Czy jest moduł do śledzenia połączeń i NATu dla ICQ?

<p>Jeśli jesteś przyzwyczajony do maskarady z Linuksa 2.2, używałeś
zawsze modułu ip_masq_icq module by uzyskać bezpośrednie połączenie
klient-klint dla ICQ.</p>

<p>Nikt nie przepisał tego modułu, ponieważ protokół ICQ jest
zbyt brzydki :) Ale, jak sądzę jest to tylko kwestia czasu.</p>

<p>Rusty kiedyś stwierdził, że tylko protokoły z przynajmniej jednym
darmowym klientem i jednym darmowym serwerem będą integrowane do
głównej dystrybucji netfilter. Jeśli chodzi o ICQ, są tylko darmowe
klienty, więc nie pasuje on do tych kryteriów (wolny jak wolność,
nie jak wolne piwo, wg. definicji RMS)
</sect1>

<sect1>Gdzie podziały się moduły ip_masq_vdolive / ip_masq_quake / ... ?

<p>Niektóre z nich nie są już potrzebne, a niektóre nie zostały
jeszcze przeniesione do netfilter. Netfilter zapewnia aktualnie
pełne śledzenie połączeń, nawet dla UDP, i generalnie będzie
starał się zmieniać pakiety tak niewiele jak to tylko będzie
możliwe, więc czasami programy "po prostu" pracują.</p>
</sect1>

<sect1>Co to jest ten patch-o-matic i jak mogę go używać?

<p>Kernele 2.4.x są wersją stabilną, więc nie możemy tak po prostu
dołączań swoje aktualne poprawki do głównej dystrybucji. Cały nasz
kod jest tworzony i testowany w netfilter patch-o-matic. Jeśli
chcesz używać najnowszych funkcji netfilter, będziesz musiał
użyć jednego z patchy z patch-o-matic. Możesz znaleźć program
patch-o-matic w najnowszej paczce iptables (lub, oczywiście na CVS),
którą ściągnąć można ze strony WWW netfilter.</p>

<p>patch-o-matic ma obecnie trzy dostępne opcje:

<itemize>
 <item>make pending-patches (<em>nałóż zaległe łaty</em>)</item>
 <item>make most-of-pom (<em>nałóż większość z opcji</em>)</item>
 <item>make patch-o-matic</item>
</itemize>

Pierwsza opcja ma na celu dołożenie wszystkich istotnych poprawek
(które i tak zostały wysłane koordynatorom kernela) na twój kernel.
Druga, `most-of-pom` dodaje dodatkowo wszystkie nowe opcje, które
mogą zostać dodane bez konfliktów z już istniejącymi. Trzecia opcja
jest dla prawdziwych ekspertów, którzy chcą przejrzeć wszystkie
poprawki - ale weźcie pod uwagę, że mogą nie być między sobą zgodne.</p>

<p>
patch-o-matic ma miły interfejs. Wprowadź po prostu

<tscreen><verb>
make most-of-pom (lub pending-patches czy patch-o-matic, zajrzyj wyżej)
</verb></tscreen>

lub, jeśli źródła twojego kernela nie są w <tt>/usr/src/linux</tt> użyj

<tscreen><verb>
make KERNEL_DIR={katalog-ze-źródłami} most-of-pom
</verb></tscreen>

w głównym katalogu paczki iptables. patch-o-matic sprawdza każdy
patch pod kątem możliwości zaaplikowania do źródeł kernela. Jeśli
uzna że można go użyć, zobaczysz znak zachęty, z poziomu którego
możesz uzyskać więcej informacji o patchu, zaaplikwać go, przejść
do następnego, ...</p>

<p>Po więcej informacji dotyczących patch-o-matic, zajrzyj na stronę
rozszerzeń netfilter, która znajduje się pod adresem
<url url="http://www.netfilter.org/documentation/index.html#HOWTO">.</p>

</sect1>

<sect1>Gdzie mogę znaleźć ipnatctl i więcej informacji o nim?

<p>ipnatctl był używany do ustawiania reguł NAT w przestrzeni
użytkownika w bardzo wczesnych wersjach netfilter (jeszcze
w czasie prac z kernelami serii 2.3.x). Nie jest już potrzebny,
więc nie udostępniamy go. Całą jego funkcjonalność przejęło
iptables. Obejrzyj NAT HOWTO na stronie domowej netfilter.
</sect1>

</sect>

<sect>Problemy podczas procesu kompilacji
<p>

<sect1>Nie mogę skompilować iptables-1.1.1 z kernelem >= 2.4.0-test4

<p>To znana sprawa. Mechanizm rozpoznający które patche są już
zaaplikowane źle działa. Użyj "make build" zamiast "make".

<p>
Lepsze rozwiązanie: uaktualnij system do iptables-1.1.2 lub nowszych.

</sect1>

<sect1>Nie mogę skompilować iptables 1.1.0 z ostatnimi kernelami (>= 2.3.99-pre8)
<p>
Wewnętrzne struktury w iptables zostały zmienione. Uaktualnij iptables
do wersji >= 1.1.1

</sect1>

<sect1>Niektóre patche z patch-o-matic z iptables-1.2.1a nie działają z kernelem >= 2.4.4
<p>
Proszę użyć najnowszej wersji iptables.
</sect1>

<sect1>ipt_BALANCE, ip_nat_ftp, ip_nat_irc, ipt_SAME, ipt_NETMAP nie chcą się skompilować

<p>Najprawdopodobniej masz problemy ze skompilowaniem funkcji nazwanej <tt>ip_nat_setup_info</tt>.</p>
<p>Jeśli używasz iptables <= 1.2.2, <bf>MUSISZ</bf> zaaplikować łaty
`dropped-table` i `ftp-fixes`.</p>

<p>Jeśli używasz iptables > 1.2.2 lub ostatniej wersji z CVS, proszę <bf>nie</bf> aplikuj
patcha 'dropped-table', ponieważ jest niekompatybilny z BALANCE, NETMAP, irc-nat, SAME
i talk-nat.
</sect1>

<sect1>Używam serii jądra Alana Cox'a 2.4.x-acXX i mam problemy
<p>Podstawowy zespół netfilter bazuje na drzewie Linus'a, więc używasz
wersji -ac na własne ryzyko.
</sect1>

</sect>

<sect>Problemy w trakcie pracy

<sect1>NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> 224.bbb.bbb.bbb
<p>
Wiadomość taką generuje kod NAT, ponieważ pakiety multicastowe trafiają do
tabeli NAT, a kod odpowiedzialny za śledzenie połączeń nie potrafi ich
obsłużyć. Jeśli nie wiesz co to jest multicast, lub w ogóle tego nie
potrzebujesz, użyj:

<tscreen><verb>
iptables -t mangle -I PREROUTING -j DROP -d 224.0.0.0/8
</verb></tscreen>

</sect1>

<sect1>NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> bbb.bbb.bbb.bbb
<p>
Mój syslog lub moja konsola pokazują taką wiadomość:
<tscreen><verb>
NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> bbb.bbb.bbb.bbb
</verb></tscreen>

<p>
Wiadomość taką generuje kod NAT. Odrzuca pakiety, ponieważ by wykonać na
nich NAT musi posiadać prawidłową informację o połączeniu. Wiadomość taka
jest drukowana dla wszystkich pakietów, których kod śledzący połączenia
nie był w stanie zidentyfikować.

<p>
Możliwe przyczyny to:
<itemize>
<item>osiągnięto maksymalny limit wpisów w bazie danych śledzenia połączeń
<item>nie można było zidentyfikować typu rozgłaszania (multicast, broadcast)
<item>sypie się kmem_cache_alloc (brak pamięci)
<item>odpowiedź na niepotwierdzone połączenie
<item>pakiet multicastowy (sprawdź poprzednie pytanie)
<item>pakiet icmp zbyt krótki
<item>pakiet icmp jest sfragmentowany
<item>zła suma kontrolna pakietu icmp
</itemize>

<p>Jeśli chciałbyś prowadzić dużo bardziej szczegółowe logowanie tych
pakietów (np. podejrzewasz że jest to zdalna próba skanowania), użyj
następującej reguły:

<tscreen><verb>
iptables -t mangle -A PREROUTING -j LOG -m state --state INVALID
</verb></tscreen>

<p>
I tak, musisz wstawić tą regułę do tabeli przekształceń (ang. <em>mangle</em>),
ponieważ pakiety będą odrzucane przez NAT zanim osiągną tabelę
filtrowania.

</sect1>

<sect1>Nie mogę używać netfilter z kodem mostującym Linuksa
<p>Chcesz stworzyć kompletnie transparentną ścianę ogniową? Wspaniały pomysł!</p>
<p>Począwszy od wersji kernela 2.4.16 musisz dodać tylko łatkę do kernela,
dostępną pod adresem <url url="http://bridge.sourceforge.net/">.</p>

</sect1>

<sect1>Moduł IRC nie potrafi obsłużyć DCC RESUME
<p>Cóż, to połowa prawdy. Tylko tabela NAT nie potrafi go obsłużyć.
Jeśli użwasz filtrowania pakietów bez NAT wszystko powinno działać.

</sect1>

<sect1>Jak działa SNAT dla wielu adresów?
<p>Netfilter stara się modyfikować pakiety minimalnie, na tyle ile to
możliwe. Więc jeśli mamy maszynę po restarcie, i ktoś za komputerem
robiącym SNAT otwiera połączenie do lokalnego portu 1234, netfilter
zmienia jedynie adres IP a port zostaje ten sam.
<p>
Ale jeśli ktoś inny otworzy połączenie z tym samym portem źródłowym,
netfilter musi zmienić i IP i port, jeśli ma tylko jedno IP dla SNAT.
<p>
Jeśli są dostępne inne, <bf>ponownie</bf> zmienia tylko adres IP.
</sect1>

<sect1>ip_conntrack: maximum limit of XXX entries exceeded
<p>Jeśli zobaczysz powyższy komunikat w syslog, wygląda na to że
baza danych śledzenia połączeń nie ma wystarczająco dużo miejsca
w twoim otoczeniu. Śledzenie połączeń domyślnie obsługuje tylko
pewną liczbę jednoczesnych połączeń. Liczba ta jest zależna od
ilości pamięci operacyjnej (przy 64MB: 4096, 128MB: 8192, ...).
<p>
Możesz łatwo zwiększyć numer maksymalnie śledzonych połączeń, ale
zwróć uwagę że każde połączenie zabiera około 350 bajtów pamięci
nie wymienialnej!
<p>
By zwiększyć limit to dnp. 8192, napisz:

<tscreen><verb>
echo "8192" > /proc/sys/net/ipv4/ip_conntrack_max
</verb></tscreen>

</sect1>

<sect1>Jak mogę wylistować wszystkie śledzone / maskaradowane połączenia, tak jak przy użyciu 'ipchains -L -M' w 2.2.x ?
<p>Istnieje plik w systemie plików /proc, nazywa się <tt>/proc/net/ip_conntrack</tt>.
Możesz wydrukować go na wyjście używając komendy

<tscreen><verb>
cat /proc/net/ip_conntrack
</verb></tscreen>
</sect1>

<sect1>Jak wylistować wszystkie dostępne tabele IP?
<p>
Wszystkie dostępne tabele IP można wylistować przez
<tscreen><verb>
cat /proc/net/ip_tables_names
</verb></tscreen>
</sect1>

<sect1>iptables-save / iptables-restore z iptables-1.2 powodują segfault
<p>Znany błąd. Uaktualnij się do najnowszej wersji z CVS lub używaj
iptables >= 1.2.1 jak tylko będzie dostępne.
</sect1>

<sect1>Komenda iptables -L bardzo długo listuje reguły
<p>Dzieję się tak ponieważ iptables sprawdza DNS przy każdym adresie IP.
Ponieważ każda reguła składa się z jednego lub dwóch adresów, w najgorszym
przypadku mamy dwa sprawdzenia na regułę.
<p>
Problem zaczyna się, gdy używasz prywatnych adresów IP (jak np. 10.x.x.x czy 192.168.x.x),
a DNS nie jest w stanie ich rozwinąć i w końcu się poddaje. Suma tych wszystkich
time-out'ów może trwać _bardzo_ długo, wszystko zależy od twojego zestawu reguł.

<p>Użyj opcji -n (numerycznie) dla iptables, by zapobiec sprawdzaniu DNSu.
</sect1>

<sect1>Jak mogę powstrzymać cel LOG przed logowaniem na konsolę?
<p>Musisz prawidłowo skonfigurować swój syslogd:
Cel LOG loguje do facility kern z priorytetem ostrzeżenia (ang. <em>warning</em>, 4).
Zajrzyj do podręcznika syslogd.conf by dowiedziec się więcej.
<p>
Domyślnie, wszystkie wiadomości kernela z priorytetem wyższym niż
debug (7) wysyłane są na konsolę. Jeśli podniesiesz go do 4, zamiast
7, zapobiegniesz wysyłaniu informacji z LOG na konsole.
<p>
Zwróć jednak uwagę, że powstrzyma to również inne, istotne wiadomości
od pojawiania się na konsoli (nie wpływa to na syslog).
</sect1>

<sect1>Jak zbudować transparentne proxy przy użyciu squid'a i iptables?
<p>
Po pierwsze, potrzebujesz właściwej reguły DNAT lub REDIRECT. Użyj
REDIRECT tylko jeśli squid pracuje na tej samej maszynie. Na przykład:
<tscreen><verb>
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.22.33:3128
</verb></tscreen>
<p>
Następnie, musisz właściwie skonfigurować squid'a. Możemy tu tylko
dać krótkie wskazówki, zajrzyj do dokumentacji squid'a po dalsze
informacje.
<p>
Plik squid.conf dla Squid'a 2.3 potrzebuje następujących linijek:
<tscreen><verb>
http_port 3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy  on
httpd_accel_uses_host_header on
</verb></tscreen>
Squid 2.4 potrzebuje <bf>dodatkwej</bf> linijki:

<tscreen><verb>
httpd_accel_single_host off
</verb></tscreen>
</sect1>

<sect1>Jak mogę używać celu LOG / Jak i LOGować i DROPować?
<p>Cel LOG jest tym co nazywamy "nie-ostatecznym celem", tzn. nie
kończy on sprawdzania pakietu. Jeśli używasz celu LOG, pakiet zostanie
zalogowany, ale przeglądanie reguł odbywa się dalej.
<p>
Więc jak możesz zalogować i odrzucić pakiet jednocześnie? Nic
prostszego, tworzysz osobny łańcuch który zawiera dwie reguły:

<tscreen><verb>
iptables -N logdrop
iptables -A logdrop -j LOG
iptables -A logdrop -j DROP
</verb></tscreen>
<p>
Teraz za każdym razem gdy chcesz zalogować i odrzucić pakiet, używasz
celu "-j logdrop".

</sect1>

<sect1>kernel loguje: Out of window data xxx
<p>Możesz użyć patcha tcp-window-tracking patch z patch-o-matic, którego
kod śledzi akceptowalne parametry dla przepuszczanych strumieni TCP zgodnie z
numerami sekwencyjnymi/potwierdzeń, rozmiarami segmentów, itd. Kiedy
wykryje że pakiet jest nie do zaakceptowania (poza oknem), zaznacza
go jako INVALID i wypisuje wiadomość jak powyżej.
<p>
Nowsze wersje logują pakiet i dokładnie co spowodowało taką akcję:
<itemize>
<item>ACK is under the lower bound (prawdopodobnie zbyt opóźniony ACK)
<item>ACK is over the upper bound (dane potwierdzane jeszcze nie dotarły)
<item>SEQ is under the lower bound (retransmitujemy już potwierdzone dane)
<item>SEQ is over the upper bound (ponad oknem odbiorczym)
</itemize>
<p>
Również w nowszych wersjach logowanie można całkowicie powstrzymać
przez sysctl

<tscreen><verb>
echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window
</verb></tscreen>

</sect1>

<sect1>Dlaczego system śledzenia połączeń śledzi połączenia w stanie
UNREPLIED (<em>nieodpowiedziane</em>) z dużą wartością wygasania (timeout)?

<p>Więc sprawdzałeś /proc/net/ip_conntrack i znalazłeś bardzo wysokie wpisy
połączeń UNREPLIED (które nie są oczywiście połączeniami)?</p>

<p>Odpowiedź jest prosta: wpisy UNREPLIED są tymczasowe, tzn. jak tylko skończy
się pula połączeń (osiągnięta zostanie granica /proc/sys/net/ipv4/ip_conntrack_max),
kasujemy stare wpisy UNREPLIED. Innymi słowy, staramy się raczej by inne, 
prawidłowe i całe połączenia mogły dochodzić do skutku.</p>

</sect1> 

</sect>

<sect>Pytania dotyczące programowania netfilter

<sect1>Nie rozumiem jak używać celu QUEUE z przestrzeni użytkownika
<p>Dostępna jest biblioteka nazwana libipq, która służy do
obsługi pakietów w przestrzeni użytkownika. Jest też dokumentacja
dla niej w postaci stron podręcznikowych. Musisz zbudować i
zainstalować komponenty programistyczne iptables:

<tscreen><verb>
make install-devel
</verb></tscreen>

a następnie sprawdź libipq(3).
<p>
Może cię również zainteresować Perlipq zawierająca powiązania
dla Perla do libipq: <url url="http://www.intercode.com.au/jmorris/perlipq/">.
Same powiązania są przykładem jak używać biblioteki.
<p>
Inne przykłady kodu obejmują:

<itemize>
<item>testsuite/tools/intercept.c z CVS netfilter</item>
<item>ipqmpd (sprawdź <url url="http://www.gnumonks.org/projects/">)</item>
<item>nfqtest, część netfilter-tools (sprawdź <url url="http://www.gnumonks.org/projects/">)</item>
<item>symulator WAN Jerome Etienne'go (sprawdź <url url="http://www.off.net/~jme/">)</item>
</itemize>

</sect1>

<sect1>Chciałbym dodać trochę kodu, ale nie mam pojęcia co zrobić
<p>Główny zespół netfilter utrzymuje listę TODO (do zrobienia), gdzie
wpisuje wszystkie najbardziej pożądane zmiany / nowe możliwości. Możesz
ściągnąć tą listę przez anonimowy CVS, instrukcje znajdują się na
stronie domowej netfilter. Możesz również udać się pod adres
<url url="http://cvs.samba.org/cgi-bin/cvsweb/netfilter/TODO/"> i
obejrzeć plik przy użyciu CVSweb.
</sect1>

<sect1>Poprawiłem błąd lub napisałem rozszerzenie. Jak je dodać?
<p>Jeśli chcesz je opublikować, wyślij pocztę pod adres listy netfilter-devel.
Informacje o prenumeracie dostępne są pod adresem
<url url="http://lists.samba.org/mailman/listinfo/netfilter-devel/">.

Prawidłowy sposób na wysłanie patcha jest następujący :
<itemize>
<item> Temat rozpoczyna się od <bf>&#91;PATCH&#93;</bf>
<item> Kod wklejony w wiadomości, nie w postaci załącznika MIME.
<item> wiadomość z diff'a z wpisem z cvs-checkin/Changelog.
<item> wyjście z `diff -u old new', spoza katalogu głównego (np. może być z dodanym -p1 w katalogu z rozpakowaną zawartością.
</itemize>

<p>Jeśli napisałeś nowe rozszerzenie, lub dodałeś coś do starych funkcji, dobrze
jest również uzupełnić dokument netfilter-extensions HOWTO i zawrzeć w nim
informacje o nowej funkcjonalności i zasadach działania rozszerzenia. Dodatkowo,
zainteresuje to z pewnością większą liczbę użytkowników i zapewni więcej
komentarzy.</p>

</sect1>

</sect>

</article>
