Az iptables olyan linux program, mely lehetővé teszi a TCP/IP hálózati csomagok továbbításának szabályozását. A csomagtovábbítást a linux kernel végzi, az iptables csak a továbbítási szabályokat adja meg a kernelnek. E szabályokkal ki lehet szűrni a nem kívánt hálózati forgalmat (tűzfal). Ha egy gépnek több hálózati csatolókártyája van, szabályozható az ezek közötti csomagtovábbítás (router).

Az iptables program az IPv4-es (a TCP/IP protokoll 4-es verziója), az ip6tables az IPv6-os továbbítási szabályokat közli a kernellel. A két program paraméterei azonosak.

Az iptables jellegzetessége a többi csomagszűrővel szemben, hogy képes nyilvántartani a gépek között felépült kapcsolatokat. Ha a kapcsolat felépült, és engedélyezzük a kapcsolatokon belüli csomagok automatikus továbbítását – szinte mindig ezt tesszük –, akkor azok szabályozásával már nem kell törődnünk.

Táblák és láncok szerkesztés

 

A linux kernel hálózati csomagtovábbítási szabályait kétféleképpen lehet csoportosítani: funkció és kézbesítési sorrend szerint. A funkciócsoportokat tábláknak, a kézbesítés sorrendje szerintieket láncoknak nevezzük.

A csomag a kézbesítés során többféle átalakuláson megy keresztül, vagyis a láncszemeket alkotó szabályok különböző táblákban vannak. Nem minden táblában van meg mindegyik lánc.

Tehát az iptables struktúrája: iptables -> Táblák -> Láncok -> Szabályok.

 
Linux iptables struktúra képi illusztrációval

Táblák szerkesztés

filter tábla szerkesztés

A legfontosabb tábla. A csomag továbbítását engedélyező és tiltó szabályokat tartalmazza. A legtöbb esetben nincs is szükség a többi táblára. Egy munkaállomás, melynek csak egy hálókártyája van, általában csak a filter tábla INPUT láncát használja. Az OUTPUT és FORWARD láncnak általában nincsenek szabályaik, csak policy-juk, ami OUTPUT esetén ACCEPT, hogy az állomás bármelyik gépet elérhesse, a FORWARD láncé pedig DROP, hiszen egy állomás nem továbbít csomagot. (Példa munkaállomás tűzfalra.)

Szűrésre mindhárom csomagtípusnál szükség van, ezért a filter táblában mindhárom fenti csomagtípusnak van láncszeme.

nat tábla szerkesztés

A hálózati címfordítás szabályai. Címfordításra tipikusan akkor van szükség, ha egy (belső) hálózat egyetlen kijárattal rendelkezik az internet felé, amelyet több gép szeretne használni. Ehhez routert használunk, melynek egyik csatolókártyája az internethez, legalább egy másik a belső hálózathoz kapcsolódik.

A nat táblát a router használja.[1] A belső hálóbeli gépek belső, az internetre nem továbbítható IP-címeket kapnak,[2] melyeket a router átfordít a külső IP-címre (POSTROUTING lánc), és így továbbítja az internetre, az onnan jövő választ pedig visszafordítja a belső címre.

A másik, ritkább használat a fordított irány: az internet felől akarjuk elérni a belső hálózatot. A belső hálózat helyi IP-címei az interneten nem használhatók, ezért van szükség a címfordításra (PREROUTING lánc).

mangle tábla szerkesztés

A táblabeli szabályok kisebb változtatást végezhetnek az TCP/IP csomagban (TOS(en), TTL, MARK, SECMARK, CONNSECMARK). A tábla ritkán, csak bonyolult tűzfalakban használatos.

raw tábla szerkesztés

A legritkábban használatos. Olyankor van rá szükség, ha az iptables (kernel) beépített kapcsolatfigyelése nem megfelelő.

Láncok szerkesztés

A csomagtovábbítás szempontjából a csomagoknak három típusuk van:

  • az adott gépből kezdeményezett (kimenő) csomag (OUTPUT lánc)
  • a hálózatból a gépnek szánt (beérkező) csomag (INPUT lánc)
  • hálózatról jövő, nem a gépnek szánt (továbbítandó) csomag (FORWARD lánc)

Van még két beépített lánc: a PREROUTING és a POSTROUTING, melyeknek a nat táblabeli szabályai használatosak, a többi láncszem ritkán. A tűzfal készítője saját láncokat is létrehozhat (lásd alább).

A fenti öt beépített láncnak minden táblában van default értéke (policy), melynek akkor van jelentősége, ha egyik szabály sem hajtódott végre a láncban (mert egyik végrehajtási feltétel sem teljesült, vagy nincs is szabály a láncban). Az érték ACCEPT vagy DROP lehet. Az első esetben a csomag továbbmehet, a második esetben a kernel egyszerűen eldobja, mintha be sem jött volna.

