FIREWALLy

Pavel Možný, xmozny@fi.muni.cz


Obsah


ÚVOD

Firewall je struktura, která od sebe odděluje dvě prostředí. Internetový firewall odděluje Internet od lokální (LAN) sítě, nebo naopak zabraňuje uživatelům lokální sítě k přístupu do Internetu. První počítačový firewall byl UNIXový počítač se dvěmi síťovými kartami, z nichž jedna byla zapojena do Internetu a druhá do lokální sítě. Při přísrupu do Internetu z lokální sítě se uživatel musel nejprve přihlásit na firewall (UNIXový server) a potom z něho do Internetu. Firewally se používají ke dvěma účelům: a) udržet osoby vně (např. hackery) b) udržet osoby uvnitř (zaměstnanci) K těmto účelům lze použít dvou nástrojů: 1) paketový filtr 2) proxy server

FIREWALL - PAKETOVÝ FILTR

Tento typ firewallu je přímo zabudován v jádru linuxu. Pracují na síťové úrovni tak, že data mohou opustit nebo přijít do systému pouze když to dovolí pravidla firewalu. To zanamená, že každý přijatý paket se filtruje podle typu, zdrojové adresy, cílové adresy atd., a podle toho jestli vyhovuje nebo nevyhovuje je poslán dále do systému nebo odmítnut. Paketové filtry neposkytují žádnou kontrolu na základě hesla. Uživatel tedy nemá takřka žádnou identitu. Jedinou identitou je IP adresa pracovní stanice. Tato skutečnost může činit problémy při používání DHCP, což je dynamické přidělování IP adres.

PROXY SERVERY

Proxy servery se častěji používají k řízení a monitorování provozu na síti. Některé aplikační proxy umožňují uživateli požadovaná data uchovávat ve vlastní cache a tím zrychlit opakovaný přístup k těmto datům. Rozlišujeme dva základní typy proxy serverů:
a) Aplikační proxy
b) SOCKS proxy

APLIKAČNÍ PROXY

Funkci aplikačního proxy serveru si lze nejlépe představit na situaci, kdy uživatel vnitřní sítě chce uskutečnit např. telnetové spojení na vzdálený stroj v internetu (mimo vnitřní síť). Komunikace probíhá následovně: pokud uživatel spustí telnet na počítač umístěný mimo lokální síť, tak klient uskutečňující spojení se nejprve spojí s proxy serverem, ten se spojí s požadovaným strojem v Internetu. Nakonec proxy server pošle uživateli data získaná od vzdáleného stroje.

SOCKS PROXY

SOCKS proxy je v podstatě přepínač, který přepíná spojení ze systému (vnitřní sítě) mezi nějakým jiným spojením v vnější sítě. Většina SOCKS serverů pracuje pouze nad TCP spojením.


NASTAVENÍ PAKETOVÉHO FILTRU NA LINUXU

Pro vytvoření paketového filtru na Linuxu není zapotřebí žádný zvláštní software, stačí na to pouze standardní distribuce Linuxu např. RedHat. Pokud bychom chtěli nainstalovat proxy server, budeme potřebovat jeden z následujících baliků:
1. Squid
2. TIS Firewall Toolkit (FWTK)
3. SOCKS

PŘÍPRAVA SYSTÉMU

