Firewall we FREESCO zbudowany jest na bazie komendy ipfwadm służącej do administrowania regułami przepływu pakietów. Wyróżnia się trzy kierunki przepływu pakietów wejściowy input -I, wyjściowy output -O oraz przekazywania forward -F ponadto polecenie to pozwala zliczać ruch pakietów oraz ustawić połączenia maskowane masquerade pozwalające przyłączyć do jednego adresu "publicznego" wiele maszyn z "prywatnymi" adresami. Polecenie to nie ustawia przepływu pakietów, nie decyduje ono gdzie dany pakiet ma trafić, do którego interfejsu sieciowego. Sprawdza tylko jak pakiet, który się pojawił na wejściu Firewala (I, O, F) odpowiada odpowiednim regułom wejściowym, wyjściowym i przepływu i na tej podstawie decyduje czy go przepuścić, nie przepuścić lub zamaskować. Jedynie w przypadku polecenia -F -m (maskarada) zmieniany jest w pakiecie adres źródłowy na adres interfejsu, przez który jest on wysyłany w świat.


Polecenie ipfwadm
Na początek przedstawię tekst helpu ipfwadm:

[LINUX] ipfwadm -h
-ipfwadm 2.3.0, 1996/07/30

ipfwadm -A [direction] command [options] (accounting)
ipfwadm -F command [options] (forwarding firewall)
ipfwadm -I command [options] (input firewall)
ipfwadm -O command [options] (output firewall)
ipfwadm -M [-s | -l] [options] (masquerading entries)
ipfwadm -h (print this help information)

Commands:

-i [policy] - insert rule (no policy for accounting rules)
-a [policy] - append rule (no policy for accounting rules)
-d [policy] - delete rule (no policy for accounting rules)
-l - list all rules of this category
-z - reset packet/byte counters of all rules of this category
-f - remove all rules of this category
-p [policy] - change default policy (accept/deny/reject)
-s tcp tcpfin udp - set masuerading timeout values
-c - check acceptance of IP packet

Options:

-P - protocol (either tcp, udp, icmp, or all)
-S address[/mask] [port ...] - source specification
-D address[/mask] [port ...] - destination specification
-V address - network interface address
-W name - network interface name
-b - bidirectional match
-e - extended output mode
-k - match TCP packets only when ACK set
-m - masquerade packets as coming from local host
-n - numeric output of addresses and ports
-o - turn on kernel logging for matching packets
-r [port] - redirect packets to local port (transparent proxying)
-t and xor - and/xor masks for TOS field
-v - verbose mode
-x - expand numbers (display exact values)
-y - match TCP packets only when SYN set and ACK cleared



Ogólna składnia
ipfwadm kategoria komendy parametry [opcje]


Kategorie

-A [kierunek]
Ustawienie liczemia ruchu, gdzie jako kierunek można podac in, out, both, domyślnym jest both.

-I
Reguła wejściowa

-O
Reguła wyjściowa

-F
Reguła przekazywania

-M [-l | -s]
Ustawienie maskarady. Ta kategoria moze być używana tylko z komendą -l i -s

Komendy

-f
Kasuje wszystkie reguły w danej kategorii

-a [polityka]
Dodanie nowej reguly; reguła jest dopisywana na koniec listy. Dla reguł liczenia ruchu polityki nie podaje się. Dla reguł firewala trzeba podać: accept, deny lub reject. Gdy nazwy źródłowa i/lub docelowa stanowią więcej niż jeden adres, reguła będzie spełniona dla każdej możliwej kombinacji adresów.

-i [polityka]
Wstawienie nowej reguły; reguła jest wstawiana na początek listy. Patrz opis komendy -a

-d [polityka]
Usunięcie istniejącej reguły. Składnia musi być identyczna z kasowaną konendą append/insert. Podane parametry musza odpowiadać dokładnie parametrom w podanym w kasowanej komendzie append lub insert, w przypadku niedopasowania reguła nie zostanie skasowana z listy.Zostanie skasowane tylko pierwsza pasująca reguła.

-p [polityka]
Ustawienie polityki domyślnej. Polityka domyślna jest stosowana gdy nie ma pasujących reguł.Ta komenda jest prawidłowa w polączeniu z -I, -O, -F.

polityka:

