Alap tűzfal otthoni PC-re

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 alapértelmezett (default) lánc (chain) létezik:

  • INPUT: a kintről befelé érkező csomagokra match-el
  • OUTPUT: a bentről kimenő csomagokra match-el
  • FORWARD: aza dott gépen átmenő csomagokra match-el

Megjegyzés: 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 láncok 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
Ennyi elmélet kezdésnek, a többit gyakorlati példákkal mutatnám be.[/i]

Tűzfal szabályok

 

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:

#!/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.
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 -A OUTPUT -p tcp --dport 143 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 995 -j 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.

Összefoglalás

Összefoglalva és egyszerűsítve:

#!/bin/bash
# modulok betolltese
modprobe ip_conntrack_ftp
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# INPUT lanc
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state ?state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j LOG --log-prefix ?INPUT_DROP: ?
iptables -A INPUT -j 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,/ 22 /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 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 --dport 135,137,139,445,1026,1027,/ /5900,6881 -j DROP
iptables -A INPUT -p udp -m multiport --dport 135,137,139,445,1026,1027,/ /5900 -j DROP

Ezeket a 14. sor után tettem be. Így ezeket a csomagokat log nélkül eldobja.

  • 135/tcp – epmap, # Location Service
  • 137/tcp – netbios-ns, # NETBIOS Name Service
  • 139/tcp – netbios-ssn # NETBIOS session service
  • 445/tcp – microsoft-ds # Microsoft Naked CIFS
  • 1026/tcp – nem szabványos port
  • 1027/tcp – nem szabványos port
  • 135/udp – epmap,
  • 137/udp – netbios-ns,
  • 139/udp – netbios-ssn
  • 445/udp – microsoft-ds
  • 1026/udp – nem szabványos port
  • 1027/udp – nem szabványos port

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éntová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:

$ runlevelN 2

Ki lehet próbálni, de mielőtt restartolunk, még egyszer nézzünk át mindent.
Tipp: Az összess 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:

#!/bin/bash
# valtozok deklaralasa
IPTABLES=?/sbin/iptables?
# modulok betolltese
modprobe ip_conntrack_ftp
$IPTABLES -F
$IPTABLES -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

Jól látszik, hogy most már a $IPTABLES változóval hivatkozok a programra.
Szerző: Budacsik
Creative Commons LicenseEz a Mű a Creative Commons Nevezd meg!-Így add tovább! 2.5 Magyarország Licenc feltételeinek megfelelően szabadon felhasználható.

4 thoughts on “Alap tűzfal otthoni PC-re

  1. Már nem vagyok a témán, azért vedd figyelembe, hogy 3 éves infó amit olvasol. Bár ez elég időtálló téma. Örülök ha tetszik, és hasznos volt.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .