11. Biztonsági beállítások

Az Internetre kapcsolt számítógépet a lehető legbiztonságosabbra kell beállítani. Alapvetően hibás az az elgondolás, hogy semmilyen titkos dolog nincs a kiszolgálón, ugyan ki akarná feltörni? A betörők gyakran igyekeznek védelem nélküli számítógépeket hídfőállásnak használni, és róluk indítani más gépek elleni támadásokat. Ha a betörő a naplóállományokat eltávolítja, lehet, hogy nekünk kell majd magyarázkodni a hatóságoknak…
Minden kiszolgálón a hálózati biztonság különösen fontos. Linux rendszereken a netfilter szolgáltatással a hálózati csomagok szűrését és átalakítását valósíthatjuk meg. Az ilyen csomagszűrésen alapuló védelmet tűzfalnak, angol szóval firewall-nak nevezzük.
A csomagszűrő beállítása előtt módosítsunk néhány beállítást a rendszeren.
 
    11.1. Nem használt szolgáltatások kikapcsolása
 
A CentOS operációs rendszer több olyan szolgáltatást is tartalmaz és alapértelmezés szerint futtat, amelyek nem szükségesek kiszolgálónkon. Fölöslegesen foglalják rendszerünk erőforrásait és biztonsági kockázatot is jelenthetnek. Az induló szolgáltatásokat a következő paranccsal kilistázhatjuk nevük szerint rendezve, sorszámozva:
 
[root@centos5 ~]# chkconfig --list | grep 5:be | sort | cat -n

A képernyőn olvasható, több mint negyven induló szolgáltatás közül kapcsoljuk ki néhányat a következő parancsok kiadásával:

[root@centos5 ~]# chkconfig pcscd off
[root@centos5 ~]# chkconfig bluetooth off
[root@centos5 ~]# chkconfig hidd off
[root@centos5 ~]# chkconfig nfslock off
[root@centos5 ~]# chkconfig portmap off
[root@centos5 ~]# chkconfig rpcgssd off
[root@centos5 ~]# chkconfig rpcidmapd off
[root@centos5 ~]# chkconfig sendmail off
 
A szolgáltatások a rendszer következő indításakor már nem fognak elindulni.
A kikapcsolt szolgáltatások közül érdemes megemlíteni néhányat. A sendmail program a levelek továbbítását végzi. Kiszolgálónk nem fog valódi mail szolgáltatást nyújtani a felhasználóknak, de adminisztrációs és oktatási célokból szükség van a levéltovábbításra. Erre a sendmail helyett postfix programot fogjuk használni. A következő parancsokkal telepítjük a postfix-et, eltávolítjuk a sendmail-t és beállítjuk postfix automatikus indítását.
 
[root@centos5 ~]# yum install postfix
[root@centos5 ~]# yum remove sendmail*
[root@centos5 ~]# chkconfig --levels 235 postfix on
 
A postfix működéséhez az /etc/postfix/main.cf állományba, az INTERNET HOST AND DOMAIN NAMES részbe írjuk be kiszolgálónk nevét (egyedi nevet írjunk!):
 
myhostname = suliserver.suli.uz.ua
 
Elindítjuk a postfix-et:
 
[root@centos5 ~]# service postfix start

    11.2. Az SSH belépés korlátozása
 
 A fokozottabb biztonság érdekében a root felhasználónak általában megtiltják a közvetlen ssh kapcsolat kiépítését. Ebben az esetben felhasználói nevünkkel kell kiépíteni az ssh kapcsolatot, és root jogosultságot a su - paranccsal kérhetünk. Természetesen a root jelszó megadásával.
Nyissuk meg szerkesztésre az /etc/ssh/sshd_config állományt és keressük meg benne a következő sort:
 
#PermitRootLogin yes
 
Azt módosítsuk a következőre:
 
PermitRootLogin no
 
Keressük meg a #UseDNS yes sort és módosítsuk a következőre:
 
UseDNS no
 
Indítsuk újra az ssh szervert:
 
[root@centos5 ~]# service sshd restart
 
Csatlakozzunk saját felhasználói nevünkkel a kiszolgálóhoz és kérjünk root jogosultságot (11.1. ábra).

sshu
11.1. ábra
 
Ezután a WinSCP-vel is csak felhasználóként csatlakozhatunk, és csak saját HOME könyvtárunkba másolhatunk vele állományokat, könyvtárakat.
 
    11.3. Csomagszűrés
 