Protože většina distribucí Linuxu je dodávána s přeloženým jádrem, které nevyhovuje přesně našim účelům, je dobré si jádro přeložit znovu s konfigurací odpovídající našim potřebám. Co se týká verze jádra, je dobré si vybrat verzi stabilní :) a tak 2.2.x. Nyní si ukáže část konfigurace, která se týká sítě, jak nakonfigurovat ostatní se dočtete http://docs.linux.cz/HOWTO/Kernel-HOWTO.html.

    <*> Packet socket
    [ ] Kernel/User netlink socket
    [*] Network firewalls
    [ ] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [ ] IP: multicasting
    [*] IP: advanced router
    [ ] IP: kernel level autoconfiguration
    [*] IP: firewalling
    [?] IP: always defragment (required for masquerading)
    [?] IP: transparent proxy support
    [?] IP: masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [?] IP: ICMP masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [ ] IP: masquerading special modules support
    [*] IP: optimize as router not host
    < > IP: tunneling
    < > IP: GRE tunnels over IP
    [?] IP: aliasing support
    [*] IP: TCP syncookie support (not enabled per default)
    --- (it is safe to leave these untouched)
    < > IP: Reverse ARP
    [*] IP: Allow large windows (not recommended if <16Mb of memory)
    < > The IPv6 protocol (EXPERIMENTAL)
    ---
    < > The IPX protocol
    < > Appletalk DDP
    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] Bridging (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)
    < > Acorn Econet/AUN protocols (EXPERIMENTAL)
    < > WAN router
    [ ] Fast switching (read help!)
    [ ] Forwarding between high speed interfaces
    [ ] PU is too slow to handle full bandwidth
    QoS and/or fair queueing  --->
Pokud máme konfiguraci uloženou musíme jádro přeložit (jak viz. výše uvedené HOWTO) a restartovat systém.

KONFIGURACE SÍŤOVÝCH ADRES

Naším cílem je poskytnout dvě spojení na firewall. Jedno zvenku z Internetu a druhé z vnitřní sítě. To znamená, že ve vnitřní síti musíme definovat nějaký systém IP adres. Pokud nechceme, aby uživatelé z Internetu měli přístup do vnitřní sítě, nemusíme používat "reálné" IP adresy. Stačí, když si vytvoříme vlastní systém IP adres, který bude platný pouze pro vnitřní síť. Např 192.168.1.xxx. Situace pak může vypadat následovně:

            24.94.1.123  __________    192.168.1.1
      _/\__/\_        \ |          | /           _______________
     |        |        \| Firewall |/           |               |
    / Internet \--------|  System  |------------| Workstation/s |
    \_  _  _  _/        |__________|            |_______________|
      \/ \/ \/
kde ovšem 24.94.1.123 musí být platná IP adresa v Internetu. Většinou ji pevně přidělí náš poskytovatel (je to tzv. statická IP adresa). Jelikož potřebujeme dvě IP adresy na jednom stroji, musíme tedy mít buď dva síťové adaptéry nebo jeden a vytvořit na něj IP alias. Druhému síťovému adaptéru nastavíme IP adresu 192.168.1.1 (jak uvidíme později). Ostatním stanicím v lokální síti můžeme přiřadit adresy v rozsahu 192.168.1.2-254. Pokud používáme distribuci RedHat Linux, tak síťové adaptéry nakonfigurujeme pomocí skriptu ifcfg-... umístěného v adresáři /etc/sysconfig/network-scripts. Používají se pro nastavení sítě při startu systému. Jako příklad můžeme uvést soubor ifcfg-eth1:

DEVICE=eth1
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=24.94.1.123
ONBOOT=yes


TEST KONFIGURACE SÍTĚ

Konfiguraci sítě zjistíme spuštěním příkazu ifconfig. Jeho výstup může vypadat např. takto:

  #ifconfig
  lo        Link encap:Local Loopback
            inet addr:127.0.0.1  Mask:255.0.0.0
            UP LOOPBACK RUNNING  MTU:3924  Metric:1
            RX packets:1620 errors:0 dropped:0 overruns:0
            TX packets:1620 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0

  eth0      Link encap:10Mbps Ethernet  HWaddr 00:00:09:85:AC:55
            inet addr:24.94.1.123 Bcast:24.94.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1000 errors:0 dropped:0 overruns:0
            TX packets:1100 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:12 Base address:0x310

  eth1      Link encap:10Mbps Ethernet  HWaddr 00:00:09:80:1E:D7
            inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1110 errors:0 dropped:0 overruns:0
            TX packets:1111 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:15 Base address:0x350
a routing tabulku zobrazí příkaz route -n. Ta by mela vypadat následovně:

  #route -n
  Kernel routing table
  Destination     Gateway         Genmask         Flags MSS    Window Use Iface
  24.94.1.0       *               255.255.255.0   U     1500   0       15 eth0
  192.168.1.0     *               255.255.255.0   U     1500   0        0 eth1
  127.0.0.0       *               255.0.0.0       U     3584   0        2 lo
  default         24.94.1.123     *               UG    1500   0       72 eth0
