MENU

Aktualności
Download
Sterowniki
Strefa Zrzutu
Archiwum
Informacje
Linki
 

MENU

Sprzęt
Oprogramowanie
Technologie
Novell Netware
Windows9x
WindowsNT
UNIX/Linux
Słowniczek

Napisz do nas

Jeżeli masz jakieś pytania, chciałbyś wyrazić opinię lub nawiązać współpracę, napisz do nas:

O P I N I A

P Y T A N  I  E

W S P Ó Ł P R A C A

B A N N E R Y

Informacje

Strona zoptymalizowana
pod IE4.0+ i NN4.0+

 

 
Konfiguracja firewalla

linia_1.gif (306 bytes)

Aktualności | Linux / Unix

Zagadnienia bezpieczeństwa sieci  LAN

    Co dzień przybywa komputerów podłączonych do sieci Internet, tym samym rośnie prawdopodobieństwo, że któryś z użytkowników Internetu postanowi włamać się do naszej sieci lokalnej. Bezpieczeństwo sieci komputerowych jest zagadnieniem ogromnym i nie widzę możliwości wyczerpania tutaj tego tematu. Zwłaszcza, że co dzień odkrywane są nowe sposoby włamania lub zakłócenia pracy systemów komputerowych. W tym rozdziale zajmę się sposobami kompleksowego zabezpieczenia sieci komputerowej za pomocą techniki filtrowania datagramów (firewalling) oraz tłumaczenia adresów sieciowych (NAT - masquerading). Pierwszym krokiem podczas rozpatrywania zagadnień bezpieczeństwa jest określenie potencjalnych "wrogów" i zorientowanie w metodach ich pracy.

Cele ataków włamywaczy.

Poniżej pokrótce omówię najczęściej stosowane sposoby ingerencji w pracę systemów sieciowych. Istnieją dwa cele ataków crackerów (włamywaczy komputerowych):

1.      Uzyskanie dostępu do systemu.

2.      Zdestabilizowanie pracy systemu komputerowego.

Pierwszy cel osiągany jest poprzez zdobycie nazwy użytkownika w systemie (login) i używanego przez niego hasła. Czasem odbywa się to poprzez wykorzystanie błędu w oprogramowaniu danej usługi sieciowej i zdobycie dostępu do systemu na prawach przyznanych tej usłudze. Zdobycie loginu nie jest trudne, najczęściej wystarczy zdobyć adres poczty elektronicznej (E-mail) danego użytkownika (czasem jest to tzw. alias, co utrudnia zadanie włamywaczowi).

Statystyki podają, że najczęściej użytkownicy sieci komputerowych stosują hasła łatwe do złamania za pomocą metody słownikowej (korzystając ze słownika zawierającego odpowiednią liczbę słów). Dekodowanie haseł metodą brute-force jest bardziej czasochłonne (statystycznie) i dzięki temu łatwiejsze do wykrycia. Polega ono na sprawdzaniu wszystkich możliwych kombinacji znaków mogących znaleźć się w haśle danego systemu operacyjnego. Dlatego należy dbać, aby hasła użytkowników były jak najbardziej skomplikowane, powinny zawierać przynajmniej duże i małe litery oraz cyfry.

Drugi cel ataków, osiągany jest przez crackerów dzięki wykorzystaniu błędów (bug) w oprogramowaniu serwerów usług Internetowych, czasem stosu TCP/IP. Tego typu działaniem jest ostatnio popularna metoda unieruchamianiu serwisów WWW. Polega ona na wysyłaniu olbrzymiej liczby zapytań do serwera WWW, który próbując je wszystkie obsłużyć zostaje zablokowany. Główną metodą zabezpieczeń przed tego typu "problemami" jest ciągła aktualizacja oprogramowania sieciowego oraz śledzenie stron zawierających gotowe oprogramowanie służące do takich działań. Jest to zadanie administratora sieci komputerowej i w zakresie jego obowiązków musi być czas przeznaczony na tego typu działania.

Metody włamań.

Starą metodą jest podstawienie programu, udającego program logujący do systemu. W ten sposób użytkownik podaje swoje hasło, a program włamywacza posiada hasło w postaci niezakodowanej. W przypadku systemu Windows 95 (98) zainstalowanie takiego programu, udającego przykładowo system potwierdzania hasła poczty elektronicznej, nie stanowi zbytniego problemu.