accept - Zezwolenie na odbiór, wysłanie lub przesłanie pasujących pakietów
deny - Nie pozwala na odbiór, wysłanie lub przesłanie pasujących pakietów
reject - Nie pozwala na odbiór, wysłanie lub przesłanie pasujących pakietów i wysyła komunikat błędu do hosta, który przesłał pakiet.

-l
Wylistowanie wszystkich reguł z wybranej kategorii. Może być łączona z komendą -z (kasowanie liczników) w takim wypadku liczniki bajtów i pakietów będa skasowane po wylistowaniu ich wartości O ile nie podano opcji -x licznik pakietów i bajtów (gdy będzie wyświetlany opcja -e) bedzie podawal liczbę K lub M gdzie 1K =1000 i 1 M =1000K (w zaokrągleniu).

-z
Kasuje liczniki pakietów/bajtów dla wszystkich wpisow w danej kategorii. Może być stosowana w połączeniu z komendą -l

-s tcp tcpfin udp
Ustwia wartosci czasu utrzymywania polączeń maskowanych. Komenda ma trzy parametry reprezentujące kolejno czas rozłaczenia (w sekundach) dla nie aktywnej sesji TCP, zakończonej sesji TCP i nieaktywnej sesji UDP. Komenda uzywana tylko w polączeniu z -M

-c
Sprawdzenie czy pakiet IP będzie zaakceptowany czy odrzucony przez wybrany typ firewalla w połączeniu z -I, -O, -F

Parametry

Następujące parametry mogą być używane w połaczeniu z komendami -a, -i, -d, -c.

-P protokół
Protokół może mieć wartość tcp, udp, icmp lub all, All oznacza wszystkie protokóły, jast także domyślnym gdy nie podaje się tego parametru. Parametr wymagany dla komendy -c, all nie może być użyty z komendą -c.

-S adres[/maska] [port...]
Źrodło pakietu. Adres można podać jako nazwę hosta, nazwę sieci lub bezpośrednio adres IP. Maskę można podać bezpośrednio lub w postaci liczby np. masce 255.255.255.0 odpowiada 24. Jesli nie podano, maska przyjmuje wartość 32. Można określić, którego portu (portów, zakresu portów) dotyczy reguła, w takim przypadku trzeba podać parametr -P okreslający protokół (numeracja portów przypisana jest do protokółów). Wprzypadku ICMP pole portu używane jest do podania typu pakietu ICMP. Można podać jeden port , liste portów, lub zakres portów w postaci pierwszyport:ostatniport. Gdy parametr nie jest podany jako adres/maskę domyślna przyjmuje 0.0.0.0/0 pasujący do wszystkich adresów.

-D adres[/maska] [port...]
Adres docelowy. Tworzony w taki sam sposób jak dla parametru -S, Uwaga typ ICMP jest niedozwolony w polączeniu z parametrem -D, typ ICMP może być podany tylko po parametrze -S

-V adres
Określa adres iterfejsu sieciowego, na którym pakiet jest odbierany (-I) lub wysyłany (-O), podany jako nazwa hosta lub bezpośrednio adres IP. Gdy nie jest podany przyjmowany jest adres 0.0.0.0. Parametr konieczny dla komendy -c

-W nazwa
Określa nazwę interfejsu sieciuowego na którym pakiet jest odbierany (-I) lub wysyłany (-O).Gdy nie jest podany przyjmowana jest nazwa pusta, pasująca do wszystkich interfejsów, Parametr konieczny dla komendy -c.

Pozostałe opcje

-b
Tryb dwukierunkowy, dla tej opcji pasuje ruch w obie strony pomiedzy żródłem i celem. Ta opcja dzieła w połączeniu z z komendami -i, -a, -d.

-o
Pasujące pakiety są zapisywane w logu jądra.

-y
Opcja filtruje pakiety TCP. Pasuja tylko te, które mają ustawiony bit SYN i wyzerowany ACK.(opcja ignoruje pakiety innych typów). Działa w połaczeniu z komendami -a, -i, -d.

-e
Opcja powoduje, że komenda list pokazuje także adresy interfejsów i opcje reguł, a dla reguł firewala także liczniki pakietów i bajtów oraz maski TOS. W połączeniu z -M COS ROBI ALE TO TRZEBA SPRAWDZIC CO?. Pracuje tylko w połączeniu z -l

