Karol Krysiak IPCHAINS_HOWTO - tłumaczenie ipchains - help po polsku 1. Create a new chain (-N). 2. Delete an empty chain (-X). 3. Change the policy for a built-in chain. (-P). 4. List the rules in a chain (-L). 5. Flush the rules out of a chain (-F). 6. Zero the packet and byte counters on all rules in a chain (-Z). There are several ways to manipulate rules inside a chain: 1. Append a new rule to a chain (-A). 2. Insert a new rule at some position in a chain (-I). 3. Replace a rule at some position in a chain (-R). 4. Delete a rule at some position in a chain (-D). 5. Delete the first rule that matches in a chain (-D). There are a few operations for masquerading, which are in ipchains for want of a good place to put them: 1. List the currently masqueraded connections (-M -L). 2. Set masquerading timeout values (-M -S). (But see ``I can't set masquerading timeouts!''). Przykłady: ipchains -A input -s 127.0.0.1 -p icmp -j DENY Zabrania dochodzenia pinga do localhosta ipchains -D input 1 Aby skasować regułę nr 1 w łańcuchu wejściowym ipchains -D input -s 127.0.0.1 -p icmp -j DENY Aby skasować wcześniej wpisaną regułę, nie znając jej numeru w łańcuchu, powtarzamy wcześniejszą komendę z opcją -D zamiast -A. Podobnie należy postępować przy opcjach -I lub -R. -s i -d - (source) żródło i (destination) cel. Adresy moga być podawane jako nr IP lub nazwa oraz jako zakresy: 199.95.207.0/24 (24 - ilość bitów maski) 199.95.207.0/255.255.255.0 (maska) oba przykłady oznaczają ten sam zakres: od 192.95.207.0 do 192.95.207.255 Większość flag posiada negację np: `-s ! localhost' oznacza wszystkie hosty poza lokalnym. Protokół może być podawany jako numer lub nazwa (tcp, udp, icmp), nie ważne czy małe czy też duże litery. Można również podawać numer portu dla którego układamy regułę: -p TCP -s 0.0.0.0/0 1023 Zakres portów: -p TCP -s 0.0.0.0/0 1010:1023 -p TCP -s 0.0.0.0/0 :1023 - wszystkie porty poniżej 1023 Równie dobrze możemy podać nazwę portu: -p TCP -s 0.0.0.0/0 :www Dla protokołu ICMP nie podajemy portów tylko nazwy, które możemy wylistować poleceniem: ipchains -h icmp Przy ICMP nie można stosować przeczenia. Najczęściej używane : Number Name Required by 0 echo-reply ping 3 destination-unreachable Any TCP/UDP traffic. 5 redirect routing if not running routing daemon 8 echo-request ping 11 time-exceeded traceroute -i używamy do definicji interfejsu sieciowego (karty, dial up). Można używać !. -i eth+ oznacza wszystkie interfejsy zaczynające się na eth. -y Casem możemy potrzebować zablokować dane połączenie tylko w jednym kierunku. Naiwnym wykorzystaniem tego byłoby blokowanie TCP, ponieważ musi on miec połączenia w obu kierunkach (flagi SYNC i ACK). Rozwiązaniem tego jest blokowanie tylko pakietów używanych do nawiązywania połączenia (ustawiona flaga SYN). Przez zablokowanie tylko tych pakietów, możemy uniemożliwić niedoszłe połączenia na tej trasie. NP. płączenia z numeru 192.168.1.1 opisujemy: -p TCP -s 192.168.1.1 -y (rozdział 4.1.3.6 - nie rozumiem) -j Flaga ta specyfikuje co wykonać z pakietem pasującym do poprzedzającej go reguły. Jeśli nie ma -j, to reguła jest używana do prostego zliczania pakietów ją spełniających. Używając: ipchains -L -v listujemy liczniki (bajtów i pakietów) dla każdej reguły. Działaniami które możemy zlecić są: ACCEPT - pozwala przejść pakietom przez firewalla. DENY - likwiduje pakiety, tak jakby nigdy nie doszły do firewalla REJECT - likwiduje pakiety, (jeśli nie są to pakiety ICMP) wysyłając komunikat ICMP o nieosiągalności celu. MASQ - stosuje maskaradę (jądro musi być skompilowane z IP Masquerading enabled). Prawidłowe jedynie dla łańcucha forward. For details on this, see the Masquerading-HOWTO and the Appendix ``Differences between ipchains and ipfwadm''. REDIRECT - przesyła pakiet na lokalny port, zamiast podanego w nagłówku. Używane tylko dla protokołów TCP i UDP. Numer portu może być opdany po REDIRECT co przesyła pakiety na konkretny port. To działanie jest prawidłowe tyko dla łańcucha (wejściowego) input. RETURN - jest identyczny z natychmiastowym osiągnięciem końca łańcucha. -l Logowanie pakietów. ipchains -N test - Tworzenie nowego łańcucha. ipchains -X test - Kasowanie utworzonego łańcucha (należy wcześniej go opróżnić poprzez flush: -F) ipchains -L input - wylistowanie zawartości istniejących łańcuchów -n - numeryczne IP -v - dokładne dane -x - liczby bez przedrostków: kilo, mega ipchains -L -v -Z input - Listuje, a następnie zeruje liczniki łańcucha. -M Parametry maskarady. Wraz z -L listuje ustawienia dla maskarady. Wraz z -S ustawia parametry czasowe dla maskarady. Są one trzy: dla sesji TCP, dla sesji TCP po pakiecie końcowym (FIN) i dla pakietów UDP. Aby ich nie zmieniać można wpisać zera. Wartości domyślne podane są w `/usr/include/net/ip_masq.h' (15minut, 2min, 5min) -C Sprawdza co jak zachowa się pakiet opisany regułą (występującą po -C) przy uruchomionych aktualnie łańcuchach. -b (bidirection) Umożliwia "dwuznaczność" komend. ipchains -b -A forward -j reject -s 192.168.1.1 - umożliwia forwarding "do" i "z" 192.168.1.1. -v (verbose) Opisuje zechowanie wprowadzanej właśnie reguły. ################################### Przykłady: ściąganie newsów przez lokalny komp -p TCP -s news.virtual.net.au nntp ściąganie poczty przez lokalny komp -p TCP -s mail.virtual.net.au pop-3 połączenia ftp do komputera: -p TCP -d $LOCALIP ftp Nie chcę, aby żadne lokalne procesy łączyły się z danym IP: ipchains -A output -d 199.95.207.0/24 -j REJECT Ustawiamy priorytety dla wychodzących pakietów (poprzez modem) - tworzymy łańcuch ppp-out: ipchains -N ppp-out ipchains -A output -i ppp0 -j ppp-out Minimalne opóźnienie dla WWW i telnetu: 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 telnet -t 0x01 0x10 Najniższy "koszt" dla transmisji ftp, nntp, pop-3: 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 Parametr -t ustawia rzadko używane bity TOS (Type of Service) w nagłówku IP. (Minimum Delay, Maximum Throughput, Maximum Reliability and Minimum Cost) Ustawiamy priorytety dla przychodzących pakietów (poprzez modem) - tworzymy łańcuch ppp-in: ipchains -N ppp-in ipchains -A input -i ppp0 -j ppp-in Żadne z przychodzących pakietów nie mogą mieć ustawionego adresu źródłowego z wewnętrznej sieci: 192.168.1.*, musimy zapisać tego typu próby włamania i zabronić ich. ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY Pozwalam na pakiety UDP do mojego lokalnego hosta, na któryym uruchomiłem "caching nameserver" i oczekuję odpowiedzi od DNSa. ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT Zezwalam na połączenia wchodzące FTP ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT oraz na powracające dane FTP, które powinny być na portach powyżej 1023 (oraz z pominięciem okolicy portu 6000 - porty X11) 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 Pakiety lokalne (od lokalnego hosta do lokalnego hosta) są dozwolone: ipchains -A input -i lo -j ACCEPT Na koniec ustalamy politykę dla pozostałych przychodzących danych, które są zablokowane: ipchains -P input DENY Najbezpieczniej jest ustawić politykę DENY na początku reguł, ponieważ w trakcie ustawiania jakieś pakiety mogą się dostać do środka, jednak wtedy mamy zablokowany DNS i musimy w regułach używać numerów IP. Skrypt ipchains-save zapisuje aktualne ustawienia łańcuchów do pliku: $ ipchains-save > my_firewall Odzyskiwanie ustawień: $ ipchains-restore < my_firewall -a dodaje do istniejących łańcuchów, -f (flush) czyści najpierw istniejące łańcuchy i zamazuje. Nie powinno się blokować pakietów ICMP. Służą one do wykrywania róąnych błędów w sieci, i zamiast komunikatu `destination-unreachable' możemy siedzieć i patrzyć na próbę nawiązania połączenia jeszcze długo, ponieważ ICMP nie będzie mógł zasygnalizować błędu. Ważniejsze jest wykrywanie przez ICMP największego MTU na trasie pakietu, którego zablokowanie może katastrofalnie pogorszyć transfer. Przy blokowaniu TCP, należy pamiętać, że DNS nie zawsze używa UDP. Gdy odpowiedź z serwera przekracza 512 bajtów, to klient używa TCP i portu 53. Mogą wtedy wystaąpić dziwne opóźnienia i okazjonalne nie działanie DNSa. Jeśli twoje zapytania DNSa są zawsze bezpośrednio skierowane do tego samego zewnętrznego źródła (korzystasz z serwera nazw umieszczonego w /etc/resolv.conf lub z serwera cache-ującego w trybie forward) to wyatrczy jak umożliwisz połączenia TCP na port dns na tym serwerze z portu dns lokalnego hosta (w przypadku serwera cache-ującego) lub z wyższego portu (>1023) jeśli używasz pliku /etc/resolv.conf. W przypadku FTP mamy do czynienia z dwoma trybami pracy: aktywnym (normalne połączenie np. z konsoli) i pasywnym (połączenie np. z przeglądarki WWW). W aktywnym trybie, gdy odległy system chce coś przesłać (np. zawartość katalogu po poleceniu ls) to otwiera połączenie. Nie możemy więc filtrować takich połączeń. Tryb pasywy nawiązuje tylko połączenia od klienta do serwera, nawet dla przychodzących danych. Dla trybu aktywnego, możesz pozwolić tylko na nawiązywanie połączeń dla portów >1023 i nie z przedziału 6000:6010 (używane przez XWindow). Linuxy są odporne na atak "Ping of Detach" polegający na wysyłaniu dużych pakietów ICMP i przepełnianiu stosu TCP. Łatwo rozpoznać takie pakiety po fragmentacji, która została dokoanana ze względu na rozmiar przektaczający MTU. Teardrop i Bonk są typami ataków (niebezpieczne głównie dla WinNT) używającymi nachodzących na siebie fragmentów pakietów. Ruter Linuxowy dokonuje defragmentacji i uniemożliwia takie ataki. Niektóre z mniej stabilnych stosów TCP są wrażliwe na sfragmentowane pakiety z dużą liczbą fragmentów i mogą nie odebrać wszystkich frgm. Linux jest pozbawiony tego problemu. Możesz filtrować takie fragmenty lub skompilować jądro z opcją `IP: always defragment' ustawioną na `Y' (tylko gdy twój Linux jest jedynym możliwym ruterem dla tych pakietów). Podczas zmiany reguł filtrowania należy uważać, aby w połowie wprowadzanych zmian nie otworzyć drogi dla jakichś pakietów i nie pozwolić im wniknąć do systemu. Można temu zaradzić: ipchains -I input 1 -j DENY ipchains -I output 1 -j DENY ipchains -I forward 1 -j DENY wprowadzamy zmiany i: ipchains -D input 1 ipchains -D output 1 ipchains -D forward 1 IP spoofing jest techniką zmieniania w pakietach adresu nadawcy, w celu podszycia się pod inny host (np. z wnętrza naszej sieci). Najlepszą ochronę daje włączenie: Source Address Verification które jest wykonuwane przez kod routera. Zajrzyj do pliku: /proc/sys/net/ipv4/conf/all/rp_filter, jeśli istnieje to włącz Source Address Verification. [then turning on Source Address Verification at every boot is the right solution for you.] Aby tego dokonać umieść poniższe linie w skrypcie startowym, tak aby wykonały się przed inicjalizacją interfejsu sieciowego. (np: Debian users would put them in /etc/init.d/netbase if they are not already there) # 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 Jeśli nie uda nam się to, musimy ręcznie wprowadzić reguły zabezpieczające. Jądra od 2.1 automatcznie odrzucają pakiety pochodzące z adresów 127.*.*.* (loopback). Przykładowo mając: eth0 -> 192.168.1.0 netmask 255.255.255.0, eth1 -> 10.0.0.0 netmask 255.0.0.0, ppp0 -> Internet ustawiamy: 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 Nie jest to tak dobre rozwiązanie jak Source Address Verification, ponieważ po zmianie sieci, musimy pamiętać o zmienieniu reguł. Problemy: Maskarada/forwarding nie pracuje - sprawdź czy masz włączony IP Forwarding: echo 1 > /proc/sys/net/ipv4/ip_forward Możesz ustawić to w skryptach startowych, ale przedtem najlepiej uruchomić firewalling, aby żadne pakiety nie mogły sie w międzyczasie wślizgnąć. Większość problemów została poprawiona w wersjach jądra 2.2.*.