Następną metodą jest nasłuchiwanie (sniffing), polega ona na podłączeniu do sieci komputera z uruchomionym oprogramowaniem do ściągania wszystkich ramek Ethernetowych w danym segmencie sieci. W tym momencie cracker uzyskuje dostęp do wszystkich haseł, które transmitowane są otwartym tekstem po sieci (np. odczytywanie poczty za pomocą protokołu POP, transmisja plików protokołem FTP). Pod nazwą sniffing zaszeregowane są również metody podsłuchu transmisji w kablach sieciowych lub też transmisji w kablach monitorowych. Przykładowo: istnieją urządzenia umożliwiające oglądanie (oczywiście zaszumionego) obrazu wyświetlanego na monitorze znajdującym się kilkanaście metrów od nas, za kilkoma ścianami.

Znanym problemem są usługi umożliwiające zdalną pracę: rlogin, rsh, rcp, których system zabezpieczeń jest zupełnie niewystarczający. Aktualnie są coraz rzadziej stosowane i najczęściej nie wykorzystywane. Zastąpione zostały usługą bezpiecznego połączenia ssh (Secure Shell).

Niebezpieczna może być również usługa ftp. Niewłaściwie skonfigurowany serwer ftp, może umożliwić włamywaczowi uzyskanie ważnych informacji, przykładowo pliku zawierającego hasła.

Jedną z kategorii zagrożeń stanowią tzw. furtki (backdoors) lub włazy (trapdors) będące nieudokumentowanymi funkcjami aplikacji, pozostawionymi przez programistów. W systemie Linux, dzięki pełnej dostępności źródeł programów, bardzo szybko są wykrywane i usuwane tego typu problemy.

align="justify"Ponadto usługa smtp w implementacji wczesnych wersji programu sendmail okazała się niedostatecznie bezpieczna. Przykładowo przy odpowiednim przerobieniu przesyłki, interpretowana jest ona jako program wykonywalny i uruchamiana przez sendmaila.

Jednym z problemów może być wykorzystywanie przez administratorów serwerów WWW, skryptów CGI pochodzących z nieznanych źródeł. Dodatkowo korzystanie z usług WWW wymaga wiele ostrożności, ponieważ pojawia się bardzo dużo nowych technologii, których systemy zabezpieczeń nie są dobrze znane. Typowym przykładem jest technologia ActiveX wprowadzona przez firmę Microsoft, chociaż implementacja języka Java też nie jest wolna od błędów. Jednak znany jest fakt, że zastosowana w przeglądarce Netscape Communicator technologia Sand Box jest o wiele bezpieczniejsza od implementacji zabezpieczeń w Internet Explorerze.

Jedną z najgłośniejszych technik włamań było "podszywanie się" (spoofing). Polega ono na wysyłaniu datagramów IP z nieprawdziwym adresem źródłowym, przez co komputer je odbierający błędnie identyfikuje ich nadawcę. Zabezpieczenie przed ta metodą zostało wkompilowane w jądro rutera i jest uruchamiane zawsze przy starcie systemu.

Systemy Linuxowe są odporne na atak Ping of Death polegający na wysyłaniu dużych pakietów ICMP i przepełnianiu stosu TCP. Łatwo rozpoznać takie pakiety ICMP po fragmentacji, która została dokonana ze względu na rozmiar przekraczający MTU.

Teardrop i Bonk są metodami ataków (niebezpieczne głównie dla Windows NT) 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 datagramy z dużą liczbą fragmentów i mogą nie odebrać ich wszystkich. Linux jest pozbawiony tego problemu. Można filtrować takie fragmenty lub skompilować jądro rutera z opcją `IP: always defragment' ustawioną na `Y' (tylko gdy dany ruter jest jedyną możliwa drogą dotarcia takich pakietów).

Istnieje na pewno wiele innych metod i ciągle pojawiają się nowe. Jedynym sposobem zabezpieczenia jest nieustanne śledzenie grup dyskusyjnych zajmujących się zagadnieniami bezpieczeństwa i natychmiastowe reagowanie na każde nowe zagrożenie. Jest to zadanie każdego administratora sieci. Ponadto podstawą tworzenia polityki zabezpieczeń dla danej firmy jest prawidłowe skonfigurowanie firewalla, będącego aktualnie niezbędnym składnikiem systemu bezpieczeństwa.

Podczas projektowania bezpiecznej sieci komputerowej możemy wyróżnić trzy poziomy (strefy) dostępu z Internetu:

I.  Poziom zewnętrzny - sieć znajdująca się za firewallem z komputerami o adresach widocznych z Internetu. W tej sieci powinny znajdować się jedynie serwery świadczące usługi Internetowe.

II. Poziom wewnętrzny - podsieć z adresów nierutowalnych, mająca połączenie z Internetem za pomocą rutera z funkcjami firewalla i NAT (najczęściej masquerading). Tutaj powinny się znajdować komputery pracowników firmy.

III.Poziom izolowany - sieć bez rutingu do Internetu, tutaj powinny się znajdować serwery baz danych strategicznych dla firmy (kadry, płace, dane techniczne produkcji, biura projektowe itp.) i komputery pracowników korzystających z tych zasobów.

Rzadko istnieje możliwość wprowadzenia takiej modelowej struktury.

            Pomimo istnienia aż tylu różnych metod włamania się do systemów informatycznych, najczęściej powodem problemów jest po prostu błąd człowieka. Głośne są przypadki pozostawiania haseł dostępu do systemu przyklejonych pod klawiaturą, a czasem karteczką do monitora. Dla tego bardzo ważny jest poziom zrozumienia zasad bezpieczeństwa przez użytkowników systemu i ich przestrzeganie. Ustalenie takich zasad, przyjęcie metod ich egzekwowania, ustalenie i sztywne przestrzeganie poziomów dostępu do systemu oraz odpowiednie jego skonfigurowanie (konstrukcja sieci, firewall) tworzy politykę bezpieczeństwa firmy.

Firewall

Firewall - "ściana ogniowa" termin wzięty z konstrukcji samochodu, jest to element konstrukcji uniemożliwiający rozprzestrzenianie się ognia w czasie pożaru na kabinę pasażerów. W sieci komputerowej jego zadaniem jest zapewnienie bezpieczeństwa sieci w przypadku prób włamania. Można wyróżnić dwa ogólne typy firewalli.

Firewalle filtrujące IP - na podstawie adresów IP oraz numerów portów podejmują decyzje o zakwalifikowaniu danego datagramu jako bezpieczny. Firewalle filtrujące działają na poziomie pakietów IP. Są zaprojektowane do kontroli przepływu bazując na adresie źródłowym, docelowym, porcie i typie pakietu (zawartych w każdym z pakietów). Ten typ firewalli jest bardzo bezpieczny, ale nie daje kontroli nad użytkownikami. Można udostępnić usługę, ale nie da się otrzymać informacji identyfikujących konkretnego użytkownika z niej korzystającego, poza adresem IP komputera z którego przyszła transmisja.

Serwery połączeniowe (proxy) - wykonują połączenie sieciowe w zamian za komputer z sieci lokalnej. Serwery proxy pozwalają na niebezpośredni dostęp do Internetu. Dobrym przykładem jest serwer proxy usługi WWW. Gdy łączymy się z proxy-serwerem za pomocą oprogramowania klienckiego uruchamia on swojego klienta i dostarcza danych których zarządaliśmy. Ponieważ serwery proxy podwajają każde połączenie, możliwe jest zapisywanie (logowanie) każdego z nich. Serwery proxy są w pełni bezpieczne, gdyż nie dokonują bezpośredniego rutingu. Jedyną ich wadą są ogromne wymagania sprzętowe oraz pewien brak elastyczności. W momencie pojawienia się nowej usługi, z której użytkownicy sieci chcą skorzystać, musimy zainstalować dodatkowy program na serwerze zapewniający daną usługę.

Poniżej przedstawię dokładniejszy podział firewalli i ich cechy.

Tradycyjne proxy (Traditional proxies).

Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. Jedyną drogą połączenia się z Internetem, jest wywołanie firewalla, ponieważ jest on jedyną maszyną mogącą łączyć się równocześnie z obiema sieciami. Uruchamiamy jest na nim program zwany proxy, który tego dokonuje. Dla każdej usługi która ma być dostępna z Internetu, na firewallu musi być uruchomiony osobny program pośredniczący w jej świadczeniu.

Komputery w sieci wewnętrznej muszą być specjalnie skonfigurowane do uzyskania dostępu do wybranych usług. Przykładowo, aby ściągnąć stronę WWW, muszą połączyć się z firewallem na port 8080 i zażądać potrzebnej strony. W tym momencie uruchamia się odpowiedni program pośredniczący, ściąga potrzebne dane i przekazuje do odpowiedniego komputera w sieci lokalnej.