-x
Wyświetla pełne wartości liczników pakietów i bajtów. Daje efekt gdy wyświetlane są liczniki.

-t maska_and maska_or
Ustawienie bitów TOS

-k
Opcja filtruje pakiety potwierdzenia TCP. Pasują pakiety będące potwierdzeniem odbioru pakietów próbujących zestawić połączenie TCP, które mają ustawoony bit ACK. (opcja ignoruje pakiety innych typów). Działa w połaczeniu z komendami -a, -i, -d.

-v
Drukje dodatkowe infotmację o regule i pakietach. Opcja daje efekt w połączeniu z komendami -a, -i, -d i -c.

-m
Pakiety akceptowane przez regułę będą maskowane i wysyłane jako pochodzące z lokalnego hosta. Pakiety powracające są demaskowane automatycznie omijając firewall przekazujący. Dziala w połączeniu z -F i polityką accept

-n
Adresy IP i numery portów będa wypisywane w formacie numerycznym. Domyślnie program wyświetla nazwy hostów, sieci i usług.

-r [port]
Przeźroczyste PROXY. Przekierowuje pakiety na lokalny port. Działa w połączeniu z -I i polityką accept.

Dodatek typy pakietów ICMP

0 - powtórzenie odpowiedzi
3 - cel nieosiągalny
4- żródło nie aktywne
5 - przkierowanie
8 - żądanie powtórzenia
11 - czas upłynął
12 problem z parametrem
13 - żądanie znacznika czasu
14 - wysłanie znacznika czasy w odpowiedzi
15 - żądania informacji
16 - wysłania informacji w odpowiedzi
17 - żądanie maski adresu
18 - wysłanie maski adresu w odpowiedzi



Przykłady
To co najważniejsze przykłady i ich opis.


W przykładach zakładam adresy:

eth0 - interfejs sieciowy
192.168.0.1 - adres interfejsu sieciowego
192.168.0.0 - adres naszej sieci
eth1 - interfejs sieciowy
192.168.1.1 - adres interfejsu sieciowego
192.168.1.0 - adres naszej sieci
255.255.255.0 lub 24 - maska podsieci
ppp0 - nazwa interfejsu do ISP
217.195.44.120 - adres interfejsu do ISP

Uwaga ogólna o tworzeniu firewalla.

Bardzo ważne jest odpowiednia kolejność reguł tak aby reguły ogólne znalazły się na końcu listy natomiast szczegółowe na początku. (liste możemy w każdej chwili otrzymać wpisując ipfwadm -I/O/F -l[nex]). Bo jeśli komuś pozwolimy na wejście przez regułe ogólną to regułą szczególową podaną później mu nie zabronimy.

ipfwadm -I -f
ipfwadm -O -f
ipfwadm -F -f

OPIS.
To co robi się na początku wyczyszczenie wszystkich reguł.

Ipfwadm -I -p deny
Ipfwadm -O -p deny
Ipfwadm -F -p deny

OPIS.
Ustawienie domyślnej polityki firewalli wejściowego, wyjściowego i przekazującego na deny czyli odrzucamy wszystko.

ipfwadm -I -a accept -W eth0 -S 192.168.0.0/24
ipfwadm -I -a accept -V 192.168.0.1 -S 192.168.0.0/255.255.255.0

OPIS.
Obie te komendy robią to samo wpisują na koniec listy firewalla wejściowego zezwolenie na przesyłanie pakietów, których źródłem jest nasza sieć 192.168.0.0/24 przyłączono do interfejsu eth0 o adresie 192.168.0.1. Ponieważ nie podaliśmy adresu docelowego program przyjmie 0.0.0.0 czyli wszystkie możliwe adresy.

ipfwadm -I -a deny -P tcp -S 192.168.0.3 -D 0.0.0.0/0 80

OPIS.
Kolega z 192.168.0.3 podpadł nam to odcinamy mu strony www (port 80) na całym świecie. Gdybyśmy wpisali reguły w takiej kolejności jak podałem to niestety zabronienie by nie zadziałało bo wcześniejsza reguła ogólna pakiet by przepuściła. W takim wypadku należy zastosowań komendę -i deny insert (wstaw). Podawanie adresy lub nazwy interfejsu sieciowego -W, -V nie jest konieczne, jeśli pakiet taki pojawi się na jakimkolwiek interfejsie zostanie odrzucony.

