Portál AbcLinuxu, 13. května 2024 17:58

Firewall na Slackware

1. 11. 2007 | Vladimír Žalud
Články - Firewall na Slackware  

Většina linuxových distribucí má už při instalaci možnost spustit a nakonfigurovat firewall. U instalace Slackwaru nástroj na automatické nastavení firewallu chybí, což samozřejmě neznamená, že není možné ho na něm provozovat.

Ovšem je pravda, že Slackware Linux nemá implicitně definovaná žádná pravidla iptables, ani žádnou jednoduchou instalační volbu, která by to zajistila. Dokonce není k dispozici ani přímý konfigurační soubor, o balíčku ani nemluvě.

Co z toho plyne, je asi nasnadě - v případě přímého připojení k síti není náš počítač chráněn firewallem a je tedy lehce přístupný nežádoucímu přístupu ze sítě. A zabránit neautorizovanému přístupu, ať už z vnější sítě do vnitřní, nebo prostě jen z Internetu do počítače apod., je hlavní funkcí asi každého dobře sestaveného firewallu. Ukážeme si tedy, jak celkem efektivně zprovoznit firewall na Slackware Linuxu.

Nezbytné předpoklady - jádro, nástroje

V prvé řadě potřebujeme vhodně přeložené jádro; Slackware má snad u všech svých kernelů tuto volbu při kompilaci zapnutou, a tak se při použití distribučních jader (což je náš případ) nemusíme touto problematikou zabývat. Další předpoklad, který si musíme ohlídat, je instalace balíčku iptables, který je v instalační adresářové struktuře Slacku umístěn v adresáři n, spolu s většinou ostatních síťových záležitostí. Tento balíček obsahuje nástroje pro všemožnou manipulaci s firewallem, jeho funkčnost, logování apod.

Konfigurační soubory - alfa omega

Jako všechny bezprizorní příkazy se dají i pravidla iptables zapsat do souboru /etc/rc.d/rc.local. To ovšem není moc elegantní ani praktické a Slackware to také umožňuje řešit daleko lépe. Nejdříve si něco řekněme o spouštění systému samotného a jak se to týká nastavování firewallu v našem případě.

V průběhu startu počítače se načítají a spouštějí (v závislosti na runlevelu) služby, nastavení a vůbec věci nutné pro běh počítače. Je-li u Slackwaru odpovídajícím runlevelem 3 (výchozí multiuser mód se sítí) nebo 4 (stejný jako předchozí plus X), provede se v určitém stupni bootování skript /etc/rc.d/rc.inet2, který odpovídá za spuštění síťových služeb a navazujících funkcí. Jedním z podmíněných příkazů je i spuštění souboru /etc/rc.d/rc.firewall s parametrem start (podmínkou je přítomnost a spustitelnost tohoto souboru - a samozřejmě správná konfigurace).

Mimochodem, všechny soubory zde zmíněné se nazývají init skripty a obecně jsou, jak je patrné, zodpovědné za start počítače a služeb. V případě Slacku se jedná o tzv. systém BSD init skriptů, což je jeden ze tří nejrozšířenějších způsobů startu Linuxu. Další a popravdě dnes více rozšířený způsob je SystemV init (Slackware za jistých podmínek podporuje i tento způsob spouštění služeb). Třetí a nejnovější způsob, rozšiřující se hlavně díky Ubuntu, se jmenuje Upstart a jako největší rozdíl oproti běžně používanému způsobu startu Linuxu se uvádí možnost paralelního spouštění více služeb a tím i efektivnější využití času oproti běžnému bootování. Slackware, pokud vím, zatím poslední způsob nepodporuje.

Zpět k firewallu. Zkrátka a dobře, tvůrci Slackwaru nám konkrétním příkazem ve spouštěcím skriptu dali vodítko pro jeho konfiguraci a my se v tomto článku pomocí jednoduchého použití standardních linuxových nástrojů zaměříme právě na tuto možnost. Netvrdím, že je to možnost jediná, definitivní nebo nejlepší; mně se však osvědčila a zdá se mi i pohodlná.

Co tedy budeme vlastně dělat? V prvé řadě si vytvoříme potřebné soubory. Základem je soubor/skript /etc/rc.d/rc.firewall, který nám celý proces spouštění a údržby firewallu usnadní, a dále pomocné skripty (firewall_start, firewall_stop apod., viz dále) umístěné v adresáři /etc/abcfw/, které budou obsahovat vhodná pravidla iptables a příkazy v závislosti na tom, co budeme po firewallu chtít a potřebovat.

Start firewallu

