fi fi fi fi fi fi fi fi fi fi fi es en en en fi fi en en en es es fr oc fr fr zh oc fi fi en en en fi sl en fi fi fi fi en fi en fi es es fi cs fi sl sl fi fi zh fi fi fi fi zh fi en en fi fi fi en fi fi en fi fi fi en fi fi fi en sv fi fi fi en en fi en fi fi fi fi fi en fi en fi fi hbs_lat fi uk fi uk fi fi uk uk uk en en fi fi fi fi fi ca fi fi ca fi fi fi fi fi fi en fi en fi hbs_lat fi fi en fi hbs_lat hbs_lat et fi fi fi fi fi fi fi pl fi fi fi fi fi fi fi fi en fi en fi fi en fi fr en fi en en fi pl ar ar uk pl pl uk uk uk fi fi ja fi hbs_lat fi hu fi es
Joskus pitää eksplisiittisesti ladata tai poistaa kernelin moduleita (dynaamisia kirjastoja):
modprobe lataa tai poistaa (-r) modulin "älykkäästi" (riippuvuuksineen jne)
insmod lataa modulin minimitarkistuksin (modprobe yleensä parempi)
rmmod poistaa modulin (modprobe -r yleensä parempi)
lsmod tulostaa käytössä olevat modulit
modinfo tulostaa tietoja yksittäisestä modulista
iptables ei tarjoa mitään helppoa keinoa kaikkien sääntöjen poistamiseen kerralla vaan kaikkien taulujen policyt, säännöt ja omat ketjut pitää poistaa erikseen. Yksinkertaisessa tilanteessa (vain filter-taulua käytetty, ei omia ketjuja) riittää:
Perusteellisesti iptables'in saa tyhjäksi näin:
Tyhjennyksen voi tehdä näinkin (yrittää turhaan -P:tä silloinkin kun se ei ole mahdollinen mutta ohittaa virheet):
for table in filter nat mangle raw ; do
for chain in INPUT OUTPUT FORWARD POSTROUTING PREROUTING
iptables -t $table -F # taulut tyhjiksi
iptables -t $table -X # omat ketjut pois
Jos ip6tables on käytössä se pitää tyhjentää erikseen (samoin ebtables ja arptables)
Sääntöjen poistaminen ei poista iptables-moduleita kernelistä. Sekin voidaan haluttaessa tehdä modprobe -r -komennolla, mutta se ei yleensä ole tarpeen (modulit voi selvittää lsmod -komennolla, ne pitää poistaa riippuvuusjärjestyksessä, viimeisinä ip_tables, ip6_tables ja x_tables).
Jos iptables halutaan hävittää pysyvästi, senkin voi tehdä:
Tätä ei yleensä tehdä kuin embedded-ympäristöissä tai jos tilalle asennetaan nftables tms.
iptables: localhost, kerberos, ldap
Yleensä halutaan sallia kaikki liikenne localhostiin:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Kerberos-PAM-autentikointia varten pitää sallia yhteys ulospäin Kerberos-porttiin (88):
iptables -A OUTPUT -p tcp --dport 88 -j ACCEPT
LDAP vaatii vastaavasti portin 389, tai SSL:n kanssa 636:
iptables -A OUTPUT -p tcp --dport 389 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 636 -j ACCEPT
Paluuliikenne pitää aina sallia erikseen ellei sitä ole yleisemmin sallittu.
Jos jokin palvelu ei toimi, sen porttinumeroita voi etsiä tiedostosta /etc/services (siellä voi olla lokaaleja lisäyksiä, joista Googlekaan ei tiedä), tai etsimällä blokattuja portteja palomuurin lokista.
Erityisesti palomuurien toiminnan testaamiseen hyödyllinen työkalu: kokeilee mitkä portit kohdekoneissa ovat auki. Optioita on eri tarkoituksiin paljon, esim.
-Pn (aikaisemmin -P0): älä pingaa ensin (jos ping blokattu)
-p22,1024-2047 kokeile portteja 22 ja 1024-2047
-v verböösimpi tulostus (-vv vielä enemmän)
Kohteena voi olla kone (nimi tai IP) tai verkkoalue tai useita, esim.
nmap 172.21.208.16 # etsi avoimet portit lonka6:sta
# etsi www-palvelimet verkkoalueelta
Erilaisia skannaustapoja löytyy man-sivulta lisää, jos kone ei vastaa vaikka pitäisi
Älä skannaa toisten koneita tai verkkoja ilman lupaa!
Palomuurisääntöjen syntaksivirheet saa helpoiten kiinni, kun ne kirjoittaa skriptiin ja ajaa sitä -x ja ehkä myös -e optioilla (alkuun ”#! /bin/bash -ex” tai suoritettaessa bash -ex …); tosin -e saattaa aiheuttaa ongelmiakin.
Uudet säännöstöt kannattaa testata ensin iptables-apply -komennolla, etenkin jos konetta säätää ssh:n tms verkkoyhteyden yli. (Jos konsoliyhteydenkin saa, se kannattaa silti varmuuden vuoksi avata myös.)
Epäilyttävien (testausvaiheessa kaikkienkin) DROP- ja REJECT-sääntöjen eteen voi laittaa LOG-säännön samalla ehdolla ja katsoa mitä lokissa näkyy. Myös läpi päästettyjä paketteja voi lokittaa (kunhan varoo lokin täyttymistä).
Lokia voi seurata "reaaliajassa" tail -f -komennolla toisessa ikkunassa.
Palomuurin toimintaa voi testata mm. komennoilla telnet (tcp-portit), ping (icmp), nmap (kaikki...) ja traceroute (etenkin useamman palomuurin läpi mentäessä).
NAT: Network Address Translation
Muuttaa paketin ip:n ja usein myös portin mennen tullen.
Alunperin viritys IP-osoitteiden säästämiseen, rikkoo joitakin protokollia; käymässä harvinaisemmaksi IPv6:n yleistymisen myötä.
Yleinen virtuaalikoneiden alustakoneen ja sen VM:ien välissä.
SNAT, DNAT, PNAT, 1-to-1 NAT
SNAT (Source NAT), masquerade: vaihdetaan lähdeosoite ts. IP, josta paketti on tulossa (source address), yleensä privaatti-IP:stä julkiseksi, mahdollisesti useita samaksi (silloin vaihdetaan myös porttinumero); palomuurin sisäpuolelta ulos lähtevälle liikenteelle.
DNAT (Destination NAT): vaihdetaan paketin kohdeosoite, esim. ohjataan palomuurin ulkopuolelta samaan osoitteeseen tulevia paketteja eri koneisiin palomuurin sisäpuolella (yleensä) porttinumeron perusteella.
PNAT (Port NAT): yleinen termi edellisille silloin kun muutetaan osoite-portti -yhdistelmää.
many-to-one NAT (PNAT) vs. one-to-one NAT
SNAT (Source NAT) tarkoittaa lähtevän (välitettävän) paketin lähtöosoitteen (source address) vaihtamista; usein myös portti vaihdetaan. Yleisin käyttö tälle on palomuurin sisältä tulevan liikenteen yksityisten osoitteiden muuttaminen palomuurin ulkopuolen julkiseksi osoitteeksi vaihtaen samalla lähtöporttia vastausten ohjaamiseksi takaisin. Mahdollista on myös vain vaihtaa yksityinen osoite julkiseksi porttia muuttamatta (one-to-one NAT). Jos palomuurilla on useita julkisia osoitteita, niitä voidaan myös käyttää satunnaistamalla, round-robin -tekniikalla tms.
Lähtevälle paketille vaihdetaan IP:ksi palomuurin julkinen IP ja portiksi jokin (satunnainen vapaa) portti ja muistetaan se, paluupaketti ohjataan takaisin tallennetun porttinumero-IP -parin perusteella (connection tracking).
Tyyppitilanne: työasemia palomuurin takana yksityisillä osoitteilla, palomuurilla vain yksi julkinen osoite.
SNAT tehdään POSTROUTING-ketjussa ja NAT-taulussa. Kohde voi olla SNAT tai MASQUERADE (tai joskus SAME tai NETMAP).
SNATin kanssa voi käyttää useita erilaisia kohteita:
... -j SNAT --to-source addr[-addr2][:port1-port2]
addr määrää mitä lähtöosoitetta käytetään (yleensä jokin palomuurin julkisista osoitteista), valitaan satunnaisesti jos useita
... -j MASQUERADE [--to-ports port1-port2]
lähtöosoite määräytyy automaattisesti, unohtaa vanhat yhteydet verkkoyhteyden katketessa (hyvä jos IP on dynaaminen), hieman tehottomampi kuin SNAT
... -j SAME --to addr1-addr2 [--nodst]
kuten SNAT monella osoitteella, mutta muistaa mitä lähtöosoitetta milläkin koneella on käytetty ja yrittää käyttää samaa kun kohdekin on sama (tai aina --nodst -optiolla)
... -j NETMAP --to addr/mask
kohdeosoitteena aina verkkoalue, joka on samankokoinen kuin lähtöalue (-s...), tekee 1-1 NATin pitäen osoitteen lopun samana. Esim.
... -s 172.21.209.0/24 … -j NETMAP 130.234.209.0/24
Liikenne lonka7:n sisäverkosta 192.168.127.0/24 olevista koneista (tunnus4 -koneet) ohjautuu ulos seuraavilla iptables-säännöillä (iptables -S -formaatti):
-A POSTROUTING -s 192.168.127.0/24 ! -d 192.168.127.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.127.0/24 ! -d 192.168.127.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.127.0/24 ! -d 192.168.127.0/24 -j MASQUERADE
-A FORWARD -d 192.168.127.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.127.0/24 -i virbr0 -j ACCEPT
Uudelleenohjausta ei tehdä sisäverkon sisällä (! -d ...)
Ohjaus tehdään erikseen tcp:lle ja udp:lle, joille halutaan määrätä portit; icmp ja muut eivät porttinumeroita käytä, joten niille ei voi käyttää --to-ports -optiota (ne ohjataan perille paketin sisällön perusteella, yleensä onnistuu).
--ctstate on conntrack -modulin versio --state -testistä (nykyisissä kerneleissä vaikutus on aivan sama, mutta --ctstate tuntee enemmän optioita).
Edellinen on olennaisesti libvirtd:n oletusverkon NAT-säännöstö (siellä on lisäksi joitakin suodatussääntöjä).
DNAT (Destination NAT) tarkoittaa, että saapuvan (välitettävän) paketin kohdeosoite (destination address) vaihdetaan; myös portti voidaan vaihtaa. Yleisin käyttö tälle on ohjata samaan julkiseen osoitteeseen tulevat portit eri koneisiin palomuurin sisällä. Joskus myös vain vaihdetaan julkinen IP yksityiseksi (one-to-one NAT) porttiin puuttumatta, ja kohdekone palomuurin sisällä voidaan valita muullakin kuin portin perusteella (vaikkapa lähdeosoitteella).
Yleinen erikoistapaus: virtuaalikoneiden alustakone ohjaa liikennettä valikoiden sisällään eri virtuaalikoneille.
Voidaan käyttää myös transparent proxy-viritykseen toiseen suuntaan: esim. http- tai smtp-yhteys palomuurin sisältä ulos ohjataankin omaan välityspalvelimeen (tai sensuurin kynsiin...)
DNAT tehdään PREROUTING-ketjussa ja NAT-taulussa, kohde DNAT (tai NETMAP).
Jos DNATin tekee koneessa, joka ei muuten toimi reitittimenä ao. koneiden välissä, sen kanssa yleensä tarvitaan myös SNAT paluuliikennettä varten.
Ohjataan tt2-koneen (172.21.209.119) portti 80 koneeseen tt1 (172.21.209.19) palomuurisäännöillä tt2:ssa:
# ohjataan porttiin 80 saapuva liikenne tt1:een:
iptables -t nat -A PREROUTING -d 172.21.209.119 -p tcp -m tcp --dport 80 -j DNAT --to-dest 172.21.209.19
# ohjataan paluuliikenne takaisin SNATilla:
iptables -t nat -A POSTROUTING -s 172.21.209.19 -p tcp -m tcp --sport 80 -j MASQUERADE
# sallitaan edelleenohjaus (tarpeen kun forward policy on drop):
iptables -A FORWARD -d 172.21.209.19 -p tcp -m tcp --dport 80 -j ACCEPT
# sallitaan paluuliikenteen uudelleenohjaus:
iptables -A FORWARD -s 172.21.209.19 -p tcp -m state --state ESTABLISHED -j ACCEPT
# ohjataan ja sallitaan tt2:sta itsestään lähtevä liikenne samaan tapaan:
iptables -t nat -A OUTPUT -d 172.21.209.119 -p tcp -m tcp --dport 80 -j DNAT --to-dest 172.21.209.19
iptables -A OUTPUT -s 172.21.209.119 -d 172.21.209.19 -p tcp --dport 80 -j ACCEPT
Joskus konfiguraatiotiedostoihin eksyy näkymättömiä kontrollimerkkejä, ja niistä voi aiheutua mitä merkillisimpiä virheitä. Useimmat editoritkaan eivät näytä niitä, mutta ne saa näkyviin cat -komennon optioilla:
-v näytä erikoismerkit ^- ja M- muodossa, paitsi tab ja rivinvaihto
-T näytä tab-merkit muodossa ^I
-t sama kuin -vT
-E näytä rivinvaihdot $:llä
-e sama kuin vE
-A sama kuin -vET
Esimerkki: Kerberos ei toimi
Jos Kerberos-autentikointi (pam) ei toimi, yleisimmät syyt ovat
/etc/krb5.conf virheellinen (väärä realm tms)
palomuuri blokkaa portin 88
kello on pielessä (Onko ntpd/chronyd asennettuna? Blokkaako palomuuri sen?)
käyttäjätunnus puuttuu /etc/passwd:stä (tai Kerberoksesta tai LDAPista tai NISistä tms)
Esimerkki: Kerberos ei toimi
Omia (tai muiden ylläpitäjien) tumpelointeja epäillessä voi tutkia mitä on tehty:
history # komentohistoriaa voi selata myös nuolinäppäimillä
Esimerkki: Kerberos ei toimi
Autentikointiongelmista tulee yleensä virheilmoitus /var/log/auth.log'iin. Kerran sieltä löytyi tällainen viesti:
sshd[1472]: pam_krb5(sshd:auth): (user tt) mkstemp("/tmp/krb5cc_pam_o2YOkN") failed: No such file or directory
Jos mkstemp valittaa ”No such file or directory”, se tarkoittaa että hakemistoa, jonka alle se yrittää tilapäistä tiedostoa luoda, ei ole - ja tässä tapauksessa todellakin /tmp oli kadonnut. Syyksi osoittautui se yleisin eli ”operator error”, samasta lokitiedostosta löytyi myös tällainen:
xx3 sudo: xx0 : TTY=pts/0 ; PWD=/ ; USER=root ; COMMAND=/bin/rm -r -f /tmp/
(name changed to protect the guilty)
sudo mkdir /tmp; sudo chmod 1777 /tmp # tai chmod o=rwxt,ug=rwx /tmp
IP-osoitteiden väärentäjien ja verkkosotkujen varalta kannattaa blokata ulkopuolelta tulevat privaatti- yms osoitteet, joita ei tiedetä omiksi tai muuten tarpeellisiksi:
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP
iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 239.255.255.0/24 -j DROP
Fragmentit ovat nykyisin vain hyökkäyksiä
iptables -A INPUT -f -j DROP
NEW-paketit joissa ei ole SYN-bitti päällä
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
”Joulupaketit” (kaikki tcp-liput yhtaikaa päällä)
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
Rikkinäiset NULL-paketit (ei mitään tcp-lippua päällä)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP