Kategória: Linux a sieť

Zmenené: 10. september 2010

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