Przezroczyste proxy (Transparent proxies).

Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. Jedyną drogą połączenia się z Internetem, jest wywołanie firewalla, ponieważ jest on jedyną maszyną mogącą łączyć się równocześnie z obiema sieciami. Uruchamiamy na nim program zwany transparent proxy, który tego dokonuje. Jądro Linuksa kieruje pakiety do tego programu, zamiast wysłać je bezpośrednio do Internetu. Dla każdej usługi która ma być dostępna z Internetu, na firewallu musi być uruchomiony osobny program pośredniczący w świadczeniu  takiej usługi.

Przezroczyste proxy oznacza, że klient nie musi wiedzieć o użyciu oprogramowania typu proxy i nie musi być specjalnie konfigurowany. Przykładowo: firewall jest skonfigurowany do przekierowywania (za pomocą komendy ipchains) wszystkich połączeń do portu 80 na port 8080 na którym pracuje tranparent proxy. Przy próbie pobrania dowolnej strony WWW, transmisja przekierowywana jest na port 8080, a następnie wszystko odbywa się jak w poprzednim przykładzie.

Tłumaczenie adresów IP (NAT lub Masquerading).

Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu bez specjalnej obróbki i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. W tym przypadku używamy specjalnych funkcji jądra Linuksa.  Masquerading ma wydzielone moduły do radzenia sobie ze skomplikowanymi protokołami jak FTP, RealAudio, Quake, itp.

Sieć publiczna.

W tym przypadku, nasza sieć jest częścią Internetu, pakiety mogą poruszać się bez zmian poprzez obie sieci. Filtrowanie pakietów jest użyte aby ograniczyć dostęp z Internetu tylko do naszych wewnętrznych serwerów i uniemożliwić dostęp do komputerów użytkowników. Ten typ firewalla ma najmniejsze możliwości kontroli i autoryzacji dostępu, ale jest równocześnie najbardziej elastyczny i wprowadza najmniej ograniczeń dla użytkowników z sieci wewnętrznej.

Obsługa filtrowania pakietów przez jądro Linuksa

Komenda ipchains jest linuksową komendą używaną do konfiguracji reguł firewalla i tłumaczenia adresów IP (NAT). Zastąpiła ona starszą ipfwadm. Aby móc wykorzystać komputer z systemem operacyjnym Linux do filtrowania pakietów należy skompilować jądro systemu z opcjami (dla jądra z serii 2.1 lub 2.2):

CONFIG_FIREWALL = y

CONFIG_IP_FIREWALL = y

W nowszych jądrach mogą to być inne parametry konfiguracyjne. Aby stwierdzić czy jądro ma prawidłowo wkompilowaną obsługę filtrowania datagramów, należy sprawdzić czy w katalogu /proc/net/ istnieje plik ip_fwchains, zawierający konfigurację reguł ipchains.

Przy konfigurowaniu firewalla za pomocą komendy ipchains, podstawowym pojęciem jest łańcuch (chain). Łańcuch jest to zbiór reguł filtrujących. Istnieją trzy standardowe łańcuchy: input, forward i output, ponadto użytkownik może tworzyć własne łańcuchy.

Algorytm podejmowania decyzji o losie datagramu.

 

Rys.  Algorytm przechodzenia pakietów przez system.

Droga datagramów IP poprzez firewall jest bardzo skomplikowana. Najważniejsze etapy zostały zaznaczone pogrubioną czcionką na powyższym schemacie.

Najpierw sprawdzana jest suma kontrolna datagramów (checksum), następnie testowane są one pod kątem deformacji (sanity). Później pakiety przechodzą przez łańcuch wejściowy (input chain) i jeśli trzeba podlegają procesowi NAT (demasquerade), czyli adres rutera usuwany jest z pola "adres docelowy" i zastępowany adresem IP komputera w sieci prywatnej. Dalej na podstawie tablicy rutingu (routing decision) lub protokołu rutującego podejmowana jest decyzja o dalszym losie pakietu. Procesy lokalne (local process) mogą odbierać pakiety po etapie rutowania i wysyłać pakiety poprzez etap rutowania i łańcuch wyjściowy (output chain). Jeśli pakiety nie są utworzone przez procesy lokalne, są sprawdzane w łańcuchu przejściowym (forward chain). Jeśli pakiety od procesów lokalnych są przekazywane do  lokalnego komputera (localhosta) przechodzą przez łańcuch wyjściowy (output chains) do interfejsu lo (lo interface - loopback). Wszystkie pakiety wydostające się z komputera muszą przejść przez łańcuch wyjściowy (output chain).