A Linux csomagszűrő szolgáltatása két feladatot is ellát majd a kiszolgálónkon: megvédi az Internet felőli támadásoktól, és a Squid által nem támogatott szolgáltatások használatát is lehetővé teszi a kliens gépek közül néhánynak.
A csomagszűrő beállítása előtt módosítsuk az /etc/sysconfig/syslog állományt, hogy a rendszerüzenetek ne jelenjenek meg a kiszolgálónk képernyőjén, karakteres felületen.
 
[root@centos5 ~]# mcedit /etc/sysconfig/syslog
 
A KLOGD_OPTIONS sort írjuk át a következőképpen:
 
KLOGD_OPTIONS="-2 -c 1"
 
Indítsuk újra a rendszernaplózó szolgáltatást:
 
[root@centos5 ~]# service syslog restart
 
A következő parancs az /etc/sysctl.conf állomány első hét sorát mutatja:
 
[root@server ~]# head -7 /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0
 
Módosítsuk a net.ipv4.ip_forward értékét 0-ról 1-re és mentsük az állományt. Ezzel engedélyezzük a hálózati eszközök közötti csomagtovábbítást.
Indítsuk újra a hálózatot:
 
[root@centos5 ~]# service network restart
A(z) eth0 csatoló leállítása:                            [  OK  ]
A(z) eth1 csatoló leállítása:                            [  OK  ]
A visszacsatolási eszköz leállítása:                   [  OK  ]
Visszacsatolási eszköz indítása:                       [  OK  ]
A(z) eth0 csatoló aktiválása:                          [  OK  ]
A(z) eth1 csatoló aktiválása:                          [  OK  ]
[root@centos5 ~]#
 
Magát a csomagszűrést a Linux kernelében egy programrész végzi, és a rendszergazda az iptables programmal konfigurálhatja működését. A programrész képes a beérkező (INPUT), a kimenő (OUTPUT) és az áthaladó (FORWARD) csomagok vizsgálatára, szűrésére és módosítására. Ezzel a három szabálylistával indul rendszer, amiket láncoknak nevezünk. Egy bejövő csomag, ha célja maga szerver az INPUT láncba kerül, ha nem, akkor a FORWARD láncba. Ha a kiszolgáló maga akar csomagokat küldeni, azok az OUTPUT láncba kerülnek.
A csomagokon többféle műveletet tudunk végezni: elfogadjuk (ACCEPT), eldobjuk (DROP), visszautasítjuk (REJECT), naplózzuk (LOG). Ezeknek a műveleteknek a végrehajtását különböző szempontok szerint szabályozhatjuk: célcím, forráscím, protokoll, portszám stb.
A csomagszűrő szabályok tervezésénél érdemes Rusty Russell útmutatásait figyelembe venni:
 
„Általános bölcsesség a számítógépes biztonságban, hogy mindent le kell zárni, és ezután egyesével megnyitni azokat a lyukakat, melyeket szükségesnek tartunk. Ezt általában úgy jellemzik, hogy "minden, amit nem engedek meg kifejezetten, az tiltva van". Ajánlom ezt a megközelítést, ha a biztonság az alapvető célod. Ne futtass olyan szolgáltatást, amit nem szükséges futtatnod, vagy ha úgy gondolod, akadályozd meg hogy hozzáférjenek.
Ha tűzfalat építesz, úgy kezdd, hogy ne fusson rajta semmi, és minden forgalmat tiltson ki. Ezután egyesével add hozzá a szolgáltatásokat és engedélyezd azokat a csomagokat, amelyek ezt igénybe veszik. ”
 
Az iptables használatát részletesen nem fogjuk itt tárgyalni. Amennyiben lényegi változtatást eszközölnénk az általam javasolt szabályrendszeren, mindenképp ismerkedjünk meg az alapjaival. Nyomtatásban kiváló leírást olvashatunk többek között a következő könyvekben: Pere László: „GNU/Linux rendszerek üzemeltetése II. Hálózatok” című könyvében, Gregor N. Purdy: „Linux iptables zsebkönyv”. Az Interneten is számos helyen találunk használható leírást magyar nyelven.

Másoljuk át a http://kmf.uz.ua/centos/gui/server5.zip csomagban lévő tuzfal.scp állományt a /root könyvtárba. Állítsuk be a jogosultságokat:
 