ipfwadm -I -c -V 192.168.0.1 -W eth0 -P tcp -S 192.168.0.3 4000 -D 0.0.0.0/0 80

OPIS.
Sprawdzamy czy udało się zablokować, otrzymamy odpowiedz czy pakiet został zaakceptowany czy odrzucony. Konieczne jest przy komendzie -c podanie nazwy i adresu interfejsu sieciowego, protokółu, adresu i portu źródłowego i docelowego (można podać tylko jeden port źródłowy i docelowy oczywiście mogą to być różne porty)

ipfwadm -I -a accept -P tcp -S 192.168.0.3 -D 0/0 80
ipfwadm -I -a deny -P tcp -S 192.168.0.3 -D 0/0


OPIS.
Te dwie komendy zabraniają dostępu z adresu 192.168.0.3 do wszystkiego za wyjątkiem stron www. Pierwsza zezwala na dostęp do portu 80 a druga zabrania dostępu do wszystkiego. Pakiety na port 80 przejdą, inne nie.

ipfwadm -I -i deny -P tcp -S 192.168.0.3 -D 0/0
ipfwadm -I -i aceept -P tcp -S 192.168.0.3 -D 0/0 80


OPIS.
Te dwie komendy robią dokładnie to samo co poprzednie, ale podane są w odwrotnej kolejności bo wykorzystują komendę -i i druga komenda znajdzie się na liście przed pierwszą. Komendy -i musimy użyć gdy "ręcznie" dopisujemy reguły do działającego firewalla. W takim wypadku znajda się one na początku spisu reguł i będą sprawdzane w pierwszej kolejności. Należy być bardzo ostrożnym przy dopisywaniu nowych reguł zwłaszcza zezwalających ponieważ w przypadku złego wpisu możemy bardzo obniżyć bezpieczeństwo systemu np. wpisując: ipfwadm -I -i accept -S0/0 pozbawiamy się w ogóle ochrony bo pierwsza sprawdzana reguła pozwala na dostęp wszystkich wszędzie na wszystkich protokółach i portach tak, że następne reguły choćby najbardziej wymyślne nie będą miały czego blokować i przepuszczać. W przypadku tworzenia firewalla od podstaw wygodniej jest używać komendy-a ponieważ kolejność komend w pisanym skrypcie będzie odpowiadać ich kolejności w czasie sprawdzania reguł.

ipfwadm -I -i deny -W eth0 -S 192.168.0.0/24
ipfwadm -I -i accept -W eth0 -S 192.168.0.4
ipfwadm -I -i accept -W eth0 -S 192.168.0.12
ipfwadm -I -i accept -W eth0 -S 192.168.0.35
ipfwadm -I -i accept -W eth0 -S 192.168.0.78
ipfwadm -I -i accept -W eth0 -S 192.168.0.159


OPIS.
Pierwsza linia zabrania wszystkim z sieci 192.168.0.0/24 na interfejsie eth0 dostępu wszędzie, następne odblokowują dostęp dla hostów .4, .12, .35, .78, 159. Gdybyśmy chcieli zastosować komendę -a to pierwsza linia powinna znaleźć się na końcu.

ipfwadm -F -a accept -W eth0 -S 192.168.0.0/24 -D 192.168.1.0/24
ipfwadm -F -a accept -W eth1 -S 192.168.1.0/24 -D 192.168.0.0/24
ipfwadm -F -a -m -S 192.168.0.0/24
ipfwadm -F -a -m -S 192.168.1.0/24


OPIS.
Posiadamy dwie sieci, pierwsze dwie reguły umożliwiają ruch pakietów miedzy tymi sieciami, pakiety wysyłane z tych sieci, które nie odpowiadają tym regułom zostaną zamaskowane i wysłane "w świat" zgodnie z tabelą routingu (to załatwiają inne polecenia, którymi tu się nie zajmujemy). Pierwsze dwie linie muszą być wprowadzone, ponieważ w przypadku ich braku pakiety przesyłane między sieciami były by maskowane (bez sensu, co nie)

Dodatki:
Tu jest rozebrany na czynniki pierwsze skrypt /mnt/routetr/rc/rc_masq z pakietu freesco
Przykład użycia skryptu /mnt/router/rc/rc_user do blokowania niektórych hostów
Oryginalne źródła ipfwadm