Składnia polecenia ipchains

Pokrótce przedstawię podstawową składnię polecenia ipchains. Skupię się na opcjach użytych w plikach konfiguracyjnych na ruterze. Dokładny opis pozostałych opcji znajduje się w publikacji Ipchains_HOWTO

Po poleceniu ipchains następuje opcja określająca działanie całej komendy.

-F        (Flush) - usuwa wpisy z wymienionego później łańcucha.

-A        (Append) dodaje nową regułę do łańcucha.

-I         (Insert) wstawia nową regułę do łańcucha na podane miejsce.

-D        (Delete) usuwa regułę z łańcucha.

Następnie występują wpisy określające źródło i cel transmisji

-s         (source) źródło.

-d         (destination) cel.

Adresy mogą być podawane jako nr IP lub nazwa oraz jako zakresy, np.:

199.95.207.0/24

199.95.207.0/255.255.255.0 

Większość opcji umożliwia operację negacji logicznej np.: "-s ! localhost" oznacza wszystkie hosty poza lokalnym.

Protokół może być podawany jako numer lub nazwa (tcp, udp, icmp), nie jest ważne czy małe czy też duże litery.

            -p udp

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

Określamy interfejs sieciowy, którego dotyczy reguła.

-i eth0

-i eth+               oznacza wszystkie interfejsy zaczynające się na eth.

Logowanie pakietów, flaga -l   .

Flaga -j specyfikuje co wykonać z pakietem pasującym do reguły. Jeśli nie ma tej flagi, to reguła jest używana do prostego zliczania pakietów ją spełniających. 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 NAT (jądro musi być skompilowane z IP Masquerading enabled). Prawidłowe jedynie dla łańcucha forward.

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ć podany po REDIRECT co przesyła pakiety na konkretny port. To działanie jest prawidłowe tyko dla łańcucha input (wejściowego).

RETURN        - jest identyczny z natychmiastowym osiągnięciem końca łańcucha.

Ustalamy politykę dla łańcucha. Polityka określa co należy zrobić z pakietem nie pasującym do żadnej z reguł.

ipchains -P input DENY

Poniżej znajdziecie gotowy do użycia skrypt do konfiguracji firewalla. W chwili obecnej zawiera on komentarze w języku angielskim:

#!/bin/sh

# ----------------------------------------------------------------------------
# Copyright (C) 1997, 1998, 1999, 2000 Robert L. Ziegler
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for educational, research, private and non-profit purposes,
# without fee, and without a written agreement is hereby granted.
# This software is provided as an example and basis for individual firewall
# development. This software is provided without warranty.
#
# Any material furnished by Robert L. Ziegler is furnished on an
# "as is" basis. He makes no warranties of any kind, either expressed
# or implied as to any matter including, but not limited to, warranty
# of fitness for a particular purpose, exclusivity or results obtained
# from use of the material.
# ----------------------------------------------------------------------------

# /etc/rc.d/rc.firewall
# Invoked from /etc/ppp/ip-up, or
# from /sbin/ifup-local, or
# from /etc/sysconfig/network-scripts/ifup-post.
# from /etc/rc.d/rc.local.

echo "Starting firewalling... "

# ----------------------------------------------------------------------------
# Some definitions for easy maintenance.
# EDIT THESE TO SUIT YOUR SYSTEM AND ISP.

EXTERNAL_INTERFACE="ppp0"        # Internet connected interface
LOOPBACK_INTERFACE="lo"             # or your local naming convention
LOCAL_INTERFACE_1="eth0"        # internal LAN interface

IPADDR="0.0.0.0"             # your IP address
LOCALNET_1="192.168.1.0/24"        # whatever private range you use

ANYWHERE="any/0"             # match any IP address

NAMESERVER_1="any/0"             # everyone must have at least one

WEB_PROXY_SERVER="0.0.0.0" # ISP web proxy server, if any
WEB_PROXY_PORT="8080"             # ISP web proxy port, if any
WEB_PROXY_PORT="3130"             # typically 8008 or 8080

POP_SERVER="your.serwer"