Nyní můžeme vyzkoušet, jestli je z libovolné pracovní stanice dostupná vnitřní adresa firewallu (pomocí příkazu ping) a zda je z firewallu dostupná libovolná adresa v Internetu. Pokud neco nefunguje, bude nejspíše chyba někde v nastavení sítě a je třeba konfiguraci překontrolovat. (Pomůže Network-HOWTO). Abychom zjistili, zda jádro filtruje pakety musíme zkusit, zda je dostupná vnější adresa firewallu z nějaké pracovní stanice vnitřní sítě. Pokud není je vše v pořádku. Pokud je, tak je nejspíše zapnutý IP forwarding nebo masquarade a nebo je už nastaven nějaky paketový filtr. Je potřeba výše uvedené vypnout a zkusit to znovu. Nyní můžeme přistoupit k samotné konfiguraci paktetového filtru pomocí IPChains.

NASTAVENÍ PAKETOVÉHO FILTRU - IPChains

JAK PAKETY PROCHÁZÍ FILTREM?
Jádro začíná pracovat se třemi sadami pravidel, které se nazývají input chain, output chain a forward chain. Při příchodu paketu jádro použije input chain, aby zjistilo co s ním. Pokud paket tento krok přežije, jádro rozhodne kam s ním dál. Pokud je adresovaán jinému stroji, musí projít přes forward chain. Před tím, než paket odejde pryč, musí projít přes output chain. Chain je seznam pravidel, kde každé pravidlo říká:"pokud hlavička paketu vypadá takto, tak s paketem udělej následující." Pokud paket neodpovídá nějakému pravidlu, tak se vyzkouší pravidlo následující. Pokud paket neodpovídá žádnému pravidlu, pak musí jádro určit co s ním. Většinou ho odmítne nebo vrátí. Následují schéma ukazuje celou cestu paketu.

        ----------------------------------------------------------------
        |            ACCEPT/                              lo interface |
        v           REDIRECT                  _______                  |
--> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
    h     a    |input |    e    {Routing }   |Chain  |     |output |ACCEPT
    e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
    c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
    k     t       |        s       |             |     | |     |
    s     y       |        q       |             v     | |     |
    u     |       v        e       v            DENY/  | |     v
    m     |     DENY/      r   Local Process   REJECT  | |   DENY/
    |     v    REJECT      a       |                   | |  REJECT
    |   DENY               d       --------------------- |
    v                      e -----------------------------
   DENY
Následuje popis jednotlivých částí:

Checksum:

Testuje, zda paket nebyl nejakým způsobem poškozen. Pokud ano je odmítnut.

Sanity:

Přídavná kontrola před vstupním řetězem, aby se zabránilo průchodu některých deformovaných paketů, které mohou vyhovovat pravidlům vstupního řetězu.

input chain:

Toto je první firewall chain, kterým je paket testován. Pokud výsledek není DENY nebo REJECT, paket pokračuje dál.

Demasquerade:

Pokud je použita masquarade, paket se "odmaskuje" a je poslán přímo dooutput chainu.

Routing decision:

Místo, kde se rozhoduje, zda se paket pošle lokálnímu procesu, nebo jinému (vzdálenému) stroji.

Local process:

Představuje lokální proces, který může příjmat a posílat pakety.

lo interface:

Jestliže je paket vytvořen lokálním procesem a je určen pro lokální proces, odchází přes output chain na lokalní zařízeni - "lo interface" a přichází na vstup input chainu.

local:

Pokud byl paket vytvořen lokálním procesem, tak se zkontroluje proti forward chainu, jinak se postoupí dále.

forward chain:

Pokud paket pouze přes náš stroj prochází, je určen pro jiný počítač, tak se prochází tento řeťez.

output chain:

Než jsou pakety odeslány, tak se prochází tento řeťez.

Program je umístěn v adresáři /sbin a dále si popíšeme jeho parametry.