Saját láncokat másik (beépített vagy saját) láncból lehet hívni. Ha egyik szabály sem hajtódik benne végre, a lánc hívása utáni szabálytól folytatódik a szabályok végrehajtása. Olyasféleképpen használható, mint a programozásban az eljárás.

A szabályok alakja szerkesztés

Minden szabály három részből áll, melyből az első rész kötelező, a másik kettő nem.

  1. parancs (command): a szabály helyének megadása (tábla, lánc) és a végzendő művelet
  2. feltétel (match)
  3. célok (target/jump)

A szabályok sorrendben hajtódnak végre, amíg az egyik feltétel nem teljesül. Ebből következik, hogy a speciális feltétel mindig meg kell előzze az általánosabbat (pl. egy konkrét IP-cím az IP-cím tartományt), egyébként a speciális feltételt tartalmazó szabály sohasem hajtódik végre.

Parancsok szerkesztés

A parancs megadja a szabály helyét (láncszemét) és a műveletet. A tábla kapcsolóval adható meg, a -t FILTER az alapértelmezett és elhagyható. A legtöbb művelet után a lánc nevét is meg kell adni, de van néhány kivétel.

A műveletek egybetűsek, melyeket kötőjel előz meg. A legfontosabbak:

  • -F: minden szabályt töröl a láncból, ha a lánc elmarad, a tábla összes láncából
  • -L: kilistázza a szabályokat, ha a lánc elmarad, az INPUT láncét.
  • -P: megadja a beépített lánc policy-ját
  • -N: saját láncot hoz létre
  • -X: töröl egy saját láncot
  • -A: a leggyakoribb parancs. A szabályt a lánc végére szúrja be
  • -I: a szabályt a lánc elejére szúrja be

Példa: a FILTER tábla INPUT láncának szabályai:

iptables -L -n

A -n kapcsoló azt kéri, hogy az iptables ne próbálja az IP-címeket és portokat nevekké alakítani (az előbbit a DNS, az utóbbit a /etc/services fájl segítségével).

Feltételek szerkesztés

A szabály egy vagy több feltételt tartalmazhat, utóbbi esetben a feltételek ÉS kapcsolatban állnak egymással. A feltétel ellenkezőjét az elé írt ! jelzi.

A leggyakrabban használt feltételek:

  • -s IP-cím: a küldő IP-címe
  • -d IP-cím: a címzett IP-címe
  • --sport port: küldő port
  • --dport port: a címzett portja
  • -i csatoló: a csomagot fogadó kártya (pl. eth0). lo a loopback csatoló.[3]
  • -o csatoló: a csomagot kiküldő kártya
  • -p protokoll: pl. tcp, udp, icmp

Bizonyos feltételekhez be kell tölteni egy kernel modult a -m modul kapcsolóval; e nélkül a kernel nem érti a feltételt. Néhány példa:

Modul Feltétel Példa
pkttype --pkt-type csomagtípus pl.: BROADCAST, MULTICAST, UNICAST, LOCAL
state[4] --state kapcsolat-állapot NEW = most kezdeményezett
ESTABLISHED = már létrejött
INVALID = nem létező kapcsolathoz tartozó csomag
RELATED = korábban engedélyezett kapcsolathoz tartozó
conntrack --ctstate kapcsolat-állapot
iprange --src-range
--dst-range
két kötőjellel elválasztott IP-cím, pl.: 192.168.1.2-192.168.1.254
multiport --port portlista
--source-port portlista
--destination-port portlista
pl. -p tcp -m multiport --port 80,443

A kernelmodul fájlneve /lib/modules/kernel-verzió/kernel/net/netfilter/xt_modul.ko.

Célok szerkesztés

A csomagcél megadását a -j kapcsoló jelzi. A legfontosabb értékek:

  • ACCEPT: a csomagot a szabály elfogadja, a lánc feldolgozása befejeződik.
  • DROP: a csomagot a szabály eldobja (mintha be sem jött volna), a csomag feldolgozása befejeződik.
  • REJECT: a csomagot a szabály eldobja, és erről ICMP üzenetben értesíti a feladót. A csomag feldolgozása befejeződik.
  • LOG: a csomagot a kernel a normál kernel logoláson keresztül logolja. A --log-level kapcsolóval a logolási szint[5] adható meg, a --log-prefix-szel a logba (a dátum után) írhatunk szöveget. A szabályok végrehajtása a többi céllal ellentétben folytatódik.

Pl. a

iptables -A INPUT -j LOG --log-prefix "IPTABLES_input " --log-level debug

szabály hatására a következő sor kerülhet a /var/log/debug logfájlba (az olvashatóság érdekében három sorra vágva):

