Alap tűzfal otthoni PC-re (iptables I) Ez egy nagyon nagy téma, én csak az alapokat szeretném megmutatni a teljesség igénye nélkül. Elsősorban fontosnak tartom leírni, hogy a szabályokat egy fájlban fogjuk elhelyezni amit létrehozhatunk például a /usr/local/sbin/ könyvtárban firewall_start.sh néven (pl). Iptables Adminisztrációs eszköz az Ipv4 csomagszűréshez és NAT-oláshoz. (részlet az iptables manualból) Az iptables a hálózati rétegben működik, vagyis IP csomagokkal dolgozik. Szabályokat (rules) lehet vele felállítani amiket táblákba szervez. Három default (alapértelmezett) lánc (chain) létezik: – – –
INPUT OUTPUT FORWARD
- a kintről befelé érkező csomagokra match-el - a bentről kimenő csomagokra match-el - az adott gépen átmenő csomagokra match-el
Megj.: van még kettő (PREROUTING és POSTROUTING) de azok nem tartoznak bele ebbe a leírásba. Talán egy későbbiben. Hozhatunk létre saját láncokat is. Lánc műveletek: -N
új lánc létrehozása pl.: iptables -N in_attack - létrehozza az in_attack láncot.
-P
lánc policy beállítása pl.: iptables -P INPUT DROP – ez a parancs beállítja az INPUT lánc policy-ját DROP-ra ami azt jelenti, hogy ha az INPUT láncban szereplő szabályok közül egyikre sem match-el egy csomag, akkor el lesz dobva. -F
töröl minden szabályt pl.: iptables -F – minden létező szabályt töröl, de nem változtatja meg a policy-jét!! -L kilistázza a szabályokat, az egészet, vagy csak egy láncét pl.: iptables -L INPUT - kilistázza az INPUT lánc összes szabályát. -X
törli az üres láncokat pl.: iptables -X
láncok
Ennyi elmélet kezdésnek, a többit gyakorlati példákkal mutatnám be. Először hozzuk létre a fájlt a tűzfal szabályoknak (terminálban) és tegyük futtathatóvá: Senki ne másolja be az általam írt parancsot, mindenki vegye a fáradtságot és kézzel írja be. $ sudo touch /usr/local/sbin/firewall_start.sh $ sudo chmod +x /usr/local/sbin/firewall_start.sh
Ezután már az elejét meg tudjuk írni: $ sudo mcedit /usr/local/sbin/firewall_start.sh # mcedit helyett bármi lehet (nano, gedit, vi, vim ...)
A tartalma pedig egyelőre: 1 2 3 4 5 6
#!/bin/bash iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
A sorokat a magyarázás miatt számoztam be. 1. sor megadja az értelmező shellt 2. sor törli az összes szabályt 3. sor törli az üres láncokat (-F miatt már mind üres) 4. 5.6.sor beállítja a policy-ket DROP-ra Az INPUT és az OUTPUT láncot is azzal célszerű kezdeni, hogy a lo (localhost) felé és felől engedünk mindent: iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT
Az „iptables” a program neve. A „-A INPUT|OUTPUT” mondja meg, hogy melyik láncra érvényes a szabály. A „-i” és „-o” a bejövő és kimenő interfészt jelenti. Vagyis a „-i lo” = bejövő interfész a localhost. „-j ACCEPT” határozza meg a csomagok sorsát amik illeszkednek erre a szabályra. a sorsok lehetnek: ACCEPT; DROP. Amit még fontos betenni minden tűzfal szabályok közé: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
A „-m state –state ESTABLISHED,RELATED” a csomag állapotára utal. Vagyis
azokra a csomagokra vonatkozik a szabály amik tőlünk indult csomagokra érkező válaszok. Tehát nem lehet köztük NEW (syn) csomag. Jó tanács, hogy kifelé sem engedünk minden NEW csomagot, hiszen egy jó tűzfalban szűrni kell az OUTPUT láncot is. Vannak akik ezzel nem értenek egyet.
Tűzfal beállítása Most mérjük fel az igényeket, mert ettől a ponttól egyedi esetek állnak fent. Most számoljunk azzal, hogy a szkriptet készítő felhasználó a következőket szeretné: internet (HTTP, HTTPS), MSN, IRC, levelezés és FTP. Internet:
80(HTTP)/tcp 443(HTTPS)/tcp
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
Ez egy egyszerű szabály ami kiengedi azokat a csomagokat amik TCP csomagok (-p tcp) és a célportjuk 80 és 443 (--dport 80|443). A 443-as port a HTTPS portja. Csakhogy ezzel még nem fok működni a böngészés, hiszen ezt a lépést megelőzi az IP cím felderítés (felodás [resolve]) DNS segítségével. iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Így most már kiengedjük az 53-as célportú udp csomagokat is, amik a DNS szerverek felé mennek majd. A válasz befogadásáról nem kell külön gondoskodnunk, hiszen már van egy erre a célra írt szabályunk. (iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT, ezt a sort érdemes az OUTPUT lánc legelejére tenni (az lo lánc szabály után) mivel a legtöbb csomag valoszinűleg erre fog matchelni, s így nem kell áthladnia az összes többi láncon)
MSN: 1863/tcp iptables -A OUTPUT -p tcp --dport 1863 -j ACCEPT
IRC: 6667/tcp iptables -A OUTPUT -p tcp --dport 6667 -j ACCEPT
Levelezés:
25(SMTP)/tcp 465(SMTPS)/tcp 143(IMAP)/tcp 993(IMAPS)/tcp 110(POP3)/tcp 995(POP3S)/tcp
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT iptables -A OUTPUT -p tcp --dport 465 -j ACCEPT
iptables iptables iptables iptables
-A -A -A -A
OUTPUT OUTPUT OUTPUT OUTPUT
-p -p -p -p
tcp tcp tcp tcp
--dport --dport --dport --dport
143 993 110 995
-j -j -j -j
ACCEPT ACCEPT ACCEPT ACCEPT
FTP: 20(FTP-DATA)/tcp 21(FTP)/tcp iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT modprobe ip_conntrack_ftp
A 3. sor egy FTP modul betöltése. Összefoglalva és egyszerűsítve: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#!/bin/bash # modulok betolltese modprobe ip_conntrack_ftp iptables iptables iptables iptables iptables
-F -X -P INPUT DROP -P OUTPUT DROP -P FORWARD DROP
# INPUT lanc iptables -A INPUT iptables -A INPUT iptables -A INPUT iptables -A INPUT
-i -m -j -j
lo -j ACCEPT state –state ESTABLISHED,RELATED -j ACCEPT LOG --log-prefix „INPUT_DROP: ” DROP
# OUTPUT lanc iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m multiport --dport 20,21,25,80,110,/ /143,443,465,993,995,1863,6667 -j ACCEPT iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -j LOG --log-prefix „OUTPUT_DROP: ” iptables -A OUTPUT -j DROP
Lényegében ez egy nagyon egyszerű, de a semminél mégis lényegesen több tűzfal. Mind a két láncban van két utolsó „ismeretlen” szabály. 15. és 24. sor: sorsa LOG. Loggol (naplóz) minden csomagot ami nem illeszkedett egyetlen szabályra sem. 16. és 25. sor Loggolás után eldob minden csomagot ami egyetlen előző szabálya sem illeszkedett. Tipp: A logot ki lehet kapcsolni, de én ezzel a módszerrel derítettem ki, hogy egyes alkalmazások milyen portokon szeretnének kommunikálni. A módszer:
$ tail -f /var/log/messages
Hagyni kell had fusson, majd elindítani a kérdéses alkalmazást és figyelni kell, milyen csomagokat dob el. A log-ban benne lesz, hogy milyen cél vagy forrás portot igényel és az tcp vagy udp -e. Én szeretem bekapcsolva hagyni a logot, de hogy mégsem legyen sok felesleges log, van még pár szabály a tűzfalamban: iptables -A INPUT -p tcp -m multiport /5900,6881 -j DROP iptables -A INPUT -p udp -m multiport /5900 -j DROP
--dport 135,137,139,445,1026,1027,/ --dport 135,137,139,445,1026,1027,/
Ezeket a 14. sor után tettem be. Így ezeket a csomagokat log nélkül eldobja. 135/tcp 137/tcp 139/tcp 445/tcp 1026/tcp 1027/tcp -
epmap, netbios-ns, netbios-ssn microsoft-ds nem szabványos port nem szabványos port
135/udp 137/udp 139/udp 445/udp 1026/udp 1027/udp -
epmap, netbios-ns, netbios-ssn microsoft-ds nem szabványos port nem szabványos port
# Location Service # NETBIOS Name Service # NETBIOS session service # Microsoft Naked CIFS
Ezzel kész egy egyszerű tűzfal szkript ami a /usr/local/sbin/firewall_start.sh fájlban van. Következő lépések: $ sudo touch /etc/init.d/firewall.sh $ sudo chmod +x /etc/init.d/firewall.sh $ sudo mcedit /etc/init.d/firewall.sh
A következőket írjuk bele: #!/bin/bash case "$1" in start) /usr/local/sbin/firewall_start.sh ;; stop) /usr/local/sbin/firewall_stop.sh ;; esac
Ez egy kis indítószkript, amit szintén tovább lehet fejleszteni majd. De most a célnak megfelel, csak arra kell, hogy a tűzdal szkriptünk automatikusan
lefusson rendszerindításkor. Még egy dolog maradt hátra. $ sudo ln -s /etc/init.d/firewall.sh /etc/rc2.d/S01Firewall
Rc2.d könyvtárba akkor, ha a futási szint 2. Alapértelmezetten 2, de ellenőrizzük le: budacsik@budacsik-desktop:~$ runlevel N 2
Ki lehet próbálni, de mielőtt restartolunk, még egyszer nézzünk át mindent. Tipp: Az összes port listáját meg lehet nézni a /etc/services fájlban. Kiegészítés: Minden esetben csak simán az „iptables” parancsot használtam. Sokan más formában írják meg, és talán igazuk van. A szkript elején létrehozzák a parancsok változóit. Az iptables parancs helye: (which iptables) /sbin/iptables Tehát a szkript eleje így néz ki: 1 2 3 4 5 6 7 8 9 10 11 12
#!/bin/bash # valtozok deklaralasa IPTABLES=”/sbin/iptables” # modulok betolltese modprobe ip_conntrack_ftp $IPTABLES $IPTABLES $IPTABLES $IPTABLES $IPTABLES
-F -X -P INPUT DROP -P OUTPUT DROP -P FORWARD DROP
Jól látszik, hogy most már a $IPTABLES változóval hivatkozok a programra. További kiegészítés(2008.02.18 12:04): Elegánsabb megoldás, ha a tűzfal kézi indítása után kiadjuk a következő parancsot: Kimentéshez sudo iptables-save > /home/budacsik/firewall.txt
Visszatöltéshez sudo iptables-restore < /home/budacsik/firewall.txt
Hol hasznos ez? Firewall szkriptünk /usr/local/sbin/firewall_start.sh a következő képpen módosul:
#!/bin/bash sudo iptables-restore < /home/budacsik/firewall.txt
Igy nem az iptables kell hívogatni és a kimentett firewall.txt fájlt is lehet szerkeszteni. Sőt a fájlt megnézve hamar hozzá lehet szokni, és lehet eleve így elkészíteni a szkriptet, de én ettől eltekintenék, ugyanis hátránya pl, hogy nehéz kommentezni, könnyen átláthatatlanná válik... Szerintem maradjon meg az eredeti fájl is amit szerkesztünk, majd futtatjuk, lementjük és a továbbiakban azt töltjük vissza rendszerindításkor.
Szerző: Budácsik Attila (budacsik) Elérhetőségek:
[email protected] [email protected] Licenc: A dokumentum szabadon másolható, de nem módosítható. A dokumentumot tilos pénzért, vagy bármilyen járandóságért árusítani. Minden jog a szerzőnek van fenntartva. További információk: Az esetleges hibákért a szerző nem vállal felelősséget. A szövegben felfedezett hibákat és észrevételeket a Makay József email-címére kérjük. Minden jog fenntartva! © SKL-Projekt