Operace s chainy:
a) vytvoř nový chain -N
b) smaž prázdný chain -X
c) změň politiku vestavěného chainu -P
d) výpis pravidel v chainu -L
e) zrušení pravidel v chainu -F

Operace nad pravidly v chainu:
a) připoj nové pravidlo -A
b) vlož nové pravidlo na danou pozici -I
c) přepiš pravidlo na dané pozici -R
d) smaž pravidlo na dané pozici -D

Na závěr si ukážeme příklad skriptu, který nastaví IPChains firewall.

#!/bin/sh
#
# rc.firewall
#
## Flush everything, start from scratch
  /sbin/ipchains -F input
  /sbin/ipchains -F output
  /sbin/ipchains -F forward

## Redirect for HTTP Transparent Proxy
  #$IPCHAINS  -A input -p tcp -s 192.1.2.0/24 -d 0.0.0.0/0 80 -j REDIRECT 8080

## Create your own chain
  /sbin/ipchains -N my-chain
  # Allow email to got to the server
  /sbin/ipchains -A my-chain -s 0.0.0.0/0 smtp -d 192.1.2.10 1024:-j ACCEPT
  # Allow email connections to outside email servers
  /sbin/ipchains -A my-chain -s 192.1.2.10 -d 0.0.0.0/0 smtp -j ACCEPT  
  # Allow Web connections to your Web Server
  /sbin/ipchains -A my-chain -s 0.0.0.0/0 www -d 192.1.2.11 1024: -j ACCEPT
  # Allow Web connections to outside Web Server
  /sbin/ipchains -A my-chain -s 192.1.2.0/24 1024: -d 0.0.0.0/0 www -j ACCEPT
  # Allow DNS traffic
  /sbin/ipchains -A my-chain -p UDP -s 0.0.0.0/0 dns -d 192.1.2.0/24 -j ACCEPT

## If you are using masquerading
  # don't masq internal-internal traffic
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 192.1.2.0/24 -j ACCEPT
  # don't masq external interface direct
  /sbin/ipchains -A forward -s 24.94.1.0/24 -d 0.0.0.0/0 -j ACCEPT
  # masquerade all internal IP's going outside
  /sbin/ipchains -A forward -s 192.1.2.0/24 -d 0.0.0.0/0 -j MASQ

## Deny everything else
  /sbin/ipchains -P my-chain input DENY
Podrobné informace o konfiguraci IPChains lze najít na adrese http://dosc.linux.cz/HOWTO/IPChains-HOWTO.html.

POZN:U starších verzí jádra se používala technika IPFWADM, kterou zde nebudeme zmiňovat.


NAT - Network Addres Translation

NAT je systém, který uchovává skupinu platných IP adres v Internetu, které lze používat. Jakmile se chce někdo přihlásit do Internetu z vnitřní sítě, tak NAT k privátní IP adrese přiřadí IP adresu platnou v Internetu. Od této chvíle je veškerý provoz na VEŘEJNÉ IP adrese předáván na PRIVÁTNÍ IP adresu. Po určité, předem stanoveném, čase nepoužívání se VEŘEJNÁ IP adresa uvolní a NAT ji má opět k dispozici.

Hlavní nevýhodou systému NAT je, že jakmile jsou obsazeny všechny veřejné IP adresy (IP adresy v Internetu), tak ostatní uživatelé, kteří chtějí vstoupit do Internetu, musí čekat, dokus se některá adresa neuvolní.

Pokud chceme NAT používat, je zapotřebí si stáhnout z adresy http://www.suse.de/~mha/HyperNews/get/linux-ip-nat.html balík např. nat-current.tar.gz, přeložit jej a nainstalovat. Pokud jsme ta učinili, tak můžeme přidávat pravidla pro převod adres takto:

ipnatadm -O -i -b -S 1.1.1.1/32 -M 134.109.192.223/32

což znamená, že NAT přeloží u odchozích paketů adresu 1.1.1.1 na adresu 134.109.192.223 a obráceně u příchozích paketů.


POUŽITÁ LITERATURA:Firewall-HOWTO.html, IPCHAINS-HOWTO.html, IP-Masquerade-HOWTO.html, http://www.suse.de/~mha/linux-ip-nat/diplom/