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
|