Nem is olyan nagyon régen írtam egy cikket arról, hogyan érezhetnénk magunkat kicsit nagyobb biztonságban, ha online tartózkodik számítógépünk. A cikk születésében ötletekkel, lektorálással, teszteléssel segítségemre volt egy kollégám, akinek volt egy megjegyzése, ami szöget ütött a fejembe.
Az írásnak ugyanis része volt a tűzfal beállítása, amit én a saját gépemen az /etc/init.d könyvtárból - még inkább az /etc/rcS.d könyvtárból - indítottam. Ő erre azt mondta, hogy az ötlet jó, ámbátor abszolúte nem init scriptként viselkedik a tűzfal - ami igaz is. Mivel fogalmam sem volt, hogyan kellene legalább hasonlóvá tenni a tűzfal beállításait az init scriptekhez, nekiálltam kicsit tanulmányozni az ufw init-scriptjét. A látottak alapján úgy döntöttem, hogy hasonlóvá teszem a tűzfalam indítását, noha az nyilvánvalóan nem init-script.
Szem előtt tartottam azt is, hogy felmerülhetnek bizonyos egyéb igények az általam elképzelteken kívül, így az indítási paraméterek között felsoroltam néhány egyéb lehetőséget.
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: firewall
# Required-Start:
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: start customized firewall
### END INIT INFO
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
# Az iptables parancs helye, igy nem kell mindig a teljes utvonalat beirni
IPTABLES=/sbin/iptables
[ -x /etc/init.d/firewall ] || exit 0 # futtathato-e a script, ha nem, kilepunk
case "$1" in
start)
echo "Starting customized firewall...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot DROP-ra allitjuk
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
# Kihasznaljuk, hogy lehetseges az allapot ellenorzese
# es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo "Customized firewall started... [OK].\n"
echo "Only user-initiated network connections are available (doesn't harm daily internet usage).\n"
;;
stop)
echo "Stopping customized firewall, all connections will be default...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot ACCEPT-ra allitjuk
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
echo "Customized firewall stopped, all connections set to default.\n"
;;
close)
echo "Stopping customized firewall, all connections will be closed...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot DROP-ra allitjuk
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
echo "Customized firewall stopped, all connections closed.\n"
;;
ssh)
echo "Starting customized firewall...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot DROP-ra allitjuk
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
# Kihasznaljuk, hogy lehetseges az allapot ellenorzese
# es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Engedelyezzuk az ssh szerver portjat
# termeszetesen igy az egesz vilag hozzaferhet
$IPTABLES -A INPUT -p tcp --dport 5353 -j ACCEPT
echo "Customized firewall started... [OK].\n"
echo "Only user-initiated network connections and ssh on port nr. 5353 are available (doesn't harm daily internet usage).\n"
;;
apache)
echo "Starting customized firewall...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot DROP-ra allitjuk
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
# Kihasznaljuk, hogy lehetseges az allapot ellenorzese
# es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Engedelyezzuk a webszerver portjat
# termeszetesen igy az egesz vilag hozzaferhet
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
echo "Customized firewall started... [OK].\n"
echo "Only user-initiated network connections and apache on port nr. 80 are available (doesn't harm daily internet usage).\n"
;;
ssh_apache)
echo "Starting customized firewall...\n"
# Toroljuk az eddigi szabalyokat
$IPTABLES --flush
# Minden meglevo extra lancot torlunk
$IPTABLES --delete-chain
# A harom alapertelmezett lancot DROP-ra allitjuk
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
# Kihasznaljuk, hogy lehetseges az allapot ellenorzese
# es csak olyan bejovo kapcsolatokat engedelyezunk, amelyeket mi inditottunk
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# Engedelyezzuk a webszerver es az ssh portjait
# termeszetesen igy az egesz vilag hozzaferhet
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 5353 -j ACCEPT
echo "Customized firewall started... [OK].\n"
echo "Only user-initiated network connections, ssh on port nr. 5353 and apache on port nr. 80 are available (doesn't harm daily internet usage).\n"
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop|close|ssh|apache|ssh_apache}"
exit 1
;;
esac
exit 0
Lássuk sorrendben:
-start: elindítjuk a tűzfalat és csak olyan kapcsolatokat engedélyezünk, amiket mi indítottunk.
-stop: visszaállítjuk az alapértelmezett állapotot, azaz minden kapcsolatot engedélyezünk - leginkább tesztelésre ajánlott, ha "útban van" a tűzfal.
-close: teljes rendszerzárlat, semmilyen hálózati kapcsolatot nem engedélyezünk.
-ssh: csak az 5353-as portra konfigurált ssh-t és az általunk kezdeményezett kapcsolatok engedélyezettek.
-apache: elérhető az alapértelmezett beállításokkal működő webszerver (80-as port), valamint működőképesek az általunk kívánt kapcsolatok.
-ssh_apache: kívülről elérhető az ssh, a webszerver és működnek az általunk kezdeményzett műveletek.
Ha bármelyik kulcsszó nélkül indítjuk a scriptet, egy rövid információs sort kapunk a használatról.
Természetesen még egyebekkel is ki lehet egészíteni a scriptet, illetve nyilvánvalóan el is lehet venni az itt tárgyalt lehetőségekből; a fenti példa az én igényeimet tükrözi. Remélem, lesz, akinek hasznos ez a leírás. Jó játékot az iptables-szel!