LOOPBACK="127.0.0.0/8"             # reserved loopback address range
CLASS_A="10.0.0.0/8"             # class A private networks
CLASS_B="172.16.0.0/12"             # class B private networks
CLASS_C="192.168.0.0/16"        # class C private networks
BROADCAST_SRC="0.0.0.0"             # broadcast source address
BROADCAST_DEST="255.255.255.255"    # broadcast destination address
PRIVPORTS="0:1023"             # well known, privileged port range
UNPRIVPORTS="1024:65535"        # unprivileged port range

# ----------------------------------------------------------------------------

NFS_PORT="2049"                 # (TCP/UDP) NFS
SOCKS_PORT="1080"             # (TCP) Socks
OPENWINDOWS_PORT="2000"             # (TCP) openwindows

# X Windows port allocation begins at 6000 and increments to 6063
# for each additional server running.
XWINDOW_PORTS="6000:6063"        # (TCP) X windows

# The SSH client starts at 1023 and works down to 513 for each
# additional simultaneous connection originating from a privileged port.
# Clients can optionally be configured to use only unprivileged ports.
SSH_LOCAL_PORTS="1022:65535"        # port range for local clients
SSH_REMOTE_PORTS="513:65535"        # port range for remote clients

# traceroute usually uses -S 32769:65535 -D 33434:33523
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"

# ----------------------------------------------------------------------------
# Default policy is DENY
# Explicitly accept desired INCOMING & OUTGOING connections

# Remove all existing rules belonging to this filter
ipchains -F

# Set the default policy of the filter to deny.
ipchains -P input DENY
ipchains -P output REJECT
ipchains -P forward DENY

# set masquerade timeout to 10 hours for tcp connections
ipchains -M -S 360000 0 0


# ----------------------------------------------------------------------------

# Enable IP Forwarding, if it isn't already
echo 1 > /proc/sys/net/ipv4/ip_forward

# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Enable always defragging Protection
echo 1 > /proc/sys/net/ipv4/ip_always_defrag

# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Enable bad error message Protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Enable IP spoofing protection
# turn on Source Address Verification
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done

# Disable ICMP Redirect Acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done

for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f
done

# Disable Source Routed Packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done

# Log Spoofed Packets, Source Routed Packets, Redirect Packets
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f
done

# These modules are necessary to masquerade their respective services.
/sbin/modprobe ip_masq_autofw
/sbin/modprobe ip_masq_cuseeme
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_mfw
/sbin/modprobe ip_masq_portfw
/sbin/modprobe ip_masq_quake
/sbin/modprobe ip_masq_raudio ports=554,7070,7071,6970,6971
/sbin/modprobe ip_masq_user
/sbin/modprobe ip_masq_vdolive

# ----------------------------------------------------------------------------
# LOOPBACK

# Unlimited traffic on the loopback interface.

ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT
ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT

# ----------------------------------------------------------------------------
# Unlimited traffic within the local network.

# All internal machines have access to the firewall machine.

ipchains -A input -i $LOCAL_INTERFACE_1 -s $LOCALNET_1 -j ACCEPT
ipchains -A output -i $LOCAL_INTERFACE_1 -d $LOCALNET_1 -j ACCEPT

# ----------------------------------------------------------------------------
# Masquerade internal traffic.

# All internal traffic is masqueraded externally.
ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQ

# ----------------------------------------------------------------------------
# SPOOFING & BAD ADDRESSES
# Refuse spoofed packets.
# Ignore blatantly illegal source addresses.
# Protect yourself from sending to bad addresses.

# Refuse incoming packets pretending to be from the external address.
ipchains -A input -s $IPADDR -j DENY -l

# ----------------------------------------------------------------------------
# NOTE:
# The symbolic names used in /etc/services for the port numbers vary by
# supplier. Using them is less error prone and more meaningful, though.

# ----------------------------------------------------------------------------
# TCP UNPRIVILEGED PORTS
# Avoid ports subject to protocol & system administration problems.

# NFS: establishing a TCP connection
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $NFS_PORT -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $NFS_PORT -j REJECT

# openwindows: establishing a connection
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $OPENWINDOWS_PORT -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $OPENWINDOWS_PORT -j REJECT


# Xwindows: establishing a connection
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $XWINDOW_PORTS -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $XWINDOW_PORTS -j REJECT

# SOCKS: establishing a connection
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $SOCKS_PORT -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -y \
--destination-port $SOCKS_PORT -j REJECT

# ----------------------------------------------------------------------------
# UDP UNPRIVILEGED PORTS
# Avoid ports subject to protocol & system administration problems.

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--destination-port $NFS_PORT -j DENY -l

