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čnime teda nainštalovaním potrebných balíčkov pre kompiláciu a tvorbu balíčka. Ide o balíčky 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
Č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 nepotrebujeme:
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 sme si prispôsobili nastavenie jadra, vyhodili 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íme zdrojové kódy, potom vytvoríme adresár debian, upravíme changelog no a nakonie spustíme 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ý rečí ho doplníme 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 našich 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íšime 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štalujeme 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áme 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.0 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 stiahnime z niektorého zrkadla, doinštalujme 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íček. 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íček, 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štalujeme a po inštalácii spustíme 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



Komentáre
dik za navod dost mi pomohol ale mozno by som ho trochu aktualizoval :), kedze sa mi uz nikde nepodarilo zohnat balicek xtables-addons-source_1.8 -1_all.deb musel som to rucne kompilovat. Problem je totiz v tom ze xtables-addons-source je verzie 1.26 a ta uz nepodporuje iptables nizsie ako verziu 1.4.3(default v lenny 1.4.2.6), takze stiahol som si zdrojaky iptables 1.4.4 nainstaloval rovnakym sposobom a potom skompiloval xtables-addons-source 1.26:
cd /usr/src/xtables-addons
./configure --with-xtables=/lib --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --libexecdir=/lib --with-ksource=/usr/src/l inux --includedir=/usr/include/
make
checkinstall
viacmenej som to skombinoval s touto stranku: http://www.ecualug.org/2009/07/12/blog/razametal/debian_kernel_26301_l7filter_ipp2p
pg
V prípade rozsiahlej rekompilácie by som iste volil aj novú verziu iptables.