Začneme tedy souborem rc.firewall umístěným v adresáři /etc/rc.d/. Samotný spustitelný soubor bude přebírat argumenty start, stop, restart, lock a status, a podle nich bude vykonávat nadefinované funkce. Volba start znamená spuštění firewallu - pravidla iptables budou aktivována. Parametrem stop můžeme firewall zastavit - potom se vymažou veškerá pravidla a počítač bude absolutně bez ochrany zvenčí. Naopak volbou lock nám skript rc.firewall umožní ukončit veškerý síťový provoz a uzamknout tak počítač před vnějším světem. Předpokládám, že důsledky pravidla restart vysvětlovat nemusím. A konečně přepínač status nám v ideálním případě ukáže stav pravidel a případně i jiné, například síťové, ukazatele.

Pro větší přehled jsem i výše zmíněný soubor rc.inet2 opatřil jistým malým "vylepšením", takže se při spouštění ozve a okomentuje svou činnost. Nejprve část souboru /etc/rc.d/rc.inet2 (moje úpravy jsou zakomentovány):

#initializing firewall
if [ -x /etc  rc.d/rc.firewall ]; then
 /etc/rc.d/rc.firewall start
#echo "Firewall is running!"
#else echo "Firewall isn't available!"
fi

Říkat tomu v tomto případě vylepšení je hodně nadsazené, ovšem dále uvidíme, že to svoje estetické opodstatnění má.

Teď se podívejme na soubor /etc/rc.d/rc.firewall:

#!/bin/sh

#rc.firewall
#Start|stop|restart|lock|status firewall.

#Start firewall:
firewall_start() {
if [ -x /etc/abcfw/firewall_start ]; then
 /etc/abcfw/firewall_start
fi
}

#Stop firewall:
firewall_stop() {
if [ -x /etc/abcfw/firewall_stop ]; then
 /etc/abcfw/firewall_stop
fi
}

#Locking PC
firewall_lock() {
if [ -x /etc/abcfw/firewall_lock ]; then
 /etc/abcfw/firewall_lock
fi
}

#View status firewall
firewall_status() {
if [ -x /etc/abcfw/firewall_status ]; then
 /etc/abcfw/firewall_status
fi
}

#Restart firewall:
firewall_restart() {
firewall_lock
 sleep 1
firewall_start
}

 case "$1" in
 'start')
   firewall_start
   ;;
  'stop')
   firewall_stop
   ;;
  'restart')
   firewall_restart
   ;;
  'lock')
   firewall_lock
   ;;
  'status'
   firewall_status
   ;;  
*)
echo "usage $0 start|stop|restart|lock|status"
esac

#end

Je to opravdu obyčejný bashový skript, žádné velké kudrlinky, více méně se předpokládá, že všechno funguje tak, jak má. Perl a sofistikované konstrukce přenechává Slackware většinou jiným distribucím. Vysvětlení jednotlivých příkazů ve skriptech překračuje určení článku, nic komplikovaního to ale není. Viz seriál BASH.

Adresář /etc/abcfw/

Adresář s obsahem souborů, které nám budou plnit požadované funkce, a vlastně nepřímo i celé tohle řešení firewallu, jsem nazval /etc/abcfw - hlavně z nedostatku invence. Při vlastní úpravě skriptů je úplně jedno, kam to uložíte, nebo jak to pojmenujete; důležité je, aby cesty ve skriptech souhlasily s cestami v adresářové struktuře vaší distribuce.

Takže, jak je ze skriptu výše vidět, soubory s pravidly jsou umístěny v adresáři /etc/abcfw/ a jsou spustitelné. Opět to není žádná věda, ale funguje to.

Soubory v /etc/abcfw/:

Nejdříve firewall_start:

#!/bin/bash

#firewall_start
#setup script for running iptables rules

#intro
echo "Starting firewall!"

#variables
iptables=/usr/sbin/iptables

#cleaning
$iptables -F
$iptables -X

#policy
$iptables -P INPUT DROP
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD DROP

#accept loopback
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A FORWARD -i lo -j ACCEPT

#setup for INPUT rules
$iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
$iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p udp --dport 67 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p tcp --dport 139 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
$iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#security
$iptables -A INPUT -p tcp --syn -j LOG
$iptables -A INPUT -p tcp --syn -j DROP

#epilogue
echo "Done."

#end

No a konečně se dostáváme k vytouženým pravidlům. Ještě si všimněte umístění a výstupu programu echo; v případě startu vypíše hlášku o tom, co začíná dělat, a potom dá ještě vědět, že je vše hotovo. V případě startu PC se k tomu přidá echo z /etc/rc.d/rc.inet2 a je tady ten estetický výsledek mé snahy ;-). Pravidla jsou určena pro můj pokusný intranetový domácí server, takže to podle toho vypadá, služeb relativně hodně a zabezpečení téměř žádné. Opět platí, že význam jednotlivých příkazů si, pakliže je neznáte, budete muset nastudovat jinde.

Následuje soubor firewall_stop:

#!/bin/bash

#firewall_stop
#setup script for stopping iptables rules

#intro
echo "Stopping firewall rules."

#variables
iptables=/usr/sbin/iptables

#setup
$iptables -F
$iptables -X

#clean policy
$iptables -P INPUT ACCEPT
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD ACCEPT

#epilogue
echo "Done."

