Rozšírenie firewallu
Linuxový firewall netfilter je integrovaný priamo do jadra. Na jeho ovládanie slúži nástroj iptables. Ale to sú veci vo svete Linuxe všeobecne známe. Oficiálnu implementáciu firewallu v jadre je možné doplniť o niekoľko vcelku zaujímavých vecí, ktoré rozširujú možnosti tohoto i tak veľmi užitočného nástroja. Môj hlavný cieľ bol doplniť rozpoznávanie protokolov 7. vrstvy OSI a niektoré ďalšie rozšírenia.
Rozhodol som sa rozšírenia doplniť do distribučného jadra a rovnako aj do distribučného iptables. Pýtate sa prečo? No, je to najmä preto, že tieto balíky sú už priamo vývojarmi Debianu rozšírené o niektoré funkcie, ktoré v štandardných zdrojových balíkoch prosto nie sú. Výsledkom celých mojich úprav budú inštalačné deb balíčky, čím je výrazne zjednodušená manipulácia, či prípadná neskoršia zmena alebo doplnenie o ďalšie funkcie. Tento postup robím kvôli svojmu firewallu, ktorý beží na obstarožnom stroji, a tak celý návod je postavený na architektúre i386.
Pôvodne som sa obrátil na patch-o-matic-ng, tak ako som to robil kedysi. Ale nepodarilo sa mi sprevádzkovať rozšírenie condition. Už som to skoro vzdal, ale našiel som projekt Xtables-addons, ktorý je určený práve na inštaláciu rozširujúcich modulov. Dokáže to dokonca aj bez rekompilácie jadra a iptables, ale nezahŕňa rozšírenie layer7, preto sa kompilácii zo zdrojového kódu nevyhneme.
Inštalované doplnky
Doplnené ciele
- CHAOS: náhodne používa ciele REJECT, DELUDE alebo TARPIT, čím oklame sieťové skenery podávaním náhodných výsledkov;
- DELUDE: na SYN vždy odpovedá SYN-ACK, čím oklame TCP half-open prieskum;
- DHCPADDR: prepisuje MAC adresu z a do VMware hostov;
- IPMARK: markuje pakety na základe ich IP adresy;
- LOGMARK: loguje pakety a marky do syslog;
- SYSRQ: spúšťa sysreq cez sieť;
- TARPIT: pokáša sa spomaliť (alebo DoS) vzdialených hostiteľov zachytením relácie a jej podržaním na dlhý čas, a to pomocou 0B TCP okna.
Doplnené rozšírenia
- condition: porovnáva logickú hodnotu v /proc/net/nf_condition/meno;
- dhcpaddr: porovnáva DHCP adresu klienta v správe DHCP;
- fuzzy: porovnáva limit rýchlosti na základe radiča fuzzy logiky;
- geoip: porovnáva pakety na základe jeho krajiny pôvodu alebo cieľa;
- ipp2p: porovnáva niektoré p2p protocoly;
- portscan: pokúša sa rozpoznať skenery portov na základe obsahu paketov;
- quota2: pomenované počítadlá.
No a nakoniec samostatne pridávané layer7: rozpoznávanie protokolov 7. vrstvy OSI modelu.
Jadro
Začnem nainštalovaním potrebných balíkov pre kompiláciu a tvorbu balíka. Ide o balíky s programmi ako make, gcc, hlavičkové súbory a podobne. Je možné, že mnohé z nich už sú nainštalované, ale tým sa nič nepokazí a pevne verím, že som na žiadny nezabudol. Samozrejme netreba zabudnúť na asistent modulov a distribučný zdrojový kód jadra. Je možné použiť aj čisté (vanilla) jadro, ale ako so už spomínal, distribučné má aplikované rozširujúce a opravujúce patche.
aptitude install kernel-package dh-make debhelper devscripts fakeroot linux-source build-essential
Rozšírenie layer7 treba stiahnuť z jeho domovskej stránky. Jedná sa o dva archívy, z ktorých jeden obsahuje samotné rozšírenie a druhý zase definíciu protokolov. Tento krok netreba robiť ako root:
cd /usr/src
wget http://downloads.sourceforge.net/l7-filter/netfilter-layer7-v2.21.tar.gz
wget http://downloads.sourceforge.net/l7-filter/l7-protocols-2008-12-18.tar.gz
Varovanie
Časom iste budú nové verzie, takže si treba nájsť aktuálne odkazy.
Komprimované archívy treba rozbaliť:
tar xavf linux-source-2.6.26.tar.bz2
tar xavf netfilter-layer7-v2.21.tar.gz
tar xavf l7-protocols-2008-12-18.tar.gz
Aplikácia patchu jadra je jednoduchá, len treba dať pozor, že patch je spoločný pre viacero jadier:
cd linux-source-2.6.26/
patch -p1 < ../netfilter-layer7-v2.21/kernel-2.6.25-2.6.28-layer7-2.21.patch
Ak to robíte prvý krát, je dobré použitie patchu najprv vyskúšať pomocou voľby –dry-run. V tomto okamžiku sú pripravené zdrojové kódy (teda mali by byť, ale o tom neskôr) a možno pristúpiť k samotnej kompilácii.
Kompiláciu začnime konfiguráciou. Keďže som si zvolil úpravu
distribučného jadra, mám to jednoduchšie, pretože stačí využiť
konfiguráciu distribučného jadra a netreba robiť všetko od znova.
Takže stačí prekopírovať distribučný súbor .config
, ktorý je bu v
adresári /boot
, alebo, ak na strojí beží iné jadro, v adresári s
hlavičkovými súbormi /usr/src/linux-headers-2.6.26-1-686/
:
cp /boot/config-2.6.26-1-686 .config
Teraz možno použiť príkaz make oldconfig, ktorý prejde starú konfiguráciu a poskytne na výber len voľby, ktoré v starom súbore nie sú nastavené. V našom prípade len dve. Na prvú odpovedzte stlačením m, čím je nastavené vytvorenie modulu a na druhú n, pretože ladiaci výstup nepotrebujem:
make oldconfig
...
"layer7" match support (NETFILTER_XT_MATCH_LAYER7) [N/m/?] (NEW) m
Layer 7 debugging output (NETFILTER_XT_MATCH_LAYER7_DEBUG) [N/y/?] (NEW) n
...
#
# configuration written to .config
#
Teraz je samozrejme vhodný okamžik na to, aby som si prispôsobil
nastavenie jadra, vyhodil nepotrebné časti a podobne, ale tým sa
zaoberať nebudem a pristúpim priamo ku kompilácii, ktoré sa skladá z
niekoľkých krokov. Najprv vyčistím zdrojové kódy, potom vytvorím
adresár debian
, upravím changelog
no a nakoniec spustím samotný
preklad. Môžete to robiť ako root (potom netreba –rootcmd fakeroot)
alebo ako bežný používateľ:
make-kpkg clean
make-kpkg --append_to_version -1-686.l7 --revision=2.6.26 debian
dch Pridané rozšírenie firewallu layer7
make-kpkg --rootcmd fakeroot --initrd --append_to_version -1-686.l7 --revision=2.6.26-13 kernel-image kernel_headers
Výsledkom by mali byť dva súbory linux-headers-2.6.26-1-686.sla_rev2_i386.deb
a linux-image-2.6.26-1-686.sla_rev2_i386.deb
v nadradenom adresári. Ako sa
prejavia voľby –append_to_version a –revision je asi z mien súborov
jasné. Takto vytvorené balíky sú pripravené na inštaláciu. Pre istotu
ešte skontrolovať, či balík jadra obsahuje príslušný modul:
cd ..
dpkg -c linux-image-2.6.26-1-686.l7_2.6.26_i386.deb | grep layer7
-rw-r--r-- root/root 14876 2009-02-19 18:28 ./lib/modules/2.6.26-1-686.l7/kernel/net/netfilter/xt_layer7.ko
Vyzerá to dobre, takže nainštalovať jadro aj hlavičkové súbory a reštartovať do nového jadra:
dpkg -i linux*.deb
reboot
iptables
Na úpravu iptables tiež použijeme distribučný zdrojový kód:
cd /usr/src
apt-get source iptables
aptitude build-dep iptables
a bez dlhých rečí ho doplním o patch, teda aby som bol presný, nie o
patch ale o dva súbory, ktoré sú v podadresári patchu
iptables-1.4.1.1-for-kernel-2.6.20forward
a treba ich prekopírovať do
adresára extensions
v zdrojovom kóde iptables:
cd iptables-1.4.2/extensions/
cp ../../netfilter-layer7-v2.21/iptables-1.4.1.1-for-kernel-2.6.20forward/* .
Najprv je treba trochu doplniť zdrojový kód. Nechcelo sa mi pátrať
prečo, ale pri konfigurácii neprekopíruje do adresára include/
hlavičkové súbory rozšírení, preto ich je treba doplniť ručne.
Chyba sa prejavuje vcelku nevinne, začne upozornením, lenže pokračuje
hrôzostrašným množstvom chýb, napríklad:
libxt_layer7.c:25:39: warning: linux/netfilter/xt_layer7.h: Adresár alebo súbor neexistuje
Aby ste to nemuseli hľadať po jednom, spísal som všetky, na ktoré sa pri kompilácii sťažuje (vo vzťahu k popisovaným rozšíreniam):
cd ../iptables-1.4.2/
cp ../linux-source-2.6.26/include/linux/netfilter/xt_layer7.h include/linux/netfilter/
Ak pridávate aj iné rozšírenia, budú asi chýbať aj ďalšie súbory.
Teraz možno upraviť changelog
, nech odlíšim verziu a možno spustiť
samotný preklad, s vypnutím podpisovania:
dch -v 1.4.2-6.l7 Pridaná podpora layer7
dpkg-buildpackage -us -uc
Výsledkom by mali byť tiež dva balíky, iptables_1.4.2-6.l7_i386.deb
a
iptables-dev_1.4.2-6.l7_i386.deb
. Skontrolujeme, či je v balíku
iptables modul s našim rozšírením:
dpkg -c iptables_1.4.2-6.l7_i386.deb | grep layer7
-rw-r--r-- root/root 9028 2009-02-19 19:26 ./lib/xtables/libxt_layer7.so
Ak áno, tak nainštalujem nové iptables pomocou nástroja dpkg a
ešte doplníme definície protokolov z adresára l7-protocols-2008-12-18
,
ktorý stačí prekopírovať do adresára /etc/l7-protocols/
:
cd ..
dpkg -i iptables_1.4.2-6.l7_i386.deb
cp -r l7-protocols-2008-12-18 /etc/l7-protocols/
A je to! Teraz mám protokoly pod kontrolou. Zoznam rozpoznávaných protokolov, spolu s poznámkou o rýchlosti rozpoznávania, je tiež na domovskej stránke. K tej rýchlosti len toľko skúšal som za plnej rýchlosti (okolo 2.5 Mb/s) rozpoznávanie flash a load okamžite stúpol nad 0.20 z približne 0.00 nič. Ale ako som spomínal, je to obstarožný (400 Mhz) stroj.
Doplnky Xtables
Ostáva už len balík s rozšíreniami iptables xtables-addons-source, ktorý je dostupný v úložisku experimental, ale funguje aj v lenny, preto ho stiahnem z niektorého zrkadla, doinštalujem hlavičkové súbory iptables a samotné doplnky xtables:
wget http://ftp.cz.debian.org/debian/pool/main/x/xtables-addons/xtables-addons-source_1.8-1_all.deb
dpkg -i iptables-dev_1.4.2-6.l7_i386.deb
dpkg -i xtables-addons-source_1.8-1_all.deb
Ak sa divíte prečo inštalujeme hlavičkové súbory iptables, tak je to preto, že xtables-addons na tomto balíku závisí, ale pri snahe vyriešenia závislostí by nanašiel ten správny balík a diali by sa divy. Pre úplnú spokojnosť potrebujeme ešte balík module-assistant, tentokrát už z úložiska apt:
aptitude install module-assistant
Nainštalovaný nástroj module-assistant je možné používať aj prostredníctvom skratky m-a, ktorú budem ďalej používať. Bez rozdielu, či ste m-a práve nainštalovali alebo ho už z nejakého dôvodu máte, je ho treba spustiť s parametrom prepare, aby si zistil správny adresár hlavičkových súborov jadra a prítomnosť potrebných balíkov:
module-assistant prepare
Po tejto operácii môžme pomocou m-a priamo nainštalovať všetky dostupné rozšírenia alebo vytvoriť inštalačný balík. Ja použijem druhý spôsob, pretože nekompilujem na stroji, na ktorom to budem používať:
m-a build xtables-addons-source
m-a bude chvíľu pracovať a nakoniec vypľuje do aktuálneho adresára
požadovaný balík, v tomto prípade s menom
xtables-addons-modules-2.6.26-1-686.l7_1.8-1+2.6.26_i386.deb
, ktorý
nainštalujem a po inštalácii spustím depmod, aby systém nové moduly
zaregistroval:
dpkg -i xtables-addons-modules-2.6.26-1-686.l7_1.8-1+2.6.26_i386.deb
depmod -a
V tomto okamžiku sú vyššie spomínané rozšírenia dostupné a možno pristúpiť k budovaniu firewallu efektívnejším a často aj prehľadnejším spôsobom. Popis jednotlivých rozšírení je v samostatnej manuálovej stránke:
man xtables-addons