Mosty filtrujące
Poprzedni |  | Następny

# 5. Konfiguracja firewalla

Następnym krokiem jest przygotowanie reguł firewalla, zabezpieczających sieć wewnętrzną. Wiąże się to z pewnymi utrudnieniami, gdyż nie wszystkie możliwości firewalla mogą być wykorzystywane w przypadku pakietów przechodzących przez most. Trzeba też wiedzieć, że między pakietami przekazywanymi, a odbieranymi przez maszynę lokalną jest pewna różnica. Pakiety przychodzące przechodzą przez firewall tylko raz, a nie dwa razy jak w zwykłych warunkach. Mówiąc dokładniej, są one filtrowane tylko przy odbiorze, tak więc reguły zawierające `out` lub `xmit` będą bezużyteczne. Ja osobiście używam starszej składni `in via`, którą rozsądniej się czyta. Trzeba również pamiętać, że filtrując pakiety przechodzące przez most, można używać tylko poleceń `pass` lub `drop`. Bardziej wymyślne polecenia, jak `divert`, `forward` czy `reject` są niedozwolone. Można z nich korzystać tylko w odniesieniu do pakietów wysyłanych przez maszynę mostu lub do niej przychodzących (jeśli oczywiście ma ona adres IP).

Nowością w FreeBSD 4.0 jest filtrowanie z utrzymywaniem stanu. Jest ono znacznym ułatwieniem obsługi komunikacji przez UDP, polegającej najczęściej na wysłaniu żądania, a za chwilę odebraniu odpowiedzi, z takimi samymi adresami IP i numerami portów (przy czym nadawca i odbiorca są oczywiście zamienieni miejscami). Praktycznie nie da się potraktować takiej wymiany jako pojedynczej sesji, posługując się firewallem nie przechowującym informacji o stanie połączenia. Jednakże gdy firewall potrafi zapamiętać wychodzący pakiet UDP i zezwolić na odpowiedź w ciągu kilku następnych minut, wówczas zarządzanie komunikacją UDP staje się dziecinnie proste. Jak to zrobić, pokazuje poniższy przykład. Podobnie można traktować pakiety TCP, chroni to przed niektórymi atakami przez uniemożliwienie działania oraz innymi figlami, prowadzi jednak do szybkiego rozrastania się tablicy stanów.

Spójrzmy na przykładową konfigurację. Zwróćmy uwagę, że na początku pliku `/etc/rc.firewall` umieszczono domyślne reguły dla interfejsu pseudosieci `lo0`, nie trzeba się więc już nimi przejmować. Inne reguły powinny być umieszczone w oddzielnym pliku (np. `/etc/rc.firewall.local`), który byłby dołączany podczas ładowania systemu dzięki zmianie w pliku `/etc/rc.conf` tego wiersza, w którym typ firewalla był zdefiniowany jako `otwarty`:

    firewall_type="/etc/rc.firewall.local"

> WAŻNE: Należy tu podać pełną ścieżkę, w przeciwnym razie plik nie zostanie załadowany, co grozi utratą dostępu do sieci.

Na potrzeby przykładu przyjmujemy, że interfejs `fxp0` połączony jest z Internetem, natomiast `xl0` z siecią wewnętrzną (LAN). Adres IP maszyny mostu to `1.2.3.4` (w rzeczywistości dostawca usług interenetowych nie mógłby przydzielić adresu klasy A, jednak świetnie nadaje się on jako przykład).

    # Szybkie przepuszczanie pakietów, których stan został zapamiętany
    add check-state

    # Blokada sieci z RFC 1918
    add drop all from 10.0.0.0/8 to any in via fxp0
    add drop all from 172.16.0.0/12 to any in via fxp0
    add drop all from 192.168.0.0/16 to any in via fxp0

    # Maszyna będąca mostem może wysyłać co tylko zechce
    # (jeśli maszyna nie ma adresu IP, pomiń poniższe wiersze)
    add pass tcp from 1.2.3.4 to any setup keep-state
    add pass udp from 1.2.3.4 to any keep-state
    add pass ip from 1.2.3.4 to any

    # Stacje sieci wewnętrznej mogą wysyłać co tylko zechcą
    add pass tcp from any to any in via xl0 setup keep-state
    add pass udp from any to any in via xl0 keep-state
    add pass ip from any to any in via xl0

    # Protokół TCP
    # Przepuszczanie SSH
    add pass tcp from any to any 22 in via fxp0 setup keep-state
    # Przepuszczanie SMTP jedynie do serwera poczty
    add pass tcp from any to relay 25 in via fxp0 setup keep-state
    # Informacje o obszarach mogą być przesyłane tylko przez podrzędny
    # serwer nazw [dns2.nic.it]
    add pass tcp from 193.205.245.8 to ns 53 in via fxp0 setup keep-state
    # Przepuszczanie zapytań ident - takie rozwiązanie jest lepsze
    # niż oczekiwanie na przekroczenie czasu
    add pass tcp from any to any 113 in via fxp0 setup keep-state
    # Przepuszczenie zakresu portów dynamicznych
    add pass tcp from any to any 49152-65535 in via fxp0 setup keep-state

    # Protokół UDP
    # Przepuszczanie zapytań DNS jedynie do serwera DNS
    add pass udp from any to ns 53 in via fxp0 keep-state
    # Przepuszczenie zakresu portów dynamicznych
    add pass udp from any to any 49152-65535 in via fxp0 keep-state

    # Protokół ICMP
    # Przepuszczanie 'pingów'
    add pass icmp from any to any icmptypes 8 keep-state
    # Przepuszczanie komunikatów o błędach generowanych przez 'traceroute'
    add pass icmp from any to any icmptypes 3
    add pass icmp from any to any icmptypes 11

    # Wszystko inne jest podejrzane
    add drop log all from any to any

