Játék az iptables-szel

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!

Hirdetés

3 pénzügyi döntés, amit minden kisvállalkozónak érdemes átgondolnia az év végéig

PR Ahogy az év vége közeledik, itt az ideje, hogy egy pillanatra megálljunk és áttekintsük vállalkozásunk pénzügyi helyzetét. Ne hagyjuk, hogy az év utolsó hónapjai elússzanak a sürgető feladatok és elfeledett határidők között!

Azóta történt

Előzmények