Így kezdjünk: gondoljuk át, hogy mit is akarunk.
Én egy egyedülálló géphez akarok tűzfal szabályt készíteni. A gép nem csatlakozik belső hálóhoz, tehát egy szokványos otthoni PC, amivel az ember dolgozik, játszik, de nem mellékesen internetezik.
Indulásnak (mert ugye nem vagyok nagy szakértő) vettem egy kész szkriptet, amelyet saját igény szerint átírtam.
A lelőhely.Időközben törölték az oldalt!
Ezt a módszert minden kezdőnek javaslom, kiegészítve azzal, hogy minden létező információt olvassunk el az iptables témáról.
Kezdjük a szokásossal: man iptables
www.linuxguruz.com/iptables/howto/maniptables.html
Vagy ezt is javaslom:
iptables-tutorial.frozentux.net/other/iptables.html
Ha nem megy az angol, akkor itt van egy kis segítség magyarul:
www.szabilinux.hu/iptables/chapter7.html
A továbbiakban részletesen leírom, hogy hogyan készítettem el a tűzfal szkriptemet.
Az én tűzfal szkriptem:
#!/bin/sh
## otthoni tűzfal, egygépes rendszerre
## megkeressük az iptables -t
IPTABLES=`which iptables`
## megadjuk a modulkönyvtárat:
MODKT=/lib/modules/`uname -r`/kernel/net/ipv4/netfilter
## megkeressük a modprobe parancsot
MODPROBE=`which modprobe`
## tegyük fel, hogy ez a címünk.
IFACE=172.16.9.200
## először törlünk minden szabályt.
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
## felállítjuk az alap policyt.
## mindent tiltunk, amit külön nem engedélyezünk.
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
## megnézzük vannak-e modulok, amiket betöltünk.
## az ftp követő modul, betölti majd a többi modult.
if [ -f $MODKT/ip_conntrack_ftp.ko ]
then MOD=ip_conntrack_ftp ;
$MODPROBE $MOD
fi
## figyeljük a syn sütiket
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
## bekapcsoljuk a forráscímhitelesítést.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
## INPUT szabályok.
## loopback -en engedélyezzük a forgalmat.
$IPTABLES -A INPUT -i lo -j ACCEPT
## engedélyezzük befele, ami tőlünk származik.
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## figyeljük, hogy a tcp kapcsolatok, tényleg a syn bittel kezdődjenek.
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
## kintről csak ssh hozzáférést akarunk.
## $IPTABLES -A INPUT -p tcp --dport ssh -j ACCEPT
## ez nekem nem kell, ezért kikommenteztem.
## igaz , hogy a forráscímhitelesítés be van kapcsolva,
## de azért biztosra megyünk. A hamis IP címeket kiszűrjük.
$IPTABLES -A INPUT -i IFACE -s 192.168.0.0/16 -j REJECT
$IPTABLES -A INPUT -i IFACE -s 172.16.0.0/12 -j REJECT
$IPTABLES -A INPUT -i IFACE -s 10.0.0.0/8 -j REJECT
## ami jönne, azt loggoljuk:
$IPTABLES -A INPUT -j LOG --log-prefix "nem kellene bejonni"
## utána eldobjuk. Igaz, hogy az alap szabály drop, de azért biztosra megyünk:
$IPTABLES -A INPUT -j DROP
## OUTPUT szabályok.
## loopback -en engedélyezzük a forgalmat.
$IPTABLES -A OUTPUT -o lo -j ACCEPT
## jóváhagyott kapcsolatok engedélyezése.
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## a DNS -re szükség van.
$IPTABLES -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
## http mehet.
$IPTABLES -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
## https mehet
$IPTABLES -A OUTPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
## ssh mehet.
## $IPTABLES -A OUTPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
## ez nekem nem kell, ezért kikommenteztem.
## ftp mehet
$IPTABLES -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
## Ha nem csak webes felületen szeretnénk levelezni.
$IPTABLES -A OUTPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
##kifele menő "ping" -re szükség lehet.
$IPTABLES -A OUTPUT -p icmp -j ACCEPT --icmp-type echo-request
Figyelem! Az eredeti szkriptben több helyen elírás van (ezeket itt már javítottam).
Ezt a szkriptet my_firewall (vagy amilyen néven akarod - persze akkor a xxx.service file-ban is arra kell hivatkozni) néven el kell menteni az /etc/init.d/ könyvtárba és futtathatóvá kell tenni.
root:~# cd /etc/init.d/
chmod 700 my_firewall
Én minden jogot csak a root-nak adtam meg a "Csoport" és az "A többiek" semmilyen jogosultságot sem kaptak!Ez még önmagában nem elég, hiszen így induláskor még nem fog lefutni a tűzfal szkript.
A tűzfal automatikus indítása a számítógép elindításakor
Mivel ezt az iptables utasítást a gépünk nem fogja megjegyezni, ezért külön gondoskodnunk kell róla, hogy minden rendszerindításkor lefusson egy script ami ezeket az utasításokat tartalmazza. Ezt úgy tehetjük meg, hogy a /etc/runlevel.d/default könyvtárba beteszünk egy my_firewall.service nevű file-t a következő tartalommal (a kommentes részt törölni!).
Summary=Firewall
## A szolgáltatás leírása angolul.
Summary[hu]=Tűzfal
## A szolgáltatás leírása magyarul.
Description=Firewall by iptables
## A szolgáltatás leírása angolul (részletes).
Description[hu]=Tűzfal iptables-szel
## A szolgáltatás leírása magyarul (részletes).
Script=/etc/init.d/my_firewall
## A szkriptünk helye.
SupportsReload=no
## Nem támogatjuk a reload-ot.
Runlevels=2345
## A 2-5 futási szinteken fusson a tűzfal.
Sequence=99
##99-es prioritással.
A /etc/runlevel.d/custom könyvtárba szintén beteszünk egy my_firewall.service nevű file-t, ami üres.Az UHU Vezérlőpult / Szolgáltatásoknál alapértelmezettnek beállítani.
Ha mindent jól csináltunk, akkor következő rendszerindításkor a szkriptünk automatikusan le fog futni beállítva ezzel a tűzfalat.
Nézzük meg:
root:~# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
REJECT all -- 192.168.0.0/16 anywhere reject-with icmp-port-unreachable
REJECT all -- 172.16.0.0/12 anywhere reject-with icmp-port-unreachable
REJECT all -- 10.0.0.0/8 anywhere reject-with icmp-port-unreachable
LOG all -- anywhere anywhere LOG level warning prefix `nem kellene bejonni'
DROP all -- anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT udp -- anywhere anywhere udp dpt:domain state NEW
ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:https state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp state NEW,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3 state NEW,ESTABLISHED
ACCEPT icmp -- anywhere anywhere icmp echo-request
root:~#
Még nem ellenőriztem le a működését, de a hétvégén egy "szűz" laptopon kipróbálom. A tapasztalatokat majd természetesen egy új bejegyzésben rögzítem.A következő lépés ennek a tűzfal-szabálynak a finomítása lesz.
SP
Utolsó kommentek