Nov  7 08:55:21 gylap kernel: [ 1888.333958] IPTABLES_input IN=eth0 OUT= MAC=d4:be:d9:53:23:85:f8:d1:11:3b:ab:1c:08:00 
         SRC=216.58.209.163 DST=192.168.1.11 LEN=40 TOS=0x00 PREC=0x00 TTL=57 ID=3457 PROTO=TCP SPT=443 DPT=57184 
         WINDOW=0 RES=0x00 RST URGP=0 

Ez a lehetőség nagyon jó a betörési kísérletek felderítésére és a szabályok tesztelésére is.

A -j kapcsoló után saját lánc neve is írható. A lánc csak akkor hajtódik végre, ha a láncot hívó szabály feltétele teljesül, így a feltételt nem kell megadni a lánc minden szabályában.

Példa: a tűzfalszabályok törlése szerkesztés

iptables -P INPUT ACCEPT   # minden bejovo csomagot engedunk
iptables -P OUTPUT ACCEPT  # minden kimeno csomagot engedunk
iptables -F                # torlunk minden szabalyt
iptables -X                # torlunk minden sajat lancot
iptables -Z                # torlunk minden szamlalot
iptables -P FORWARD DROP   # a csomagtovabbitast tiltjuk
ip6tables -P INPUT DROP    # az ipv6 bejovo csomagokat tiltjuk
ip6tables -P OUTPUT DROP   # az ipv6 kimeno csomagokat tiltjuk

Példa munkaállomás tűzfalra szerkesztés

A munkaállomás bárhová kezdeményezhet kapcsolatot, kívülről jövő kapcsolatot nem szolgál ki, kivéve a belső hálóból jövő ssh-t. Előtte a korábbi szabályokat törölni kell (előző példa).

iptables -A INPUT  -i lo -j ACCEPT     # gepen beluli kommunikaciot engedjuk
iptables -A OUTPUT -o lo -j ACCEPT     # gepen beluli kommunikaciot engedjuk
iptables -A OUTPUT -j ACCEPT           # mindent kiengedunk
iptables -N admin                      # sajat lanc ssh-nak
# INPUT lanc
iptables -A INPUT -m pkttype --pkt-type mcast -j DROP            # a munkaallomas nem hasznal multicastot
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP         # a megszunt kapcsolathoz tartozo csomagot eldobjuk
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT   # a mar letrejott kapcsolatok csomagjai bejohetnek
iptables -P INPUT DROP                 # ha egy csomag beengedesere nincs szabaly, eldobjuk
iptables -A INPUT -p icmp --icmp_type echo_request   -j ACCEPT   # ping
iptables -A INPUT -p tcp --dport ssh -j admin                    # az ssh-t csak bizonyos gepekrol fogadjuk
iptables -A INPUT -j LOG --log-prefix "IPTABLES_input " --log-level debug       # logoljuk a probalkozasokat
# admin lanc
iptables -A admin -p tcp -m iprange --src-range 192.168.1.2-192.168.1.254 -j ACCEPT    # az ssh-t csak helyi halobol engedjuk
iptables -A admin -j LOG --log-prefix "IPTABLES_admin " --log-level debug       # logoljuk a probalkozasokat
iptables -A admin -s 0/0 -j DROP                                 # eldobjuk a csomagot, amire nincs beengedo szabaly

A harmadik sor minden kimenetet elfogad, a második csak a gépen belülit. Így a második szabály felesleges, hiszen az OUTPUT láncot (egyelőre) sehol nem korlátoztuk.

Példa: NAT-oló tűzfal szerkesztés

Feltételezzük, hogy az eth0 csatoló az internethez, az eth1 a belső hálóhoz kapcsolódik.

iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP       # a megszunt kapcsolathoz tartozo csomagot eldobjuk
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT   # a mar letrejott kapcsolatok csomagjait engedjuk
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT                    # a belso halobol mindenki kimehet
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE             # MASQUERADE a kimeno csatolo elsodleges cimen NAT-ol

Jegyzetek szerkesztés

  1. Ha linux gépet használunk routerként, bár otthonra általában célszerűbb kész routert venni, amely folyamatosan be van kapcsolva. Linuxban viszont jobb routert készíthetünk, mint az olcsó (10–20 eFt-ért kapható) gyáriak.
  2. Belső IP-tartomány csak IPv4-ben van.
  3. Leggyakrabban a 127.0.0.1-es IP-címen használt logikai csatoló, melyhez a teljes 127-es tartomány hozzá tartozik.
  4. Elavult. conntrack használandó helyette.
  5. Lásd syslog.conf(5) - Linux man page, Syslog facility

Források szerkesztés

Kapcsolódó lapok szerkesztés