Tűzfalak
Az iptables a Linux kernelben található Netfilter csomagszűrő userspace komponense; egy olyan program, amellyel a Netfilter beállításait kezelhetjük.
A továbbiakban nem teszünk éles különbséget az iptables és a Netfilter között; a szövegkörnyezetből mindig egyértelmű lesz, melyikről van szó.
Tartalomjegyzék |
1 Fogalmak
Az iptables működésének megértéséhez fontos tudni, mi a csomagszűrő (packet filter) és mi a kapcsolatkövető tűzfal (connection tracking firewall).
1.1 Tűzfal
A tűzfal általánosságban egy olyan hálózati eszköz (általában router), amely a rajta áthaladó forgalmat "jólformálttá" teszi annak érdekében, hogy az egyes interface-eihez tartozó hálózatokat kölcsönösen megvédje a többiből érkező "érvénytelen" (vagy legalábbis érdektelen) kommunikációtól.
Különböző tűzfalmegoldásokkal más-más mértékű "jólformáltság" érhető el.
1.2 Csomagszűrő
A csomagszűrő minden egyes csomagról önmagában dönti el, hogy áthaladhat-e a tűzfalon. A döntéshez felhasználhat mindent, amit az adott csomagról tud, akár a tartalmát is, de általában a fejléc alapján születik a döntés.
Előnye, hogy állapotmentes, így elvileg akárhány kapcsolatot tud kezelni.
Hátránya, hogy buta és rugalmatlan: pl. nem tudja megállapítani, hogy egy új TCP-kapcsolat egy már fennálló FTP-kapcsolathoz tartozó adatkapcsolat-e.
A Netfilterrel építhetünk ilyet, de általában jobb kapcsolatkövető tűzfalat csinálni.
1.3 Kapcsolatkövető csomagszűrő
Olyan tűzfal, amely a nyomon követi a rajta keresztül felépített hálózati kapcsolatok állapotát, és ezt az információt is fel tudja használni a döntés során.
1.4 NAT, PAT
Network Address Translation, Port Address Translation.
A Linux összemossa a tűzfalfunkcióval.
1.5 Fogalmak a Netfilter/iptables körül
Alulról felfelé haladva az iptables a következő fogalmakkal dolgozik:
- match (illesztés): egy feltétel, amelynek egy csomag meg kell, hogy feleljen. Pl.:
- forrás-IP
- protokoll
- célport
- a kapcsolat állapota
- melyik interface-en jön be vagy megy ki
- rengeteg más match van
- akció (target): döntés arról, hogy mi történjen egy csomaggal, pl.:
- engedélyezés
- eldobás
- visszautasítás (pl. TCP RST-vel vagy icmp admin-prohib üzenettel)
- ugrás másik láncra (l. lejjebb)
- van még jópár akció
- szabály (rule): ÉS kapcsolatban levő matchek és egy akció együttese. Ha minden match illeszkedik, az adott csomagon az adott akciót kell végrehajtani.
- lánc (chain): a szabályokat "láncokra" tudjuk felfűzni. Ha egy csomag eljut egy láncba, akkor a kernel sorban minden szabályt kiértékel, amíg az első olyat meg nem találja, amire a csomag illeszkedik. Ennek az akcióját végrehajtja, és a későbbi szabályokat figyelmen kívül hagyja.
- láncokat definiálhatunk mi is, de van néhány speciális, beépített lánc (l. később)
- a beépített láncoknak lehet "policy"-je, ami azt adja meg, mi történjen azokkal a csomagokkal, amelyekről egyetlen szabály sem rendelkezett
- tábla: láncok vannak benne. Bizonyos akciók csak bizonyos táblákban értelmezettek; pl. van nat tábla, amiben NATolhatunk. A csomagok meghatározott sorrendben járják be a táblákat.
A csomag útjának megértésében sokat segít a (sajnos nem feltétlenül naprakész, teljes és pontos) "Kernel Packet Traveling Diagram".
2 Táblák
- filter: INPUT, OUTPUT és FORWARD lánc; szűrésre való
- nat: PREROUTING, OUTPUT és POSTROUTING lánc; címfordításra való
- mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING lánc; bizonyos csomagmódosításokat lehet itt elvégezni
- raw: PREROUTING és OUTPUT lánc; megjelölhetjük benne azokat a csomagokat, amelyekre nem kérünk kapcsolatkövetést.
3 Az iptables parancssora
- iptables [-t table] -A chain rule-specification [options]
- új szabály felvétele a lánc végén
- iptables [-t table] -D chain rule-specification [options]
- szabály törlése a láncból a törlendő szabály megadásával
- iptables [-t table] -D chain rulenum [options]
- szabály törlése a láncból a sorszáma megadásával
- iptables [-t table] -I chain [rulenum] rule-specification [options]
- szabály beszúrása a láncba (scriptben ne használjuk)
- iptables [-t table] -R chain rulenum rule-specification [options]
- szabály cseréje (scriptben ne használjuk)
- iptables [-t table] -L [chain] [options]
- lánc listázása
- iptables [-t table] -F [chain] [options]
- lánc törlése (flush)
- iptables [-t table] -Z [chain] [options]
- csomag- és byte-számlálók törlése
- iptables [-t table] -N chain
- új lánc létrehozása
- iptables [-t table] -X [chain]
- lánc törlése (csak, ha már nincs benne szabály, és rá se hivatkozik szabály)
- iptables [-t table] -P chain target [options]
- policy beállítása
- iptables [-t table] -E old-chain-name new-chain-name
- lánc átnevezése
Példa pár szabály felvételére:
iptables -A INPUT -p tcp --dport ssh -s 1.2.3.4 -j ACCEPT iptables -A INPUT -p tcp --dport ssh -j REJECT --reject-with tcp-reset iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
A -j-vel ugorhatunk más láncra is:
iptables -N ssh_input iptables -A INPUT -p tcp --dport ssh -j ssh_input iptables -A ssh_input -s 1.2.3.4 -j ACCEPT iptables -A ssh_input -s 2.3.4.5 -j ACCEPT iptables -A ssh_input -s 3.4.5.192/26 -j ACCEPT iptables -A ssh_input -m limit --limit 3/minute -j LOG --log-prefix "FW: ssh_input REJECT: " iptables -A ssh_input -p tcp -j REJECT --reject-with tcp-reset iptables -A ssh_input -j DROP
Itt -j ("jump") helyett írhattam volna -g-t ("goto") is; a különbség az, hogy -j esetén, ha a meghívott láncban nincs illeszkedő szabály, akkor a -j-s szabály után folytatódik a szabályok kiértékelése (tehát ez "gosub"), míg -g esetén, ha nincs egyezés, akkor az utolsó kiértékelt -j után. Mi van, ha beépített láncban használjuk a goto-t?
Sem a matchek, sem az akció megadása nem kötelező. Akciómentes szabályt használhatunk pl. forgalomszámolásra.
4 Kapcsolók
- -c: csomag- és byte-számlálók kézi beállítása
- -n: ne legyen reverse-DNS-feloldás a listázáskor (ott van helyette az adnsresfilter, ha muszáj)
- -v: szószátyárabb output (nemcsak listázásnál)
- -x: számlálók pontos értékkel, nem SI prefixekkel jelennek meg
- --line-numbers: minden szabály elé odaírja, hanyadik a láncban
5 Match-ek
- -p, --protocol protokoll
- -s, --source cím[/maszk]: cím lehet hosztnév is; ha több IP tartozik hozzá, minden IP-hez külön szabály képződik
- -i, --in-interface név
- -o, --out-interface név
- -f, --fragment
- --icmp-type típus
- --sport, --dport port[:port]: tcp, udp forrás- ill. célport
- --tcp-flags vizsgálandók melyiklegyenbeállítva
- --syn == --tcp-flags SYN,RST,ACK,FIN SYN
- -m modulnév: bővített matchek. Ezek közül néhány érdekesebb:
- -m account: forgalomstatisztika, házi feladat; [1]
- -m addrtype: forrás- vagy célcím osztálya (UNICAST, BROADCAST, MULTICAST stb.)
- -m childlevel: "főkapcsolat" vagy "gyermekkapcsolat" (pl. ftp-data)
- -m comment: no-op, kommentálni lehet vele a szabályt: iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "A privatized IP block" -j valahova
- -m condition: létrehoz nekünk egy file-t a /proc-ban, és attól függően illeszkedik vagy nem, hogy abba a file-ba egyest vagy nullát írunk
- -m connbytes: az adott kapcsolathoz tartozó adatforgalom nagysága alapján matchel (csomagszám, byte-szám vagy átlagos csomagméret)
- -m connlimit: kapcsolatok számának korlátozása. Példák:
# allow 2 telnet connections per client host iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT # you can also match the other way around: iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT # limit the nr of parallel http requests to 16 per class C sized network (24 bit netmask) iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
- -m connmark: a kapcsolatokat meg lehet jelölni a mangle táblában; ezzel a matchel vizsgáljuk, hogy egy adott kapcsolaton egy adott jelzés van-e
- -m connrate: a kapcsolat aktuális adatátviteli sebességét nézi
- -m conntrack: a kapcsolatkövető mechanizmus belső paraméterei alapján matchel. Értelmes felhasználás: házi feladat. :)
- -m ecn: explicit congestion notification, RFC3168: házi feladat
- -m fuzzy: fuzzy ratelimit. Értelmes felhasználás: házi feladat. :)
- -m hashlimit: rátalimit, de nem szabályonként, hanem szabályonként és cécímenként vagy célcím-célport-páronként. Házi feladat.
- -m iprange: net/maszk helyett ip1-ip2 alakban adható meg tartomány
- -m length: csomagméret
- -m limit: rátalimit. A szabály legfeljebb x alkalommal illeszkedik y idő alatt. Logoláshoz jó.
- -m mac: ethernet-forráscím
- -m mark: a kapcsolatokhoz hasonlóan egyes csomagokat is meg lehet jelölni, erre illeszthetünk ezzel a match-csel
- -m mport: több port sorolható fel
- -m multiport: majdnem ugyanaz, de a felsorolásban szerepelhet tartomány is
- -m nth: minden n. alkalommal illeszkedik
- -m osf: passzív OS fingerprinting (pl. csak linuxos gépek küldhetnek levelet). Nem bombabiztos, inkább játék.
- -m owner: a csomagot küldő folyamat UID, GID, PID, SID (session ID) értékei, ill. a processz neve alapján matchel
- -m physdev: bridge interface esetén a fizikai interface-re matchel
- -m pkttype: adatkapcsolati rétegbeli címtípus (unicast|broadcast|multicast)
- -m psd: portscan-detektor. Nemigen van értelme.
- -m quota: forgalmi kvótát lehet csinálni vele
- -m random: véletlenszerűen illeszkedik (vagy nem); pl. véletlen csomagvesztés szimulálására jó
- -m recent: táblázatot csinálhatunk vele azokról az IP-kről, amelyeket valamilyen kontextusban "láttunk", aztán később vizsgálhatjuk, hogy elemei-e a táblázatnak; pl. primitív SMTP greylistingre jó, de sokminden másra is lehet használni: házi feladat
- -m ipset: egyetlen szabállyal több IP-re is illeszthetünk (ez pl. akkor jó, ha ACL-t akarunk csinálni); külön programmal, az ipset-tel lehet az egyes halmazokat adminisztrálni. Házi feladat, vagy legközelebbre megnézem jobban is...
- -m state: a kapcsolat állapota
- -m string: a csomag tartalma
- -m time: dátumhoz ill. napszakhoz kötött illesztés
- -m tos
- -m ttl
6 Akciók
- ACCEPT
- REJECT
- DROP
- LOG (de itt még nincs vége)
- MARK
- SNAT
- DNAT
- MASQUERADE
- to be continued...