# UDP INCOMING TRACEROUTE
# traceroute usually uses -S 32769:65535 -D 33434:33523

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--source-port $TRACEROUTE_SRC_PORTS \
--destination-port $TRACEROUTE_DEST_PORTS -j DENY -l

# ----------------------------------------------------------------------------

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-d $IPADDR -j ACCEPT

# ------------------------------------------------------------------

# DNS client (53)
# ---------------
ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR $UNPRIVPORTS \
-d $NAMESERVER_1 53 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
-s $NAMESERVER_1 53 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT


ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $NAMESERVER_1 53 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $NAMESERVER_1 53 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT


# DNS server modes (53)
# ---------------------

# DNS caching & forwarding nameserver
# -----------------------------------

# server to server query or response
# Caching only name server uses UDP, not TCP

ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR 53 \
-d $NAMESERVER_1 53 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
-s $NAMESERVER_1 53 \
-d $IPADDR 53 -j ACCEPT


# ------------------------------------------------------------------

# HTTP server (80)
# ----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $UNPRIVPORTS \
-d $IPADDR 80 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 80 \
--destination-port $UNPRIVPORTS -j ACCEPT


# HTTP client (80)
# ----------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 80 -j ACCEPT

# -------------------------------------------------------------------

# HTTPS server (443)
# ------------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $UNPRIVPORTS \
-d $IPADDR 443 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 443 \
--destination-port $UNPRIVPORTS -j ACCEPT


# HTTPS client (443)
# ------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 443 -j ACCEPT

# --------------------------------------------------------------------

# HTTP Proxy client (8008/8080)
# -----------------------------

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $WEB_PROXY_SERVER $WEB_PROXY_PORT -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $WEB_PROXY_SERVER $WEB_PROXY_PORT \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $WEB_PROXY_SERVER $WEB_PROXY_PORT1 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $WEB_PROXY_SERVER $WEB_PROXY_PORT1 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

# ------------------------------------------------------------------

# POP server (110)
# ----------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $UNPRIVPORTS \
-d $IPADDR 110 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 110 \
--destination-port $UNPRIVPORTS -j ACCEPT

# --------------------------------------------------------------------

# POP (110) - Retrieving Mail as a POP Client
# -------------------------------------------

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $ANYWHERE 110 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $ANYWHERE 110 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT


# --------------------------------------------------------------------

# SMTP client to an ISP account without a local server
# Sending Mail through a local SMTP server

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $ANYWHERE 25 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $ANYWHERE 25 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

# ------------------------------------------------------------------

# Receiving Mail as a Local SMTP server (25)
# ------------------------------------------

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
-s $ANYWHERE $UNPRIVPORTS \
-d $IPADDR 25 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 25 \
-d $ANYWHERE $UNPRIVPORTS -j ACCEPT


# --------------------------------------------------------------------

# IMAP (143) - Retrieving Mail as an IMAP Client
# ----------------------------------------------

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $ANYWHERE 143 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $ANYWHERE 143 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

# --------------------------------------------------------------------

# NNTP (119) - Reading and Posting News as a Usenet Client
# --------------------------------------------------------

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $ANYWHERE 119 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $ANYWHERE 119 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT


# ------------------------------------------------------------------

# SSH server (22)
# ---------------
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $SSH_REMOTE_PORTS \
-d $IPADDR 22 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 22 \
--destination-port $SSH_REMOTE_PORTS -j ACCEPT


# SSH client (22)
# ---------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $SSH_LOCAL_PORTS \
--destination-port 22 -j ACCEPT

# ------------------------------------------------------------------

# TELNET client (23)
# ------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 23 -j ACCEPT

# --------------------------------------------------------------------

# AUTH (113) - Allowing Your Outgoing AUTH Requests as a Client
# -------------------------------------------------------------

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
-d $ANYWHERE 113 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $ANYWHERE 113 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

# ------------------------------------------------------------------

# AUTH server (113)
# -----------------

# Accept incoming connections to identd but disable in.identd in inetd.conf.
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $UNPRIVPORTS \
-d $IPADDR 113 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 113 \
--destination-port $UNPRIVPORTS -j ACCEPT


# AUTH client (113)
# -----------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 113 -j ACCEPT

# ------------------------------------------------------------------

# WHOIS client (43)
# -----------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 43 -j ACCEPT

# ------------------------------------------------------------------