[root@centos5 ~]# chown root:root /root/tuzfal.scp
[root@centos5 ~]# chmod 755 /root/tuzfal.scp
 
Vizsgáljuk meg vázlatosan a script működését. Az első sorokban változóknak adunk értékeket. A többségük már ismerős. Módosítsuk a beírt IP címeken, az IP_EXT értékét biztosan módosítani kell, szerverünk külső hálózati kártyájának IP címét írva oda. A 192.168.55.0/24 belső hálózatunk címe és az alhálózati maszk rövidített beírása (24 = 255.255.255.0, tehát a 32 bites számban az 1-ek száma). Az SMTPIP és a POP3IP a szolgáltatónk által megadott SMTP és POP3 szerverek IP címei. A szolgáltatótól valószínűleg kaptunk e-mail címeket és ezekhez tartozó SMTP és POP3 kiszolgálói adatokat. Határozzuk meg a host paranccsal ezekhez tartozó IP címeket:
 
[root@centos5 ~]# host smtp.bereg.net.ua
smtp.bereg.net.ua has address 194.88.152.1
[root@centos5 ~]# host pop3.bereg.net.ua
pop3.bereg.net.ua has address 194.88.152.2

Természetesen a saját szolgáltatónk által megadott kiszolgálóneveket írjuk be. Az IP címeket írjuk be a szkript megfelelő soraiba. Ez sajnos azt is jelenti, hogy ha a szolgáltatónk megváltoztatja mail szervereinek IP címeit, akkor itt ismét módosítani kell, és addig nem fog működni a levelezés a kliensgépeken.
Amennyiben a szolgáltatótó nem biztosít e-mail címet, vagy azt nem SMTP/POP3 protokollon érjük el, töröljük azokat a sorokat, amelyek az SMTPIP és a POP3IP változókat tartalmazzák.
A tuzfal.scp szkriptben a „start” és a „;;” sorok közötti rész tartalmazza azokat a szabályokat és parancsokat, melyek a /root/tuzfal.scp start parancs kiadásakor végrehajtódnak. A szkript indításakor megjeleníti hálózat alapbeállításait:

[root@centos5 ~]# /root/tuzfal.scp start
indul....
----------------------------------------------------------------
A belso halo: 192.168.55.0/24
----------------------------------------------------------------
          A tuzfal BELSO halokartyaja:  eth1
          inet addr:192.168.55.1  Bcast:192.168.55.255  Mask:255.255.255.0
----------------------------------------------------------------
          A tuzfal KULSO halokartyaja:  eth0
          inet addr:192.168.4.2  Bcast:192.168.4.3  Mask:255.255.255.252
----------------------------------------------------------------
A tuzfal csomagszuroinek betoltese
[root@centos5 ~]#
 
Ebben a részben néhány kernel paraméter beállítása után az alapértelmezett tiltás beállítása következik, aztán a beérkező szabályok sorai következnek. A szabályok előtt magyarázatokat olvashatunk. Így egyszerűen módosíthatóak. A beérkező (INPUT) szabályokat nem feltételen kell módosítani: engedélyezett csak a belső hálóról a http (webszerver), SSH (PuTTY-val, WinSCP-vel csatlakozhatunk bármelyik belső IP-ről), DNS kérés, SAMBA (fájlszerver), proxy-szerver és az icmp protokoll (ping parancs). Az Internet felől csak az icmp engedélyezett. A szolgáltató tehát a ping paranccsal le tudja ellenőrizni a kapcsolat meglétét a kiszolgálónkkal, de semmilyen szolgáltatását nem tudja igénybe venni. Tekintsünk át a beérkező csomagokra vonatkozó szabályok közül az elsőt:
 
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 80 -m state --state NEW -j ACCEPT
 
Ez a sor a belső hálózati interface-re érkező (-i $IFACE_INT, ahol az IFACE_INT változó értéke eth1, tehát esetünkben -i eth1) TCP protokollú (-p tcp) a belső hálózatunk valamelyik IP címével rendelkező hostról érkező (-s $NET_INT, esetünkben -s 192.168.55.0/24) csomagokat engedélyezünk (-j ACCEPT), a melyek a célkapu értéke 80 ( --dport 80).  Mivel a 80-as porton a webszerver működik, a webszervert tettünk elérhetővé a belső hálózat gépeinek.
 
