Portál AbcLinuxu, 5. května 2025 17:03
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.
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.
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.
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.
/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.
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ší.
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.
Nahledě na to, že tento mechanismus umí něco, co iptables neumí – atomické přidání více pravidel (vizte klíčové slovo COMMIT).
Ale umí, vizte příkaz iptables-batch
.
Tudíž já pravidla upravuji na živém stroji pomocí iptables a když jsem s nimi spokojen, tak je uložím pomocí iptables-save.
Zejména úpravy spočívající ve změně jedné IP adresy, která se vyskytuje ve dvaceti různých pravidlech, se takto realizují velmi pohodlně. :-)
Kde? iptables-1.4.0rc1 nic takového neobsahují.Ale umí, vizte příkaz
iptables-batch
.
OpenSuSE 10.3:
mike@lion:~> rpm -q iptables iptables-1.3.8-28 mike@lion:~> rpm -ql iptables | grep sbin /usr/sbin/ip6tables /usr/sbin/ip6tables-batch /usr/sbin/ip6tables-restore /usr/sbin/ip6tables-save /usr/sbin/iptables /usr/sbin/iptables-batch /usr/sbin/iptables-restore /usr/sbin/iptables-save /usr/sbin/iptables-xml
Nemohu vyloučit, že si ten příkaz přidali sami, ale docela by mne to překvapilo. Zkusím se podívat do source RPM.
"2^24 comments ought to be enough for anyone" -- CmdrTacolol at signature :D
Pri editovani konfigurace ulozene pomoci iptables_save je neprijemne ze obnovovaci skript je daleko haklivejsi nez by se z formatu souboru mohlo zdat a co je horsi, kdyz se mu neco nelibi vubec nerekne co.No nevim, ale me osobne se zda, ze iptables-restore jenom bere radky a pred ne nacpe prikaz "iptables". Tot vse, spis je problem, ze "iptables" nerekne, co mu kde vadi a proto ani iptables-restore nic moc nerekne.
Nezbytna malickost pri sprave pres ssh - ovladaci skript musi umet obnovit smysluplny stav pokud se nepovede _restore, nejlepe asi ulozenim predchozi konfigurace.No, osobne pouzivam screen a restart firewall resim pomoci
/etc/init.d/iptables restart;for i in $( seq 1 30 );do echo "$i";sleep 1;done;/etc/init.d/iptables stop
Restartne se nova konfigurace, pak se pocita 1 - 30. Pokud to pocitani vidim, spojeni drzi, OK, dam CTRL-C a firewall zustane. Pokud si odriznu SSH, script ve screenu dopocita do 30 a zastavi komplet firewall., Ja vim, zastavit firewall neni super vec, ale pak ve screenu rychle vratim zmenu a restart, takze zas takovej problem to neni, navic by to slo opravit, aby se (1) ulozila aktualni konfigurace "iptables-save > aktualni", (2) restart firewall s tim odpocitavanim, (3) obnoveni predchozi konfigurace "iptables-restore < aktualni".
Zkrátka proč si musí každý vytvářet skripty umísťované do /etc/rc.d/rc.local?Ve které distribuci? V Gentoo aliasy, routování i iptables má konfigurační soubory a příslušné init skripty.
Jak se správně nastaví více IP na jednom rozhranní? Do nedávna jsem si myslel, že v ifcfg-eth1:x, ale tohle vytváří ip aliasy (které ale moc neva, pokud člověk používá výhradně iproute2).
IP aliasy to nevytváří zcela určitě, to je věc, která fungovala pouze v jádrech řady 2.0 (dřív ne a později také ne). Pokud jde o nastavení v konfiguračních souborech, je záležitost konkrétní distribuce, jestli a jak vám umožní napsat přímo do konfiguračního souboru.
DEVICE=eth1 BOOTPROTO=static ONBOOT=yes IPADDR=192.168.0.128 NETMASK=255.255.255.0 NETWORK=192.168.0.0 HWADDR=00:30:4f:56:f8:2b MTU=7000to vytváří device pro každý takový konf. soubor:
inet 172.16.1.1/24 brd 172.16.1.255 scope global eth1:1 inet 192.168.218.1/24 brd 192.168.218.255 scope global eth1:2 inet 172.16.32.1/24 brd 172.16.32.255 scope global eth1:4kdežto ip a add ..... přidá ip ke stávajícímu rozhranní:
inet 192.168.0.128/24 brd 192.168.0.255 scope global eth1 inet 10.0.0.1/16 brd 10.0.255.255 scope global eth1Jaký je v tom tedy rozdíl?
to vytváří device
Nevytváří. Ani device, ani interface. To je pouze fikce, kterou vám předstírá příkaz ifconfig
(a která vám může pěkně zamotat hlavu, kdybyste tomu fiktivnímu rozhraní zkusil nastavit nějaké parametry).
Jaký je v tom tedy rozdíl?
Rozdíl je jen v tom, že inicializační skript použil při volání příkazu ip
parametr label
(horší varianta by byla, že místo něj spustil ifconfig
). Když ho použijete při ručním volání, budete tam mít label také.
ip
nejde mnenit ip adresa ktera je jako "hlavni" na ethX. Pokud tedy chceme napriklad zmenit ip adresu na eth0 tak musime pouzit ifconfig eth0
atd. Toto je zasadni nedostatek jinak bezchybne utility ip
. Toto se zda byt jako nepodstatne pokud ste na tom kompu ale pokud potebujete precislovat kompl vzdaleny 20km od vas je to velky problem.
ip addr add 192.168.10.10 dev eth0 ip addr del 192.168.1.1 dev eth0Nebo ne?
Jste bych mozna doplnil ze s ip nejde mnenit ip adresa ktera je jako "hlavni" na ethX. Pokud tedy chceme napriklad zmenit ip adresu na eth0 tak musime pouzit ifconfig eth0 atd.
Jak jste na to přišel? A co je to vlastně "hlavní adresa"? Jednou z podstatných změn od jádra 2.2 je právě to, že žádná adresa není "hlavní", ale všechny (kromě těch s příznakem secondary
) jsou rovnocenné.
ifconfig
má jednoduchý život: žije si v představě, že adresa se rozhraní nastavuje a že už to skoro devět let není pravda, to ho očividně netrápí. Takže si prostě nějakou adresu nahradí a která to vlastně bude, to je v rukou osudu.
Jak se správně nastaví více IP na jednom rozhranní? Kde se nastaví seznam statických cest?Prikazem ip
Zkrátka proč si musí každý vytvářet skripty umísťované do /etc/rc.d/rc.local?Protoze je to mnohem prehlednejsi a jednodussi nez pouzivat nejaky specificky konfigurak, jehoz moznosti budou generaci za soucasnym moznostmi jadra a nastroju. Navic uzivatel uz stejne ty nastroje zna a zna shell, tak proc se navic ucit syntaxi obsurnich konfiguraku. Nehlede na to, ze pravidla pro netfilter a shaping casto maji nejakou strukturu, kterou je mozne vyjadrit v skriptu pomoci funkci a podobnych abstraktnich konstrukci, zatimco v konfiguraku by to clovek musel rozepsat.
nyní se generuje skript využívající tc přímo z databaseTo ale firehol neumi?
Teď nenacházím ekvivalentní příklad, tak plácnu první blbost co mě napadne. Proč mám statický routy nastavovat pomocí ip route v rc.local, a na konfiguraci apache mám soubor?
Apache je user space aplikace, zatímco router (nebo netfilter) je součást jádra. Nepřipadá mi jako dobrý nápad, aby jádro četlo nějaké konfigurační soubory. Ale můžete si samozřejmě napsat aplikaci (případně skript), která načte konfigurační soubor a podle něj nakonfiguruje příslušnou část jádra. Přesně tohle obvykle dělají inicializační skripty distribucí - jen ne všech a v každé jinak. Takže otázka by spíš měla znít, proč není (aspoň základní) specifikace konfiguračních souborů síťových rozhraní a směrování součástí LSB; pak by to aspoň některé distribuce měly stejně.
Takže otázka by spíš měla znít, proč není (aspoň základní) specifikace konfiguračních souborů síťových rozhraní a směrování součástí LSB; pak by to aspoň některé distribuce měly stejně.
Přesně ta otázka odstartovala tento thread.
Linux na síti vyrostl a očekával bych, že bude existovat jednotná konvence jak siť nastavit. ..........
Takže otázka by spíš měla znít, proč není (aspoň základní) specifikace konfiguračních souborů síťových rozhraní a směrování součástí LSB; pak by to aspoň některé distribuce měly stejně.Tu otázku je možné klidně zobecnit, proč všechny konfigurační soubory, skripty atd. nemají všechny distribuce stejné – také by to usnadnilo přechod mezi distribucemi. (A dál můžeme pokračovat, proč všechny internetové prohlížeče nevykreslují stejně, proč se všechny aplikace jednoho typu – např. kancelářský balík – nechovají stejně, atd.) Odpověď je nasnadě – každému vyhovuje něco jiného, někdo chce zadat do konfiguráku IP adresu, default gateway a DNS (protože na pracovní stanici typicky nic jiného potřebovat nebude), někdo chce přiřazovat rozhraní
x
IP adres, routovat podle aktuální fáze měsíce a pravidla pro iptables
generuje z LDAPu (a pak bude zákonitě používat své vlastní skripty). Řekl bych, že seznámit se s tím, jak daná distribuce nastavuje síťové parametry, je minimum toho, co může udělat správce, když z nějakého důvodu dostane na starosti nový systém s distribucí, kterou nezná.
/etc/rc.inet1
. Takže nikoliv do rc.local
. Ovšem je to už dlouho, ale předpokládám, že tohle se nezměnilo.
Jenže u všeho, co uvádíte, se nejedná o konfigurační soubory, ty si každá distribuce dává jinam a má je v jiném formátu. A právě o těch tu byla řeč.
P.S.: ifconfig
už dnes opravdu ne
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.