#end

Dále tu máme soubor firewall lock:

#!/bin/bash

#firewall_lock
#setup script for locking all network conections

#intro
echo "Locking all network traffic!"

#variables
iptables=/usr/sbin/iptables

#setup
$iptables -F
$iptables -X

#set policy
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP

#accept loopback
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A FORWARD -i lo -j ACCEPT

#epilogue
echo "Done."

#end

Co dodat k těmto dvěma skriptům? První vymaže všechna pravidla a firewall vlastně úplně vypne. Druhý sice také vymaže všechna pravidla, ovšem veškeré policy, neboli implicitní chování firewallu, nastaví na DROP (zahazování paketů) a tím uzavře veškerý provoz dovnitř i ven, včetně už ustanovených a probíhajících spojení. Na loopback zařízení se toto omezení samozřejmě nevztahuje. Všechny skripty jsou v případě použití mírně upovídané.

A nakonec firewall_status:

#!/bin/bash

#firewall_status
#setup script for status view of all firewalled network conections

#intro
echo "Firewall status:"

#variables
iptables=/usr/sbin/iptables

$iptables -L -v

#end

Tuto volbu jsem vlastně vymyslel až pro tento článek. Já sám se držím celkem osvědčeného iptables -L -v na příkazovém řádku, ale přišlo mi vhodné to sem dát jako zajímavou možnost. Zejména při využití i jiných systémových příkazů, barevném rozlišení apod. Možností je spousta a jejich naplnění nechám už na vás.

Pro atribut restart skript nepotřebujeme, protože se vlastně provedou postupně skript firewall_lock a firewall_start, jak je patrné výše.

Moduly, jiná řešení a ostatní drobnosti

Firewall nám sice běží, ale jeho dostatečná funkčnost ještě nemusí být plně zajištěna. Některé služby potřebují pro správné fungování aktivovat dodatečné moduly. V našem příkladu se to týká hlavně pravidla vztahujího se ke službě FTP a tedy modulu ip_conntrack_ftp. Dá se to udělat ručně, napsat to do uvedených skriptů nebo k tomu použít standardní slack soubory (/etc/rc.d/rc.modules, /etc/modules.conf apod.).

Co se týká jiných řešení, tak snad zmíním jen program iptables-save a iptables-restore. Tím prvním si uložíte do souboru souhrn pravidel, který jste si definovali třeba na příkazovém řádku. Takže jako root prostě zadáte:

# iptables-save > /etc/abcfw/firewall_start

Tímto všechna požadovaná pravidla umístíte do souboru /etc/abcfw/firewall_start. A pokud budete chtít přesně tato pravidla použít i v budoucnu, použijete jednoduše příkaz iptables-restore a soubor s uloženými pravidly mu předáte jako parametr. Konkrétně tady zadáte:

# iptables-restore /etc/abcfw/firewall_start

Využití ve skriptech je v podstatě stejné jako výše popsané řešení. Soubor firewall_start umístíte do adresáře /etc/abcfw/ a místo spuštění ho předáte programu iptables-restore jako parametr. Soubor nemusí být spustitelný a testovací přepínač může být v tom přépadě jen -e (existence souboru). Celé by to v našem případě mohlo ve spouštěcím skriptu vypadat asi takto:

if [ -e /etc/abcfw/firewall_start ] ; then
 iptables-restore /etc/abcfw/iptables_start
fi

Jako ulehčení práce s naším firewallem si můžete vytvořit nějaký vhodně pojmenovaný link na soubor /etc/rc.d/rc.firewall, třeba jen abcfw, a umístit ho někam do spouštěcí cesty. Práce s ním se potom trochu zjednoduší.

Závěr

Tak a to je vše. Snad se mi povedlo začátečníkům ukázat, že zprovoznit firewall na Slackware Linuxu, i když jeho konfigurace není standardně k dispozici, je vlastně hračka, a že to má i svou logiku.

Související články

SUSE 9 jako firewall
Traffic shaping (patchování a instalace)
Traffic shaping - 2 (IMQ a úvod do shapingu)
Jemný úvod do adresace v protokolu IP verze 4
OSPF - dynamické routování
Nastavení DNS
Čo keď nechodí sieť?
IPSec v kernelu 2.6
Kešovací DNS server BIND
Jak nabootovat Linux po síti
Směrování v sítích IP
NFS+NIS+LTSP - přihlašování na server
Seriál: Domácí síť
Seriál: Soukromá síť
Seriál: Stavíme bezdrátovou síť
Seriál: Linuxové DMZ
Seriál: Nastavení poštovního subsystému v Linuxu
Seriál: Spam: naučte se bránit

Další články z této rubriky

V sobotu se uskuteční konference CryptoFest
Pozor na androidové aplikace
Silent Circle představil bezpečný smartphone Blackphone 2
Android je bezpečnější, řada hrozeb však stále přetrvává
Avast varuje před nebezpečnými aplikacemi v Google Play

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.