A kimenő szabályok (OUTPUT) engedélyezik, hogy a kiszolgáló DNS szerverekhez csatlakozzon, http, https és ftp protokollon csatlakozzon külső kiszolgálókhoz, leveleket küldjön (ezt a sort akár ki is kapcsolhatjuk a sor elején # jellel) és engedélyezve van a belső háló felé a SAMBA által használt portok.
A továbbítási (FORWARD) szabályokat a következő fejezetben részletesebben is tárgyaljuk.

 
Ezután néhány biztonsági beállítás következik, majd az open sor után az a rész, ami a tűzfalat kikapcsolja. Ehhez a /root/tuzfal.scp open parancsot kell kiadni, de éles rendszeren ez nem ajánlott. A stop paraméterrel indítva minden szabályt kikapcsol és csak az alapértelmezett elutasítás marad. Restart vagy reload paraméterrel történő indítás egyenértékű a stop és a start egymás utáni használatával.

A tuzfal.scp program start paraméterrel futtatva beállítja a megfelelő szabályokat, viszont a számítógép újraindításakor ezek elvesznek. Ahhoz, hogy elmentsük a beállításokat, ki kell adni a service iptables save parancsot is:
 
[root@centos5 ~]# service iptables save
A tűzfalszabályok mentése ide: /etc/sysconfig/iptables:    [  OK  ]
 
A tűzfalbeállításokat a rendszer az /etc/sysconfig/iptables szöveges állományba menti, ahonnan induláskor visszatölti. Az aktuális szabályokat ellenőrizhetjük a következő paranccsal:
 
[root@centos5 ~]# service iptables status
 
A tuzfal.scp nem csak az iptables szabályokat állítja be, hanem kernel modulokat is betölt és biztonsági beállításokat módosít. Kiszolgálónk indulásakor ezeket újra be kell állítani. Oldjuk meg, hogy az operációs rendszer indulásakor automatikusan megtörténjen. A következő parancs ezt valósítja meg:
 
[root@centos5 ~]# echo "/root/tuzfal.scp start" >> /etc/rc.d/rc.local
 
Az rc.local állomány a rendszer indulásakor, a szolgáltatások elindulása után lefut, és ezután az utolsó sora meghívja a tűzfal szkriptet start paraméterrel.
 
    11.4. Címfordítás
 
A tuzfal.scp továbbítási (FORWARD) szabályok része különösen fontos, hiszen azt a részt biztosan módosítani kell. Tulajdonképpen a belső gépeink e nélkül is tudják használni az Internetet a Squid-en keresztül: a kiszolgálónknak engedélyeztük, hogy csatlakozzon webszerverekhez, a klienseknek pedig azt, hogy használják a 8080-as portot és ott a proxy szerver figyel.
 
Ez a rész valójában csak egy privilegizált gép (pl. a saját gépünk: 192.168.55.172) szabályait tartalmazza. Mint már említettem, vannak az Interneten olyan szolgáltatások, amelyek nem használhatóak proxy kiszolgálóval. Ezek közül először a mail szerverhez történő csatlakozást nézzük át.
A következő sor engedélyezi a GEP2, tehát a 192.168.55.172-es gép által küldött bármilyen protokollú (tcp, udp vagy icmp) csomagok továbbítását:
 
$IPTABLES -A FORWARD -s $GEPIP2 -j ACCEPT
 
Ezt a részt követő négy $IPTABLES kezdetű sor azokra a csomagokat vonatkozik, amelyeket a kliens gép a szolgáltatónk SMTP és POP3 kiszolgálójához küld. Ezeket a Linux kernel az iptables NAT táblájának segítségével naplózza és átalakítja, majd úgy küldi tovább, mint a sajátjait. Az ezekre érkező válaszokat a kernel szintén átalakítja és 192.168.55.172-es gépnek küldi. Tehát az adott szolgáltatást úgy használja a gépünk, mintha közvetlen Internet-kapcsolata lenne. Figyeljük meg, hogy ebben az esetben a célport (--dport 25) és a cél IP (-d $SMTPIP) is meghatározott. A többi szabályt nem fogjuk ennyire szigorúan meghatározni, de ezt a protokollt előszeretettel használják vírusok is levéltovábbításra. Lehetőleg csak olyan kliens gépekre alkalmazzuk, amelyeken megfelelően beállított vírusellenőrző program, valamint spyware (kémprogram) és adware (reklámokkal zavaró beépülő program) eltávolító programok is telepítve vannak.
A GEP2-re vonatkozó alábbi sorok lehetővé teszik, hogy az igen népszerű gmail.com rendszert használjuk Outlook Express vagy más hasonló programmal:
 
# CIMFORDITAS gmail levelek ki + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 465 -o $IFACE_EXT -j LOG  --log-prefix "gmail ki-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 465 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# CIMFORDITAS gmail levelek be + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 995 -o $IFACE_EXT -j LOG  --log-prefix "gmail be-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 995 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
 
Természetesen a gmail.com mellett más cég is nyújt hasonló szolgáltatást. Ha van valamilyen webmail postafiókunk, a honlapján tájékozódjunk, hogy van-e ilyen szolgáltatásuk. Olvassuk el a kliens beállításának leírását, abból kiderül, hogy mely portokon működik.
Mivel mindkét szolgáltatás azonosítással és titkosítással működik, itt nem ellenőrizzük a célcímet csak a célportot. Valójában ezeken a portokon nyújtott szolgáltatások bármilyen kiszolgálóról működni fognak.
 
Az utolsó részben a hálózat működésének ellenőrzéséhez használt ping és tracert (Linux munkaállomás esetén traceroute) parancsokat engedélyezzük a GEP2 munkaállomásnak.
Ellőnizzük le az utóbbi két kódrészlet működését. A kiszolgálón a teminálablakba adjuk ki a következő  a tail -f /var/log/messages  parancsot, amivel megfigyelhatjük a messages napjóállomány új sorait. A GEP2-n indítsunk el egy parancssort és adjuk ki a tracert mon.gov.hu és a ping origo.hu parancsokat (11.2. ábra).
 
pt
11.2. ábra
 
Látjuk, hogy mindkét parancs sikeresen végrehajtógott, és a messages álomány a következő öt új sort tartalmazza:
 
[root@centos5 ~]# tail -f /var/log/messages
Mar 29 00:13:41 centos5 kernel: NAT icmp g2 IN= OUT=eth0 SRC=192.168.55.172 DST=212.111.193.189 LEN=92 TOS=0x00 PREC=0x00 TTL=1 ID=9254 PROTO=ICMP TYPE=8 CODE=0 ID=768 SEQ=65281
Mar 29 00:14:44 centos5 kernel: NAT icmp g2 IN= OUT=eth0 SRC=192.168.55.172 DST=195.228.240.145 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=9328 PROTO=ICMP TYPE=8 CODE=0 ID=768 SEQ=15874
Mar 29 00:14:45 centos5 kernel: NAT icmp g2 IN= OUT=eth0 SRC=192.168.55.172 DST=195.228.240.145 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=9329 PROTO=ICMP TYPE=8 CODE=0 ID=768 SEQ=16130
Mar 29 00:14:46 centos5 kernel: NAT icmp g2 IN= OUT=eth0 SRC=192.168.55.172 DST=195.228.240.145 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=9330 PROTO=ICMP TYPE=8 CODE=0 ID=768 SEQ=16386
Mar 29 00:14:48 centos5 kernel: NAT icmp g2 IN= OUT=eth0 SRC=192.168.55.172 DST=195.228.240.145 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=9331 PROTO=ICMP TYPE=8 CODE=0 ID=768 SEQ=16642

 
A kiszolgáló fordította és naplózta a 192.168.55.172 IP címmel rendelkező gép hálózati csomagjait. A tail -f parancs végrehajtását a Ctrl+C billentyűkkel szakíthatjuk meg.
 
Ellenőrizzük a levelek fogadását és továbbítását. Először állítsuk be a postafiókot. A kliens program beállításának két részletét a 11.3. ábra mutatja. Fióknévnek, természetesen, saját azonosítónkat adjuk meg.

gm1 g2
11.3. ábra
 
Levél küldésekor és fogadásakor az alábbi sorok jelennek meg a messages állományban:
 
[root@centos5 ~]# tail -f /var/log/messages
Mar 29 00:40:32 centos5 kernel: gmail ki-g2 IN= OUT=eth0 SRC=192.168.55.172 DST=209.85.129.109 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9449 DF PROTO=TCP SPT=1159 DPT=465 WINDOW=65535 RES=0x00 SYN URGP=0
Mar 29 00:40:40 centos5 kernel: gmail ki-g2 IN= OUT=eth0 SRC=192.168.55.172 DST=209.85.129.109 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9490 DF PROTO=TCP SPT=1161 DPT=465 WINDOW=65535 RES=0x00 SYN URGP=0
Mar 29 00:40:47 centos5 kernel: gmail be-g2 IN= OUT=eth0 SRC=192.168.55.172 DST=72.14.221.111 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9563 DF PROTO=TCP SPT=1163 DPT=995 WINDOW=65535 RES=0x00 SYN URGP=0

Amennyiben más kliensgépeknek is akarunk a fenti szolgáltatások valamelyikét nyújtani, akkor az adott szövegrészt a Midnight Commander editorával kijelölhetjük és másolhatjuk. (F3-kijelölés kezdete, iránybillentyűkkel kijelölés, ismét F3 kijelölés vége és az F5 a kurzor pozíciójába beilleszt.) Az átmásolt sorokban kijavítjuk az IP címet és a --log-prefix utáni részt. Így minden gép forgalmát be tudjuk azonosítani a /var/log/messages állományban.
 
Természetesen arra is van mód, hogy egy gépnek minden szolgáltatást biztosítsunk a kiszolgálón keresztül az Internet felé. A következő néhány sorban arra látunk példát, hogy a 192.168.55.101 IP címmel rendelkező, tehát a GEP1 gép minden csomagját NAT-olja a kiszolgáló, függetlenül portszámtól, a protokolltól vagy célcímtől. Ezt a csak olyan gépre alkalmazzuk, ahol a felhasználóban megbízunk, hiszen az adott gép bármelyik programja küldhet adatokat az Internet felé. Egy vírusfertőzés eseten ennek kellemetlen következményei lehetnek. Több program a háttérben kéretlenül is forgalmat bonyolíthat, fölöslegesen terhelve ezzel a hálózatot. A GEP1 az egész sávszélességet elfoglahatja ilyenkor, külünösen P2P progamokat használva.
Az alábbi sorok naplózást is beállítanak ezekre a csomagokra. Ez rövid idő alatt igen nagyméretű messages állományt eredményezhet. Viszont kikapcsolva a naplózást, csak az MRTG grafikonjából vagy az IPTraf prgrammal következtethetünk az adott kliens gép hálózati forgalmára.
 
$IPTABLES -A FORWARD -s $GEPIP1 -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -s $GEPIP1 -o $IFACE_EXT -j LOG  --log-prefix "NAT-gep1 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP1 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
 
Ahhoz, hogy a módosított tűzfalszabályok érvényre jussanak le kell futtatni a szkriptet ismételten start paraméterrel:
 
[root@server ~]# /root/tuzfal.scp start
 
A szabály mentéséhez, pedig a következő parancsot is ki kell adni:
 
[root@server ~]# service iptables save
 
FONTOS!
Amennyiben dinamikusan változó IP címet kapunk a szolgáltatótól, például PPPoE protokollt használó ADSL kapcsolat esetén, a címfordítás részben mindenhol a „-j SNAT --to-source $IP_EXT” helyett a „-j MASQUERADE” -et kell használni. Módosítani kell az állomány harmadik sorát is: IFACE_EXT=ppp0

    11.5. A tuzfal.scp állomány
 
#!/bin/bash
# Vezessunk be nehany valtozot:
IFACE_EXT=eth0
IFACE_INT=eth1
NET_INT=192.168.55.0/24
# kulso, belo IP cim, SMTP, POP3 serverek:
IP_EXT=192.168.4.2
IP_INT=192.168.55.1
SMTPIP=194.88.152.1
POP3IP=194.88.152.2
# Nehany spec. gep a belso halon:
GEPIP1=192.168.55.101
GEPIP2=192.168.55.172
GEPIP3=192.168.55.182
#
IPTABLES=/sbin/iptables
case "$1" in
start)
echo "indul...."
# Nehany biztonsagi beallitas:
# Enable broadcast echo protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable source routed packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
# Enable TCP SYN cookie protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# Don't send Redirect messages
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f
done
# Drop spoofed packets coming in on an interface, which if replied to,
# would result in the reply going out a different interface
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
# Log packets with impossible addresses
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f
done
# IP-tovabbitas a kernelben
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "----------------------------------------------------------------"
echo "A belso halo:"    $NET_INT
echo "----------------------------------------------------------------"
echo "          A tuzfal BELSO halokartyaja: " $IFACE_INT
/sbin/ifconfig $IFACE_INT | grep "inet addr"
echo "----------------------------------------------------------------"
echo "          A tuzfal KULSO halokartyaja: " $IFACE_EXT
/sbin/ifconfig $IFACE_EXT | grep "inet addr"
echo "----------------------------------------------------------------"
echo "A tuzfal csomagszuroinek betoltese"
# Eloszor a kernel modulokat toltjuk be:
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
# A regi szabalyokat es a regi egyeni tablakat toroljuk
$IPTABLES --flush
$IPTABLES --delete-chain
$IPTABLES --flush -t nat
$IPTABLES --delete-chain -t nat
$IPTABLES -t mangle -F
$IPTABLES -X
#
# Alapertelmezett visszautasitasi szabalyok
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
#
# A loopback interface-nek szabad kezet
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I OUTPUT -o lo -j ACCEPT
#
#-----------------------------------------------------------------------
# Beerkezo szabalyok
#-----------------------------------------------------------------------
# A korabban mar jovahagyott kapcsolatok reszekent beerkezo csomagok elfogadasa
$IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
#
# Minden TCP kapcsolatnak a SYN kifejezessel kell kezdodnie:
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Rejt. letepogatasi kiserlet?"
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Webservert a belso halora
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 80 -m state --state NEW -j ACCEPT
# POP3
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s 192.168.55.172 --dport 110 -m state --state NEW -j ACCEPT
# SSH a belso halorol. Ezt lehetne korlatozni IP(k)-re...
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 22 -m state --state NEW -j ACCEPT
#
# SMTP a belso halorol + log. Ezt lehetne korlatozni IP(k)-re...
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 25 -m state --state NEW -j LOG --log-prefix " level SMTP"
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 25 -m state --state NEW -j ACCEPT
# A DNS-t a belso gepeknek
$IPTABLES -A INPUT -p udp -s $NET_INT --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -s $NET_INT --dport 53 -m state --state NEW -j ACCEPT
# SAMBA a belso gepeknek
$IPTABLES -A INPUT -p udp -s $NET_INT --dport 137 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p udp -s $NET_INT --dport 138 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -s $NET_INT --dport 139 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p tcp -s $NET_INT --dport 445 -m state --state NEW -j ACCEPT
# DHCP server
$IPTABLES -A INPUT -p udp -s $NET_INT --dport 67 -m state --state NEW -j ACCEPT
# Pingek a belso halozatnak
$IPTABLES -A INPUT -s $NET_INT -p icmp -j ACCEPT
# Pingek kivulrol
$IPTABLES -A INPUT -i $IFACE_EXT -p icmp -j ACCEPT
# Proxy hozzaferes a belso halonak:
$IPTABLES -A INPUT -p tcp -i $IFACE_INT -s $NET_INT --dport 8080 -m state --state NEW -j ACCEPT
# Naplozz mindent, amit fent elutasitottal:
$IPTABLES -A INPUT -j LOG --log-prefix "Visszautasitva (INPUT):"
$IPTABLES -A INPUT -j DROP
#
#----------------------------------------------------------------------
# Kimeno szabalyok
#----------------------------------------------------------------------
# Amennyiben jovahagyott kapcsolatok reszet kepezik, engedd ki
$IPTABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# A kimeno pingek engedelyezese
$IPTABLES -A OUTPUT -p icmp -j ACCEPT
# Kimeno traceroute
$IPTABLES -A OUTPUT -p udp --sport 1024:65535 -d 0/0 --dport 33434:33523 -j ACCEPT
# A kimeno DNS lekerdezesek engedelyezese:
$IPTABLES -A OUTPUT -p udp --dport 53 -j ACCEPT
# A kimeno http engedelyezese:
$IPTABLES -A OUTPUT -p tcp --dport 80 -j ACCEPT
# A kimeno https engedelyezese
$IPTABLES -A OUTPUT -p tcp --dport 443 -j ACCEPT
# A kimeno ssh engedelyezese
# $IPTABLES -A OUTPUT -p tcp --destination-port 22 -j ACCEPT
# A kimeno ftp engedelyezese
$IPTABLES -A OUTPUT -p tcp --dport 21 -j ACCEPT
# A kimeno mail engedelyezese + log
$IPTABLES -A OUTPUT -p tcp --dport 25 -j LOG  --log-prefix "mail-ki "
$IPTABLES -A OUTPUT -p tcp --dport 25 -j ACCEPT
#
# SAMBA
$IPTABLES -A OUTPUT -p udp -d $NET_INT --dport 137 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $NET_INT --dport 138 -j ACCEPT