# FINGER client (79)
# ------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 79 -j ACCEPT

# ------------------------------------------------------------------

# FTP server (21)
# ---------------

# incoming request
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port $UNPRIVPORTS \
-d $IPADDR 21 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR 21 \
--destination-port $UNPRIVPORTS -j ACCEPT


# PORT MODE data channel responses
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR 20 \
--destination-port $UNPRIVPORTS -j ACCEPT


# FTP client (21)
# ---------------

# outgoing request
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 21 -j ACCEPT


# PORT mode data channel
ipchains -A input -i $EXTERNAL_INTERFACE -p tcp \
--source-port 20 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y \
-s $IPADDR $UNPRIVPORTS \
--destination-port 20 -j ACCEPT

# ------------------------------------------------------------------

# IRC client (6667)
# -----------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 6667 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port $UNPRIVPORTS -j ACCEPT

# ------------------------------------------------------------------

# RealAudio / QuickTime client
# ----------------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 554 -j ACCEPT

# TCP is a more secure method: 7070:7071

ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 7070:7071 -j ACCEPT

# UDP is the preferred method: 6970:6999
# For LAN machines, UDP requires the RealAudio masquerading module and
# the ipmasqadm third-party software.

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--source-port $UNPRIVPORTS \
-d $IPADDR 6970:6999 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR 6970:6999 \
--destination-port $UNPRIVPORTS -j ACCEPT

# ------------------------------------------------------------------

# ICQ client (4000)
# -----------------
ipchains -A output -i $EXTERNAL_INTERFACE -p tcp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 2000:4000 -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR $UNPRIVPORTS \
--destination-port 4000 -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--source-port 4000 \
-d $IPADDR $UNPRIVPORTS -j ACCEPT

# ----------------------------------------------------------------------------
# UDP accept only on selected ports
# ---------------------------------

# ------------------------------------------------------------------

# OUTGOING TRACEROUTE
# -------------------
ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR $TRACEROUTE_SRC_PORTS \
--destination-port $TRACEROUTE_DEST_PORTS -j ACCEPT -l

# ----------------------------------------------------------------------------
# ICMP

# To prevent denial of service attacks based on ICMP bombs, filter
# incoming Redirect (5) and outgoing Destination Unreachable (3).
# Note, however, disabling Destination Unreachable (3) is not
# advisable, as it is used to negotiate packet fragment size.

# For bi-directional ping.
# Message Types: Echo_Reply (0), Echo_Request (8)
# To prevent attacks, limit the src addresses to your ISP range.
#
# For outgoing traceroute.
# Message Types: INCOMING Dest_Unreachable (3), Time_Exceeded (11)
# default UDP base: 33434 to base+nhops-1
#
# For incoming traceroute.
# Message Types: OUTGOING Dest_Unreachable (3), Time_Exceeded (11)
# To block this, deny OUTGOING 3 and 11

# 0: echo-reply (pong)
# 3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
# 4: source-quench
# 5: redirect
# 8: echo-request (ping)
# 11: time-exceeded
# 12: parameter-problem

ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type echo-reply \
-d $IPADDR -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type destination-unreachable \
-d $IPADDR -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type source-quench \
-d $IPADDR -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type time-exceeded \
-d $IPADDR -j ACCEPT

ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type parameter-problem \
-d $IPADDR -j ACCEPT


ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
-s $IPADDR fragmentation-needed -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
-s $IPADDR source-quench -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
-s $IPADDR echo-request -j ACCEPT

ipchains -A output -i $EXTERNAL_INTERFACE -p icmp \
-s $IPADDR parameter-problem -j ACCEPT

# ----------------------------------------------------------------------------
# Enable logging for selected denied packets

ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -j DENY -l

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--destination-port $PRIVPORTS -j DENY -l

ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
--destination-port $UNPRIVPORTS -j DENY -l


ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 5 -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -p icmp \
--icmp-type 13:255 -j DENY -l

ipchains -A output -i $EXTERNAL_INTERFACE -j REJECT -l

# ----------------------------------------------------------------------------

echo "done"

exit 0

Artykuł napisany na podstawie pracy Karola Krysiaka
Oryginalna wersja dokumentu znajduje się
pod adresem http://www.net.w.pl
Objęta jest ona następującymi Prawami autorskimi


linia_1.gif (306 bytes)

Aktualności | Linux / Unix

.

Copyright (c) 1999-2000 by DREAM N-E-T-W-O-R-K