fi fi fi fi fi fi fi fr fi fi fi fr fi fr fi fi fi fi fi fi en fi fi fi fi fi fi fi fi fi fi de fi fi fi fi fi fi de fi en fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi fi hu fi fi fi fi fi fi fi en fi en fi en fi fi fi fi fi en fi en en fi fr en fi fi fi zh fi en en en fi en en fi fi en fi en en fi en en en en eo fi fi fi fi fi fi fi eo fi hu fi fi fi fi fi tt en fi fi fi fi pt es en en fi fi uk hbs_lat hbs_lat fr fr zh fi fi fi en fi hbs_lat zh uk en en de en fa en fi fi es en en en hbs_lat uk uk fi fi fi fi fi en de fi fi fi fi fi fi fi fi fi fi es es en en en hbs_lat hbs_lat uk en fi fi fi fi fi fi fi fi fi en fi fi fi en fi fi fi es en en en hbs_lat hbs_lat fi ru en en cs sl hbs_lat fi fi en fi en en hbs_lat fi en fi fi en fi en fi uk fi en fi fi fi fi fi fi fi es fi fi en en fi en fi ja en fi en en en fi fi hbs_lat fi fi en fi en fi fi sl sl en fi en en fi de fi en fi en fi fi fi en fi fi fi en lt en fi uk fi fi en fi en zh hbs_lat hbs_lat en en en en fi fi fi fi
(1) Erillistä (fyysistä tai virtuaalista) konetta, joka välittää, suodattaa ja muokkaa kahden tai useamman muun koneen (tai verkon) välistä liikennettä (”rautapalomuuri”) että
(2) Ohjelmaa tai ohjelmistoa, joka suodattaa ja muokkaa yhden koneen ja ulkomaailman välistä liikennettä (”softapalomuuri”).
Linux-ympäristöissä palomuurien alla on yleensä Netfilter-projekti (www.netfilter.org) ja erityisesti iptables ja ip6tables. Lisäksi on erityistarpeisiin ebtables ja arptables. Tulollaan on kaikki mainitut yhdistävä nftables.
Korkeamman tason palomuuriratkaisuja, jotka tarjoavat helpomman käyttöliittymän iptablesin päälle, on paljon, esimerkiksi ufw (Ubuntun softapalomuuri, "uncomplicated firewall"), ja kokonaisia Linux-jakeluitakin rautapalomuurien tekoon, esim. IpFire.
Linuxin (kernelin!) peruspalomuuriratkaisu IPv4-ympäristöön (IPv6:lle on vastaava ip6tables).
Käsittelee paketteja: ei toimi korkeamman tason protokollien kanssa, ts. ei analysoi eikä yhdistele korkeammalla tasolla yhteen kuuluvia paketteja ilman erillisiä lisävirityksiä, joita toki on paljon.
hiukan vanhentunut mutta helppolukuisempi ja yhä olennaisesti oikea ja hyödyllinen kuvaus iptablesin toiminnasta.
reject: paketti hävitetään mutta lähettäjälle vastataan ja kerrotaan että näin kävi
accept: paketti hyväksytään ja päästetään eteenpäin
state: paketin tila suhteessa pakettivirtaan (new, established, related, invalid)
chain (ketju): paketteihin sovellettava sääntöjoukko; sanotaan että paketti kulkee ketjun läpi (traverses through chain). Joukko vakioketjuja (INPUT jne), minkä lisäksi voi määritellä omia aliketjuja.
table: taulu, johon palomuurisääntöjä talletetaan (raw, nat, mangle, filter)
rule (sääntö): kokoelma ehtoja ja niiden toteutuessa suoritettava kohde
match (ehto): säännössä ehto jonka pitää toteutua; käytetään myös koko säännöstä, jos kaikki sen ehdot toteutuvat
target (kohde): säännössä kertoo mitä tehdään jos ehdot toteutuvat
jump (hyppy): kohde, joka määrää hyppäämään toiseen ketjuun
policy: oletustoimenpide sääntöjen loppuessa (drop, reject, accept)
INPUT: paketit, joiden määränpää on (palomuuri)kone itse
OUTPUT: koneesta ulos lähtevät (siellä syntyneet) paketit
PREROUTING: pakettien käsittely ennen reititystä (päätöstä määränpäästä)
POSTROUTING: pakettien käsittely reitityksen (ja yleensä suodatuspäätösten) jälkeen
FORWARD: paketit, joiden lähde ja määränpää palomuurin ulkopuolella
Kunkin ketjun sisällä käydään siihen kuuluvat taulut läpi järjestyksessä
raw → mangle → nat → filter
(kaikissa ketjuissa ei ole kaikkia tauluja)
Mahdolliset omat ketjut toimivat ikäänkuin aliohjelmina muille ketjuille
RAW: haluttaessa ohittaa tai muokata yhteysseurantaa joillekin paketeille (kohteet NOTRACK, CT)
MANGLE: paketin ohjauskenttien muuttamiseen (kohteet TOS, TTL, MARK, SECMARK, CONNSECMARK)
FILTER: pakettien suodattamiseen, ts. hyväksymiseen tai hylkäämiseen niitä muuttamatta (kohteet DROP, REJECT, ACCEPT)
NAT: pakettien osoitekenttien (IP ja porttinumero) muuttamiseen (kohteet DNAT, SNAT, MASQUERADE, REDIRECT)
Useimmissa ketjuissa ei ole kaikkia tauluja, ja useimmiten käytetään joka tapauksessa vain FILTER- ja NAT-tauluja
ACCEPT: paketti hyväksytään, käsittely lopetetaan
DROP: paketti hylätään, käsittely lopetetaan
REJECT: paketti torjutaan, käsittely lopetetaan
LOG: paketti lokitetaan (käsittely jatkuu)
DNAT, SNAT, MASQUERADE, REDIRECT: pakettien uudelleenohjaus
CT: yhteyden seuranta helper-modulien ohjaus
Lisää ks. man 8 iptables-extensions
Vakiokohteiden kutsu on aina muotoa
Omia ketjuja voi myös käyttää kohteina
-j ketju: palaa nykyiseen ketjuun kutsutun ketjun päätyttyä tai kun aliketjussa hypätään kohteeseen RETURN (vrt. aliohjelmakutsu)
-g ketju: lopettaa nykyisen ketjun kutsutun päätyttyä ja palaa ylemmälle tasolle (vrt. goto)
Saapuva paketti (kohde palomuurikone itse; huom. tässä ”palomuurikone” voi olla myös vain omia pakettejaan käsittelevä palvelin):
Lähtevä paketti (luotu palomuurikoneessa):
Välitettävä paketti (reitittimenä toimiva palomuurikone):
PREROUTING → FORWARD → POSTROUTING
Ketjujen käsittelyn välissä tehdään reitityspäätökset
Kaikissa tilanteissa ei käytetä kaikkia tauluja, mutta niitä joita käytetään, käytetään aina samassa järjestyksessä
Palomuurikoneelle osoitetun paketin käsittelyvaiheet:
PREROUTING - nat (DNAT)
Palomuurikoneelta lähtevän paketin käsittelyvaiheet:
POSTROUTING - nat (SNAT)
Palomuurikoneen läpi kulkevan paketin käsittelyvaiheet:
PREROUTING - nat (DNAT)
POSTROUTING - nat (SNAT)
iptables [-t table] -A ketju sääntö # --append, lisäys ketjun loppuun
iptables [-t table] -I ketju [numero] sääntö # --insert, lisäys ketjun keskelle
iptables [-t table] -R ketju numero sääntö # --replace, säännön muutos
iptables [-t table] -D ketju {sääntö|numero} # --delete, säännön poisto
iptables [-t table] -L [ketju] # --list, sääntöjen tulostus
iptables [-t table] -S ketju [numero] # --list-rules, sääntöjen tulostus komentomuodossa
iptables [-t table] -F [ketju] # --flush, ketjun (tai kaikkien) tyhjennys
iptables [-t table] -Z [ketju [numero]] # --zero, laskurien nollaus
iptables [-t table] -N ketju # --new-chain, uuden ketjun luonti
iptables [-t table] -X ketju # --delete-chain, tyhjän ketjun poisto
iptables [-t table] -P ketju kohde # --policy, oletuskohteen määritys
iptables [-t table] -E ketju1 ketju2 # --rename-chain, ketjun nimen vaihto
Oletustaulu (ilman -t -optiota) aina filter. Lisäksi yleisiä optioita:
-v, --verbose; -n, --numeric; -x, --exact; --line-numbers; --modprobe
Policy on oletustoiminto, joka tehdään ketjun lopussa ellei mikään sääntö muuta määrää
Vain INPUT, OUTPUT ja FORWARD-ketjuille
Vaihtoehtoja on vain kaksi: ACCEPT (blacklisting) ja DROP (whitelisting)
Asetetaan komennolla iptables -P ketju
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
Perussääntömäärittelyt (! = negaatio, ”ei”):
[!] -p, --protocol {tcp|udp|udplite|icmp|esp|ah|sctp|all}
[!] -s, --source address[/mask][...]
[!] -d, --destination address[/mask][...]
[!] -i, --interface laite
[!] -o, --out-interface laite
-c, --set-counters paketteja tavuja
Lisäksi on laajennuksia (extensions), erityisesti match
Lopussa aina -j tai -g
Erilaisia laajennuksia on tarjolla moduleina, jotka ladataan optiolla -m tai --match, jotkut latautuvat myös -p:n sivuvaikutuksena. Esimerkkejä:
-p tcp {--sport port[:port]|--dport port[:port]|--tcp-flags ...| --syn|--tcp-option n}
-p udp {--sport port[:port]|--dport port[:port]}
-p icmp --icmp-type type
-m state --state {NEW|ESTABLISHED|RELATED|INVALID}
-m iprange {--src-range|--dst-range} from[-to]
-m connlimit [--connlimit_mask n] --connlimit-above n
-m limit --limit rate[/second|/minute|/hour|/day]
-m limit --limit-burst n
-m mac [!] --mac-source address
Halutaan sallia kaikki yhteydet ulos ja sisään kaikki paitsi ei porttia 25 (smtp) mistään, ssh (22) vain JY:n (130.234.0.0/16) alueelta eikä mitään alueelta 134.170.0.0/16:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -p tcp --dport 25 -j DROP
iptables -A INPUT -p tcp ! -s 130.234.0.0/16 --dport 22 -j DROP
iptables -A INPUT -s 134.170.0.0/16 -j DROP
Tällainen ”blacklisting” tyyli, että sallitaan kaikki mitä ei ole erikseen kielletty, ei yleensä ole hyvä idea palvelimeen sisääntulevan liikenteen rajoittamiseen. Rajapalomuurin FORWARD-säännöissä se voi joskus olla järkevä ratkaisu, jos esimerkiksi asiakkaille halutaan sallia oletuksena melkein kaikki (esim. kaikki paitsi smtp-portti 25, joka yleensä halutaan sulkea spämmerien takia), muulloin ”whitelisting” (kiellettyä kaikki mitä ei erikseen sallita) on yleensä parempi.
Connection tracking, ”state machine”; iptables on ”stateful firewall”, pitää muistissa yhteyksien tiloja eikä vain käsittele jokaista pakettia uutena. Näin voidaan erityisesti käsitellä paluuliikenne (vastaukset lähteneisiin paketteihin) eri tavalla kuin uudet.
Tilaa voidaan säännöissä testata tyyliin
-m state --state state # tai
-m conntrack --ctstate state
(olennaisesti samoja, jälkimmäinen uudempi, enemmän ominaisuuksia erikoistarpeisiin)
Yhteyksillä voi olla neljä (viisi) tilaa:
NEW: yhteyden ensimmäinen paketti (ei kuulu mihinkään muistissa olevaan yhteyteen)
ESTABLISHED: paketti kuuluu muodostettuun (ja muistettuun) yhteyteen (liikennettä nähty molempiin suuntiin), vastaus aiemmin lähetettyyn pakettiin
RELATED: olemassaolevaan ESTABLISHED-yhteyteen liittyvä mutta ei siihen kuuluva paketti (aikaisemman yhteyden luoma uusi yhteys)
INVALID: tilaa ei ole tai sitä ei tunnisteta (koneesta muisti loppunut tai jotain muuta ikävää)
UNTRACKED: ei varsinaisesti tila vaan merkki, että tämän paketin tilaa ei seurata (pakettikohtainen, ei yhteyskohtainen)
Sallitaan sisään http (portti 80) ja https (443) kaikkialta sekä ssh (22) alueelta 130.234.0.0/16, ei rajoiteta ulos lähtevää liikennettä:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -s 130.234.0.0/16 --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
Paluuliikenne (ESTABLISHED) pitää sallia erikseen; senkin voisi rajata haluttuihin portteihin.
Tässä siis käytetään vain filter-taulua (joka on oletus).
Viimeinen REJECT ei ole välttämätön (koska policy on DROP), antaa vain siistin virheen.
Huom. mm. ftp ulospäin ei toimi näillä säännöillä, koska sen paluuliikennettä ei tunnisteta ESTABLISHED-liikenteeksi.
Osoitteet voivat olla yksittäisiä tai maskilla rajattuja aliverkkoja
Useita osoitteita voi antaa pilkulla erottaen (130.234.0.0/16,172.20.208.17) - iptables jakaa tällaiset sisäisesti kahtia (ja iptables -L jne tulostavat ne kahtena)
Modulilla iprange voidaan antaa osoitevälejä tyyliin
... -m iprange --src-range 172.20.208.10-172.20.209.120
Yksittäisen portin lisäksi voidaan antaa kaksoispisteellä erotettu väli, esim. 49152:59999; jos välin toisen pään jättää pois, se tarkoittaa kaikkia siitä eteenpäin, esim. 1024: on portit 1024-65535, vastaavasti :1023 on sama kuin 1-1023
Normaalisti samalla kertaa ei voi antaa useita ei-peräkkäisiä portteja, mutta tarkoitusta varten on lisämoduli multiport:
... -m multiport --dports 80,443 -j ACCEPT
Porttinumeroiden asemesta voi usein käyttää palveluiden lyhenteitä (ne katsotaan /etc/services -tiedostosta), mutta se hidastaa sääntöjen latausta joskus merkittävästikin
Kuten esimerkki 1, mutta sallitaan ssh myös 172.20.0.0/16-alueelta ja ulospäin vain dns (portti 53) ja apt-proxy (3142):
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -s 130.234.0.0/16,172.20.0.0/16 --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -d 172.20.208.17 --dport 3142 -j ACCEPT
Ilman nimipalvelua juuri mikään ei toimi; nykyisin syytä sallia sekä udp- että tcp-portit.
Myös OUTPUT-ketjussa pitää nyt sallia paluuliikenne erikseen.
ICMP-paketeista yleensä halutaan sallia ainakin 3 (destination-unreachable) ja 11 (time-exceeded), usein myös 12 (parameter-problem) ja 13 (timestamp-request, mm. openvpn käyttää sitä):
iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT
Ulospäin ICMP:n voi yleensä sallia vapaamminkin (vaikka kaikki pakettityypit)
Erityisesti icmp echo (8 echo-request, 0 echo-reply) eli ping halutaan usein sallia ainakin ulospäin, sisäänpäin yleensä vain rajoitetusti.
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
# lisäksi tarvitaan joko em. INPUT... ESTABLISHED-sääntö tai
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -s 172.20.0.0/16 -p icmp --icmp-type echo-request -j ACCEPT
# jälleen lisäksi joko OUTPUT...ESTABLISHED tai
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Säännöstön voi tallettaa komennolla
iptables-save on joskus kätevä myös ilman uudelleensuuntausta sääntöjen tutkimiseen.
Voi myös kirjoittaa iptables-komennot skriptiin (esim. /etc/network/iptables.up.run)
Jotta säännöt saa pysyviksi bootin yli, ne pitää ajaa päälle jossain käynnistysskriptissä.
Jos käytössä on ifupdown, luonteva paikka on /etc/network/interfaces -tiedostossa pre-up -säännöllä (suoritetaan ennen verkkoyhteyden käynnistämistä), esim. jompi kumpi näistä (jälkimmäinen siis jos olet kirjoittanut skriptin sääntöjen lataamista varten):
Joissakin erikoistilanteissa up on parempi kuin pre-up
Netplan ei suoraan tue pre-up -tyyppisiä kutsuja, mutta sen (yleensä) käyttämä renderer networkd tarjoaa keinon: tehdään skripti /etc/networkd-dispatcher/routable.d tai configured.d -hakemistoon, esim. 40-iptables-up:
networkd -skriptit suoritetaan asynkronisesti eikä niiden ajoitus vastaa yksi yhteen ifupdown'in pre-up -jne tiloja. Karkeasti:
pre-up, up: configuring.d, configured.d
down, post-down: off.d, no-carrier.d
Uusia sääntöjä interaktiivisesti testatessa kätevä on
iptables-apply [-t seconds] [tiedosto|-c [skripti]]
joka kysyy onnistuiko ja palauttaa vanhat säännöt ellei saa vastausta määräajassa.
Tiedoston oletusarvo on /etc/network/iptables.up.rules, syntaksi sama kuin iptables-restore'lla, oletusskripti taas on /etc/network/iptables.up.run (se voi suorittaa mitä tahansa komentoja, katsoa koneen oman osoitteen /etc/hosts'ista, tehdä sääntöjä monelle koneelle silmukassa jne; huom. verkko ei aina ole päällä sitä suoritettaessa).
Yksi erityinen kohde iptables-säännöille on LOG, jolla haluttu (epäilyttävä) paketti saadaan kirjattua lokiin. Lokitusta voidaan tarkemmin säädellä optioilla:
--log-level level # syslog-tasot, debug, notice, info, warn, err jne
--log-prefix string # merkkijono lokiviestien alkuun
--log-tcp-sequence # kirjataan tcp-pakettien numerot lokiin
--log-tcp-options # tcp-optiot lokiin
--log-ip-options # ip-optiot lokiin
iptables -A ... -j LOG --log-level debug --log-prefix ”nasty packet”
iptables -A ... -j DROP
syslog-facility on ”kern”, sitä ei voi vaihtaa. Mutta rsyslog.conf'issa voi ohjata viestejä eri tiedostoihin tyyliin
Käytettävissä on myös ULOG-kohde, joka tarjoaa monipuolisempia lokitusmahdollisuuksia. Sen käyttää omaa protokollaansa ja sen käyttö edellyttää sitä varta vasten kuuntelevaa ohjelmaa (ulogd tms).
Sääntöjä testatessa on usein kätevää seurata lokista tiettyä IP:tä:
tail -f /var/log/kern.log | grep --line-buffered 130.234
tail -f lukee lokia jatkuvasti
grep --line-buffered tulostaa joka rivin saman tien eikä puskuroi niitä muistiin
tulostusta voi myös tiivistää, esim.
tail -f /var/log/kern.log | sed -n '/130.234/{s/IN=.*SRC=/SRC=/;s/LEN=.*PROTO=TCP//;s/ WINDOW=.*//p;}'
Jos samat säännöt toistuvat tai samaa ehtoa käytetään isolle joukolle sääntöjä, ne voi koota omaksi ketjukseen ja kutsua sitä tarvittaessa.
Esimerkiksi lokitus yhdistettynä hylkäykseen:
iptables -A LOGDROP -j LOG --log-prefix ”bad packet”
iptables -A LOGDROP -j DROP
jota sitten käytetään tähän tapaan:
iptables -A INPUT -s 134.170.0.0/16 -j LOGDROP
Ellei oma ketju tee jotain joka päättää paketin käsittelyn (kuten DROP tai ACCEPT) sen loputtua käsittely jatkuu siellä mistä sitä kutsuttiin jos käytettiin -j:tä, tai käsittely päättyy kuten kutsuva ketju olisi loppunut jos sen sijaan käytettiin -g:tä. Ylläolevassa esimerkissä näillä ei olisi eroa, koska ehdoton DROP päättää käsittelyn kuitenkin. Ketju voidaan myös keskeyttää eksplisiittisesti kohteella RETURN.
Jos palomuurikone jo reitittää liikennettä normaalisti, sen suodattaminen on helppoa, esim.
iptables -P FORWARD DROP
iptables -A FORWARD -d 192.168.122.0/24 -s 130.234.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -d 192.168.122.19 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 192.168.122.19 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.122.0/24 -p udp --dport 53 ACCEPT
iptables -A FORWARD -s 192.168.122.0/24 -p tcp --dport 53 ACCEPT
Edellä ESTABLISHED -sääntö toimii tarkoituksella molempiin suuntiin, vaikka ulospäin ei pääsisikään kuin DNS.
Tässä siis reititys hoidetaan normaaliin tapaan reititystaululla eikä osoitteita eikä portteja muuteta, päätetään vain mitä välitetään eteenpäin ja mitä ei.
Kaikki säännöt ovat forward-ketjussa ja filter-taulussa.
Ftp ja muut vastaavat vaatisivat tässäkin omat lisäsäätönsä.