$IPTABLES -A OUTPUT -p tcp -d $NET_INT --dport 139 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -d $NET_INT --dport 445 -j ACCEPT

$IPTABLES -A OUTPUT -p udp -d $NET_INT --sport 137 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -d $NET_INT --sport 139 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -d $NET_INT --sport 445 -j ACCEPT
#
# NTP (pontos ido keres + log)
$IPTABLES -A OUTPUT -p udp --dport 123 -j LOG  --log-prefix "ntp-kiszolgalohoz "
$IPTABLES -A OUTPUT -p udp --dport 123 -j ACCEPT
#
# Naplozz mindent, amit elutasitottal:
$IPTABLES -A OUTPUT -j LOG --log-prefix "Visszautasitva (OUTPUT):"
$IPTABLES -A OUTPUT -j DROP
#
#----------------------------------------------------------------------
# Tovabbitasi szabalyok
#----------------------------------------------------------------------
# A korabban mar jovahagyott kapcsolatok reszekent tovabbitando csomagok
$IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
#
# Minden TCP kapcsolatnak a SYN kifejezessel kell kezdodnie:
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Letepogatasi kiserlet?"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#
# ------------------------------------------ A GEP2 beallitasai ------------------------
$IPTABLES -A FORWARD -s $GEPIP2 -j ACCEPT
# CIMFORDITAS Levelek ki + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -d $SMTPIP -p tcp --dport 25 -o $IFACE_EXT -j LOG  --log-prefix "mail ki-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -d $SMTPIP -p tcp --dport 25 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# CIMFORDITAS Levelek be + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -d $POP3IP -p tcp --dport 110 -o $IFACE_EXT -j LOG  --log-prefix "mail be-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -d $POP3IP -p tcp --dport 110 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# CIMFORDITAS gmail levelek ki + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 465 -o $IFACE_EXT -j LOG  --log-prefix "gmail ki-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 465 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# CIMFORDITAS gmail levelek be + log
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 995 -o $IFACE_EXT -j LOG  --log-prefix "gmail be-g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p tcp --dport 995 -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# Ping, traceroute (csak ha kell)
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p icmp -o $IFACE_EXT -j LOG  --log-prefix "NAT icmp g2 "
$IPTABLES -t nat -A POSTROUTING -s $GEPIP2 -p icmp -o $IFACE_EXT -j SNAT --to-source $IP_EXT
# ---------------------------------------------------------------------------------------
#
# Syn-flood elleni vedelem:
$IPTABLES -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
# Portscan elleni vedelem:
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# Ping-flood elleni vedelem:
$IPTABLES -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Logoljuk amit nem FORWARD-ol
$IPTABLES -A FORWARD -j LOG --log-prefix "Visszautasit(FWD)! "
$IPTABLES -A FORWARD -j DROP
#
;;
# Ez az amit nem szabad:
open)
echo "VIGYAZAT! A tuzfal kikapcsolasa! MEGORULTEL??!!"
#
$IPTABLES --flush
$IPTABLES --delete-chain
$IPTABLES --flush -t nat
$IPTABLES --delete-chain -t nat
$IPTABLES -t mangle -F
$IPTABLES -X
#
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
;;
# Kikapcsol minden tuzfalszabalyt, csak az alapertelmezett elutasitas marad
# Kenelben IP-tovabbitas ki
stop)
echo "A tuzfal leallitasa zart allapotban!"
echo 0 > /proc/sys/net/ipv4/ip_forward
$IPTABLES --flush
;;
status)
echo "A iptables allapotanak lekerdezese..."
echo " (valojaban az iptables-save parancs vegrehajtasa)..."
$IPTABLES-save
;;
restart|reload)
 $0 stop
 $0 start
;;
*)
echo "Statusz: $0 {start|open|stop|status|restart|reload}"
exit 1
;;
esac
exit 0