Czytelnicy mający już doświadczenie z konfiguracją firewalla mogą zwrócić uwagę na brak pewnych rzeczy. W szczególności, brakuje reguł zapobiegających podszywaniu się. Rzeczywiście, wśród powyższych reguł nie było takiej:

    add deny all from 1.2.3.4/8 to any in via fxp0

Nakazuje ona odrzucanie pakietów, które nadchodzą z zewnątrz, a udają, że są z sieci wewnętrznej. Jest to zwykle stosowane w celu zabezpieczenia się przed próbami prześliznięcia się przez filtrowanie, polegającymi na tworzeniu fałszywych pakietów, wyglądających jak wysłane z sieci wewnętrznej. Kłopot w tym, że jest co najmniej jedna stacja połączona z interfejsem zewnętrznym, której nie można zignorować: jest nią ruter. Zwykle jednak ochrona przed podszywaniem się realizowana jest przez dostawcę usług internetowych na jego ruterze, nie trzeba się więc tym przejmować.

Ostatnia reguła jest bardzo podobna do reguły przyjmowanej domyślnie, czyli odrzucania wszystkiego, co nie jest ściśle dozwolone. Jest jednak różnica: wszystko, co jest podejrzane, jest rejestrowane.

Dwie reguły odpowiedzialne są za przekazywanie pakietów SMTP i DNS do serwera poczty i serwera nazw, o ile takowe serwery są. Zestaw reguł powinien być oczywiście dostosowany do własnych potrzeb, tutaj pokazany jest tylko pewien przykład (składnia reguł jest dokładnie opisana w dokumentacji systemowej ipfw(8)). Trzeba mieć na uwadze, że aby poprawnie działały relay i ns, wymagane jest, by zapytania DNS działały zanim pracę rozpoczyna most. Dzięki temu można też się przekonać, czy adres IP został przypisany do właściwiej karty sieciowej. Alternatywnym rozwiązaniem jest wpisanie adresu IP zamiast nazwy stacji (jest to jedyna możliwość w przypadku, gdy maszyna nie ma adresu IP).

Osoby, które już kiedyś miały pewne doświadczenia z konfiguracją firewalla, przyzwyczajone są zapewne do reguł `reset` lub `forward` dla pakietów ident (port TCP o numerze 113). Niestety, w przypadku mostu takie rozwiązanie nie wchodzi w grę, najlepiej jest po prostu przepuścić owe pakiety do ich adresata. Jest to stosunkowo niegroźne, gdy adresat ma wyłączoną usługę ident. Można także blokować połączenia z portem 113, co powoduje pewne problemy np. z usługą IRC (ponieważ zapytanie ident musi przekroczyć czas oczekiwania).

Niezrozumiała może wydać się obecność oddzielnych reguł, z których jedne zezwalaja na wysyłanie maszynie będącej mostem, drugie natomiast stacjom sieci wewnętrznej. Jest tak dlatego, że pakiety wysyłane przez maszynę lokalną docierają do filtra inną drogą niż pakiety wysłane z sieci wewnętrznej. Te ostatnie muszą przejść przez most, natomiast pakiety wysłane lokalnie trafiają na stos IP maszyny. Osobne zestawy reguł obsługują obydwa przypadki. Z kolei reguły zawierające `in via `fxp0`` odnoszą się do obu rodzajów pakietów. Mówiąc ogólnie, pisząc reguły `in via` trzeba zrobić wyjątek dla pakietów wysyłanych z lokalnej maszyny, ponieważ one nie przyszły przez żaden z interfejsów.

Poprzedni | Spis treści | Następny
Uruchamianie mostu |  | Podziękowania

Ten i inne dokumenty można pobrać z ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

W przypadku pytań o FreeBSD prosimy przeczytać dostępną dokumentację przed kontaktem z <questions@FreeBSD.org>.
W sprawie zapytań o tę dokumentację prosimy o kontakt z <doc@FreeBSD.org>.